oracle PLS-00306:调用过程中的参数数量或类型错误

q0qdq0h2  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(235)

下面的SQL导致Oracle 11 g错误:但在我看来,我的print过程需要1个varchar 2参数,而这正是我作为参数传递给它的。

CREATE TABLE employees (full_name VARCHAR2(64))
//

INSERT INTO employees (full_name) VALUES ('John')
//

INSERT INTO employees (full_name) VALUES ('Paul')
//

INSERT INTO employees (full_name) VALUES ('George')
//

INSERT INTO employees (full_name) VALUES ('Ringo')
//

CREATE OR REPLACE PROCEDURE print (
  v_string IN VARCHAR2
) IS
BEGIN
  dbms_output.put_line(v_string);
END print;
//

DECLARE
  v_string VARCHAR2(64);
BEGIN
    FOR v_string IN (SELECT DISTINCT full_name
                            FROM  employees) LOOP
        print (v_string);
    END LOOP;
END;
//

我可以在SQLFiddle中重现这个问题:http://sqlfiddle.com/#!4/c0e80e/6
我错过了什么?
谢谢

bq9c1y66

bq9c1y661#

没错你做错了应该是

SQL> BEGIN
  2      FOR v_string IN (SELECT DISTINCT full_name
  3                              FROM  employees) LOOP
  4          p_print (v_string.full_name);
  5      END LOOP;
  6  END;
  7  /
John
Paul
George
Ringo

PL/SQL procedure successfully completed.

SQL>

为什么?因为你声明了局部变量并使用了游标FOR循环(其记录与局部变量同名)。传递给print过程的是游标变量,而不是局部变量。
正如文档所述:
游标FOR LOOP语句将其循环索引隐式声明为指定游标返回的行类型的记录变量,然后打开游标。
for record in ...,其中record表示
游标FOR LOOP语句隐式声明为游标或select_statement返回类型的%ROWTYPE记录变量的循环索引的名称。

相关问题