Вы должны выбрать в что-то.Если вы этого не сделаете, то запрос даже не выполняется (хотя он анализируется).
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
коллекцию, но вам все равно придется что-то делать с этим.