我需要在Oracle中使用绑定来克服一种迂回的做事方式。我理解这样做的方式。但是当我在我的程序中使用它时,它给了我一个错误。
我的代码是:
CREATE OR REPLACE PROCEDURE FREQUENCY
IS
VISITOR CUSTOMER%ROWTYPE;
TYPE FREQ IS VARRAY(4) OF NUMBER(4);
CURSOR CUSTOMERS IS
SELECT * FROM CUSTOMER;
FREQUENT FREQ:=(0,0,0,0);
BEGIN
OPEN CUSTOMER;
LOOP
FETCH CUSTOMERS INTO VISITOR;
EXIT WHEN CUSTOMERS%NOTFOUND;
FREQUENT(VISITOR.BRANCHID):=FREQUENT(VISITOR.BRANCHID)+1;
END LOOP;
END;
当我在VISITOR.BRANCHID变量之前使用冒号时,我收到错误Bad Bind Variable VISITOR
,如果我不使用冒号,则会收到错误Wrong Expression Type
。
我可能做错了什么? BranchId是一个整数。
答案 0 :(得分:1)
此代码的完整错误堆栈是:
7/16 PLS-00382: expression is of wrong type
7/10 PL/SQL: Item ignored
10/7 PLS-00456: item 'CUSTOMER' is not a cursor
10/2 PL/SQL: SQL Statement ignored
14/3 PLS-00320: the declaration of the type of this expression is incomplete or malformed
14/3 PL/SQL: Statement ignored
你有两个错误。 OPEN
使用了错误的名称,它应该是OPEN CUSTOMERS
,而不是OPEN CUSTOMER
。正如PLS-00320所暗示的那样,PLS-00382来自声明。你错过了这种类型;而不是:
FREQUENT FREQ:=(0,0,0,0);
你应该:
FREQUENT FREQ:=FREQ(0,0,0,0);
假设您的customer
表格带有branchid
列,那么您的流程会进行这两项更改。
这与绑定变量无关。如果您引用了:VISITOR.BRANCHID
,那么您将尝试引用名为VISITOR
的绑定变量,但您没有(因此您获得PLS-00049);而且你不需要这个代码。我认为你在这里混淆了术语和语法。
答案 1 :(得分:1)
"错误的表达类型"错误是指这一行:
FREQUENT FREQ:=(0,0,0,0);
应该是:
FREQUENT FREQ:=FREQ(0,0,0,0);
(您使用什么工具来运行不显示行号或所有消息的工具?)