【问题标题】:Looping cursor throws error that cursor is not defined循环游标抛出未定义游标的错误
【发布时间】:2020-08-02 03:51:17
【问题描述】:

我想循环存储过程的结果。我的代码:

set serveroutput on
VAR c_curs refcursor;

EXECUTE pck_prov.get_value_type_list(1, :c_curs);


BEGIN
    FOR record_test IN c_curs LOOP
        dbms_output.put_line(record_test.id);
    END LOOP;
END;

我不明白为什么会抛出 c_curs 必须声明的错误:

从第 7 行开始的错误命令 - BEGIN

FOR record_test IN c_curs LOOP

    dbms_output.put_line(record_test.id);

END LOOP; 

结束;
错误报告 -

ORA-06550:第 2 行,第 24 列:

PLS-00201:必须声明标识符“C_CURS”

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    游标可以在 PL/SQL 块中引用如下:

    set serveroutput on    
    DECLARE
      c_curs    SYS_REFCURSOR;
      v_id      NUMBER;
    BEGIN
    
      pck_prov.get_value_type_list (1, c_curs); --> procedure called here
    
      LOOP 
        FETCH c_curs
        INTO  v_id;
        EXIT WHEN c_curs%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_id);
      END LOOP;
      CLOSE c_curs;
    END;
    /
    

    【讨论】:

    • ORA-06504:PL/SQL:结果集变量或查询的返回类型不匹配 - 我猜这是因为表中有几列并且游标被提取到数字中。跨度>
    • 您的解决方案运行良好,我唯一需要添加的是此行中的列数:INTO v_id,名称。因此,列数现在与返回的列数匹配。非常感谢您的回答。
    • 你知道如何根据光标创建​​行吗?
    • @FrenkyB 对了,游标输出的返回类型和列数应该和INTO子句中的变量匹配。
    • @FrenkyB 我认为你不需要这样做。你只需要显示结果。我看到你发布了另一个问题,所以我已经在那里回复了。
    【解决方案2】:

    c_curs 是绑定变量,不是 PL/SQL 定义的变量。要在 PL/SQL 块中使用它,您需要在其前面加上冒号 : 以表明您正在使用绑定变量(就像您在 EXECUTE 语句中所做的那样):

    set serveroutput on
    VAR c_curs refcursor;
    
    EXECUTE pck_prov.get_value_type_list(1, :c_curs);
    
    
    BEGIN
        FOR record_test IN :c_curs LOOP
            dbms_output.put_line(record_test.id);
        END LOOP;
    END;
    

    【讨论】:

    • 感谢您的回答。您的解决方案会更好,因为它会排成一行。但我有错误 PLS-00456:项目 'SQLDEVBIND1Z_1' 不是游标。相同的代码是否适合您?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多