Oracle “如何修复”;警告:函数创建时出现编译错误“;?

Oracle “如何修复”;警告:函数创建时出现编译错误“;?,oracle,plsql,Oracle,Plsql,有两张桌子 客户2(CUSTID,姓名、地址、年龄、工资) 订单2(ORDERID,订单名称,价格,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 cu

有两张桌子

客户2(CUSTID,姓名、地址、年龄、工资)

订单2(ORDERID,订单名称,价格,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;
/
我收到此错误
警告:函数是用编译错误创建的。

当我调用函数时,这个

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
在你的职能中:

DECLARE
p VARCHAR2(100);
BEGIN
p:= &p;
dbms_output.put_line (totalCustomer (p));
END;
/
  • 您在查询中写入了
    cusid
    ,但表中的列名为
    custid
  • 您不会将查询结果放入变量
    total
    。您的函数将始终返回为
    total
    设置的初始值
    0
  • 通过编写
    'add'
    将地址与文本字符串“add”进行比较,而不是将变量
    add
    的内容进行比较
  • 但是没有必要将
    loc
    复制到
    add
    。您可以直接使用
    loc
  • total
    number(2)
    类型似乎有点小。最好使用
    数字(38)
    整数
  • 使用内部联接编写查询更好<带有子查询的中的code>通常执行得不好
  • loc
    的类型应该是
    customer2
    中的
    地址类型,而不是
    char
    。您可以在此处使用
    customer2.地址%TYPE

在你的匿名区:

  • 您将
    p
    声明为
    char
    ,这意味着
    char(1)
    ,即
    p
    只能包含一个字符。我不确定这是你想要的。您也可以使用
    customer2。地址%TYPE


与您的错误无关,但是:永远不要使用系统帐户创建您自己的表、函数、过程或其他东西。不要那样做。创建一个普通用户并在那里创建您自己的对象。系统和系统帐户不适用于正常工作。在编译函数时,您是否使用任何工具向您显示错误?您也可以在以后使用
select*from user\u errors
获取它们。请牢记Oracle文档的价值。您应该学习如何修复语法错误和拼写错误。修复“警告:使用编译错误创建的函数”的方法是查看错误并更正它们。这在任何计算机语言中都是一样的。很好。无论如何,为了可读性,我更喜欢原始的
IN
子句方法,而不是join方法。@ThorstenKettner:“Plus
address='add')
”——是的,我也想到了这个,但忘了写它。谢谢你的提醒!
DECLARE
  p customer2.address%TYPE;
BEGIN
  p := &p;
  dbms_output.put_line(totalcustomer(p));
END;
/