Извлечение данных таблицы в таблицу с помощью курсора

У меня есть таблица под названием телефонная книга, и она имеет две колонки (firstName, LastName), Я хочу создать таблицу индекса lastName по firstName с помощью курсора, и я написал этот код:

CREATE OR REPLACE PROCEDURE proc1 AS
    TYPE tableNames IS TABLE OF VARCHAR2(20) INDEX BY VARCHAR(20);
    v1 tableNames;
    v_firstName PHONEBOOK.FIRSTNAME%TYPE;
    v_lastName PHONEBOOK.LASTNAME%TYPE;
    CURSOR c_name IS SELECT FIRSTNAME, LASTNAME FROM PHONEBOOK;
BEGIN
    OPEN c_name;
    LOOP
        FETCH c_name INTO v_firstName, v_lastName;
        EXIT WHEN c_name%NOTFOUND;
        v1(v_firstName) := v_lastName;
    END LOOP;

    FOR idx IN v1.FIRST..v1.LAST 
    LOOP
        DBMS_OUTPUT.PUT_LINE (v1(idx));
    END LOOP;

    CLOSE c_name;
END;
/

Он был успешно скомпилирован. Когда я запускаю эту процедуру, она должна напечатать lastNames, которые хранятся в tableNames, но выдает ошибку:

ORA-06502 "PL / SQL: ошибка числа или значения"
Причина: Произошла арифметическая, числовая, строковая ошибка, ошибка преобразования или ограничения. Например, эта ошибка возникает, если предпринята попытка присвоить значение NULL переменной, объявленной NOT NULL, или если предпринята попытка присвоить целое число больше 99 переменной, объявленной NUMBER(2).
Действие: Измените данные, как они обрабатываются или как они объявляются, чтобы значения не нарушали ограничений.

Пожалуйста, помогите мне решить эту проблему

1 ответ

Решение

Не FOR, но WHILE, Также я использовал курсор FOR цикл в качестве источника; легче писать и поддерживать.

SQL> create table phonebook (firstname varchar2(10), lastname varchar2(10));

Table created.

SQL> insert into phonebook
  2    select 'Little', 'Foot'    from dual union all
  3    select 'Mc'    , 'Donalds' from dual;

2 rows created.

SQL> create or replace procedure proc1 as
  2    type tablenames is table of varchar2(10) index by varchar2(10);
  3    v1 tablenames;
  4    idx varchar2(10);
  5  begin
  6    for cur_r in (select firstname, lastname
  7                  from phonebook
  8                 )
  9    loop
 10      v1(cur_r.firstname) := cur_r.lastname;
 11    end loop;
 12
 13    idx := v1.first;
 14    while idx is not null loop
 15      dbms_output.put_line(v1(idx));
 16      idx := v1.next(idx);
 17    end loop;
 18  end;
 19  /

Procedure created.

SQL> exec proc1;
Foot
Donalds

PL/SQL procedure successfully completed.

SQL>
Другие вопросы по тегам