如何解决“警告:函数创建时出现编译错误”?

时间:2019-04-21 07:28:52

标签: oracle plsql

有两个表

  

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

1 个答案:

答案 0 :(得分:4)

在您的职能中:

  • 您在查询中写了cusid,但表中的列名为custid
  • 您不要将查询结果放入变量total中。您的函数将始终返回0您为total设置的初始值。
  • 通过写'add',您将地址与文字字符串“ add”进行了比较,而不是变量add的内容。
  • 但是不需要将loc复制到add。您可以直接使用loc
  • number(2)的{​​{1}}的类型似乎很小。最好改用totalnumber(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