有两个表
Customer2( CUSTID ,NAME,ADDRESS,AGE,SALARY)
Order2( ORDERID ,ORDERNAME,PRICE, CUSTID )
主要问题是要从该位置查找客户的订单总数
这是我写的plsql函数:
CREATE OR REPLACE FUNCTION totalCustomer (loc IN VARCHAR2) RETURN NUMBER IS
total number(2) := 0;
add CHAR := loc;
BEGIN
SELECT COUNT(*) FROM order2 WHERE cusid IN (SELECT cusid FROM customer2 WHERE address='add');
RETURN total;
END;
/
这是我调用函数的地方:
DECLARE
p VARCHAR2(100);
BEGIN
p:= &p;
dbms_output.put_line (totalCustomer (p));
END;
/
我收到此错误Warning: Function created with compilation errors.
还有我正在调用该函数的那个
ERROR at line 5:
ORA-06550: line 5, column 23:
PLS-00905: object SYSTEM.TOTALCUSTOMER is invalid
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored
答案 0 :(得分:4)
在您的职能中:
cusid
,但表中的列名为custid
。total
中。您的函数将始终返回0
您为total
设置的初始值。'add'
,您将地址与文字字符串“ add”进行了比较,而不是变量add
的内容。loc
复制到add
。您可以直接使用loc
。number(2)
的{{1}}的类型似乎很小。最好改用total
(number(38)
)。integer
带有子查询的效果通常不佳。IN
的类型应该不是char
的类型,而应该是loc
中的address
的类型。您可以在此处使用customer2
。
customer2.address%TYPE
在您的匿名屏蔽中:
CREATE OR REPLACE FUNCTION totalcustomer (loc IN customer2.address%TYPE)
RETURN number
IS
total number(38) := 0;
BEGIN
SELECT count(*) INTO total
FROM order2 o
INNER JOIN customer2 c
ON c.custid = o.custid
WHERE address = loc;
RETURN total;
END;
/
声明为p
,这意味着char
,即char(1)
只能容纳一个字符。我不确定这是您想要的。您也可以在这里使用p
。
customer2.address%TYPE