首页 > 解决方案 > 在 oracle 中没有成功编译游标

问题描述

我有表城市,它有两列 city_id 和 city_name。

所以,我声明了 plsql 块来查看这个表的输出。在这里,我尝试的是:

set serveroutput on
DECLARE 
    CURSOR CUR_NAME_LIST IS
    SELECT * FROM OT.CITY;

    V_NAME VARCHAR2(20);

BEGIN
    OPEN CUR_NAME_LIST;
    LOOP
    FETCH CUR_NAME_LIST INTO V_NAME;
    DBMS_OUTPUT.PUT_LINE(V_NAME.CITY_ID);
    EXIT WHEN CUR_NAME_LIST%NOTFOUND;
    END LOOP;
    CLOSE CUR_NAME_LIST;

END;
/

当我编译时,我得到的错误是:

ORA-06550: line 11, column 33:
PLS-00487: Invalid reference to variable 'V_NAME'
ORA-06550: line 11, column 5:
PL/SQL: Statement ignored

标签: databaseoracleplsqloracle11g

解决方案


您的光标返回两列,因此在INTO子句中必须有两个变量或一个具有两列的类型变量。

在您的情况下,为 id 再定义一个变量并在INTO子句中使用它。或者使用类型变量city%rowtype来处理所有数据。

如下所示:

set serveroutput on
DECLARE 
    CURSOR CUR_NAME_LIST IS
    SELECT * FROM OT.CITY;

    V_CITY CITY%ROWTYPE;

BEGIN
    OPEN CUR_NAME_LIST;
    LOOP
    FETCH CUR_NAME_LIST INTO V_CITY;
    DBMS_OUTPUT.PUT_LINE(V_CITY.ID || ' - ' || V_CITY.NAME );
    EXIT WHEN CUR_NAME_LIST%NOTFOUND;
    END LOOP;
    CLOSE CUR_NAME_LIST;

END;
/

-或者-

set serveroutput on
DECLARE 
    CURSOR CUR_NAME_LIST IS
    SELECT ID, NAME FROM OT.CITY;

    V_NAME VARCHAR2(20);
    V_ID NUMBER;

BEGIN
    OPEN CUR_NAME_LIST;
    LOOP
    FETCH CUR_NAME_LIST INTO V_ID, V_NAME;
    DBMS_OUTPUT.PUT_LINE(V_ID || ' - ' || V_NAME );
    EXIT WHEN CUR_NAME_LIST%NOTFOUND;
    END LOOP;
    CLOSE CUR_NAME_LIST;

END;
/

干杯!!


推荐阅读