Выполнение немедленного выбора не возвращает значений - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть оператор выбора

select name, surname
from student
where id_student = 1;

Возвращает

name surname
Bob Smith

Я хочу создать процедуру с тем же оператором выбора, используя немедленный запуск:

create or replace procedure select_procedure
as
begin
execute immediate
'select name, surname
from student
where id_student = 1';
end;
/
exec select_procedure;

Когда эта процедура выполняется, она показывает, что процедура PL / SQL успешно завершена.Как мне получить результат?(установлен выход сервера включен)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы должны выбрать в что-то.Если вы этого не сделаете, то запрос даже не выполняется (хотя он анализируется).

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  execute immediate
  'select name, surname
  from student
  where id_student = 1'
  into l_name, l_surname;
end;
/

Но, в произвольном порядке: (a) вы должны использовать переменные связываниявместо литерального значения 1, встроенного в динамический оператор;(б) это не должно быть динамическим вообще;и (c) вызывающий не сможет увидеть значения, возвращаемые запросом, в любом случае - если вы не выберете вместо него OUT аргументы или не отобразите их с помощью dbms_output() (хотя на самом деле это следует использовать только для отладки, когда выне может контролировать, будет ли это показывать клиент)имена переменных для заполнения, а затем делать с ними все, что нужно.Обычно вызывающий абонент также передает искомый вами ID, поэтому у вас нет жестко запрограммированной цифры 1.

Хотя процедура не является действительно лучшим механизмом для этого.

Кроме того, использование select ... into (статического или динамического) приведет к ошибке, если запрос вернет ноль или более одной строки.Это будет работать только в том случае, если вернется ровно одна строка.Курсор будет обрабатывать любое количество строк - но если вы просто не печатаете результаты (как показывает @Jayanth), вам нужно вместо этого передать курсор обратно вызывающей стороне.Вместо этого вы можете создать bulk collect into коллекцию, но вам все равно придется что-то делать с этим.

0 голосов
/ 20 февраля 2019

Вы должны написать курсор для этого. Пожалуйста, найдите ниже синтаксис для того же.

Синтаксис:

create or replace procedure select_procedure
as
CURSOR <cursor_name> IS <SELECT statement without semicolon>;
BEGIN
  FOR record IN <cursor_name>
  LOOP
  Dbms_output.put_line(‘Record Fetched:‘||record.name);
  Dbms_output.put_line(‘Record Fetched:‘||record.surname);
  END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...