курсор не компилируется в Oracle - PullRequest
0 голосов
/ 06 октября 2019

У меня есть таблица city, в которой есть два столбца 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

1 Ответ

1 голос
/ 06 октября 2019

Ваш курсор возвращает два столбца, поэтому в предложении 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;
/

-OR-

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;
/

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...