Oracle Pl / SQL中的绑定变量

时间:2014-04-17 12:18:05

标签: sql oracle

我需要在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是一个整数。

2 个答案:

答案 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);

(您使用什么工具来运行不显示行号或所有消息的工具?)