Трябва да изберете в нещо. Ако не го направите, тогава заявката дори не се изпълнява (въпреки че е анализиран).
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()
(въпреки че това наистина трябва да се използва само за отстраняване на грешки, тъй като не можете да контролирате дали клиентът ще го покаже).
Така че можете да направите:
create or replace procedure select_procedure
as
l_name student.name%TYPE;
l_surname student.name%TYPE;
begin
select name, surname
into l_name, l_surname
from student
where id_student = 1;
dbms_output.put_line('name=' || l_name ||', surname=' || l_surname);
end;
/
или
create or replace procedure select_procedure (
p_name OUT student.name%TYPE,
p_surname OUT student.name%TYPE
)
as
begin
select name, surname
into p_name, p_surname
from student
where id_student = 1;
end;
/
и накарайте вашия повикващ да предаде свои собствени имена на променливи, които да попълни, и след това да направи каквото трябва с тях. Обаждащият се обикновено предава и идентификатора, който търсите, така че нямате 1 твърдо кодиран.
Въпреки това не изглежда, че процедурата наистина е най-добрият механизъм за това.
Освен това, използвайки select ... into
(статичен или динамичен) ще даде грешка, ако заявката върне нула реда или повече от един ред. Ще работи само ако има върнат точно един ред. Курсорът би обработил произволен брой редове - но освен ако просто не отпечатвате резултатите (както показва @Jayanth), вместо това трябва да предадете курсора обратно на повикващия. Можете да направите bulk collect into
вместо това колекция, но все пак трябва да направите нещо с това.