извлечение данных таблицы в таблицу с помощью курсора - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть таблица с именем телефонная книга, и она имеет два столбца (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 Ответ

0 голосов
/ 06 декабря 2018

Не 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...