При выполнении запроса с 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 шт):
Посмотрим, о чём говорится в ошибке:
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