При выполнении запроса с EXECUTE IMMEDIATE ошибка: ORA-01422: exact fetch returns more than requested number of rows

declare
    res varchar2(200);
    tabnam varchar2(200) := 'DWH_gate.T$TERMINAL';
    colnum int := 3;
    colnam varchar2 (32) := 'ID_AGENT';
begin
    EXECUTE IMMEDIATE 'select '||colnam||' from DWH_gate.T$TERMINAL' into res;
    dbms_output.put_line (res);
end;

Этот запрос выдает ошибку. Я так понимаю, что ошибка в том, что выводится не одна строка, а несколько, и скорее всего нужен курсор. Но сколько не пытался, все равно ошибка появляется.

Или есть немного измененный запрос:

declare
    res varchar2(200);
    tabnam varchar2(200) := 'DWH_gate.T$TERMINAL';
    colnum int := 3;
    colnam varchar2 (32) := 'ID_AGENT';
begin
    res := 'select '||colnam||' from DWH_gate.T$TERMINAL';
    EXECUTE IMMEDIATE res;
    dbms_output.put_line (res);
end;

Но в нем выводится просто select ID_AGENT from DWH_gate.T$TERMINAL.

Как сделать, чтобы получить результат запроса?


Ответы (1 шт):

Автор решения: 0xdb

Посмотрим, о чём говорится в ошибке:

declare
    res varchar2(200);
    tabnam varchar2(200) := 'hr.employees';
    colnam varchar2 (32) := 'last_name';
begin
    EXECUTE IMMEDIATE 'select '||colnam||' from '||tabnam into res;
    dbms_output.put_line (res);
end;
/
ORA-01422: exact fetch returns more than requested number of rows

"Вы хотели получить одну запись, но в результате же их много"
Или жизненый пример, нельзя посадить в машину всех 20 желаюших поехать, в ней всего пять мест. В жизни обычно это удаётся, но в примере выше - нет.

Надо предусмотреть, что записей будет много, или другими словами - поместить их в коллекцию. Например (на db<>fiddle):

declare
    type restype is table of varchar2 (64);
    res restype; 
    tabnam varchar2 (64) := 'hr.employees';
    colnam varchar2 (32) := 'last_name';
begin
    EXECUTE IMMEDIATE 'select '||colnam||' from '||tabnam bulk collect into res;
    for i in 1..res.count loop
        dbms_output.put_line (res(i)); end loop;
end;
/

Abel
Ande
[...]
Zlotkey
→ Ссылка