Musisz wybrać do coś. Jeśli tego nie zrobisz, zapytanie nie jest nawet wykonywany (chociaż jest analizowany).
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;
/
Ale w żadnej szczególnej kolejności:(a) należy używać zmiennych bind zamiast osadzania wartości literału 1 w instrukcji dynamic; (b) to wcale nie musi być dynamiczne; oraz (c) wywołujący i tak nie będzie mógł zobaczyć wartości zwracanych przez zapytanie - chyba że wybierzesz OUT
zamiast tego argumenty lub wyświetl je za pomocą dbms_output()
(chociaż tak naprawdę powinno to być używane tylko do debugowania, ponieważ nie możesz kontrolować, czy klient to pokaże).
Możesz więc zrobić:
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;
/
lub
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;
/
i niech twój rozmówca przekaże własne nazwy zmiennych do wypełnienia, a następnie zrobi z nimi wszystko, czego potrzebuje. Dzwoniący zwykle przekazuje również identyfikator, którego szukasz, więc nie masz 1 zakodowanego na stałe.
Wydaje się jednak, że procedura nie jest najlepszym do tego mechanizmem.
Ponadto, używając select ... into
(statyczne lub dynamiczne) spowoduje błąd, jeśli zapytanie zwróci zero lub więcej niż jeden wiersz. Będzie działać tylko wtedy, gdy zostanie zwrócony dokładnie jeden wiersz. Kursor obsługiwałby dowolną liczbę wierszy - ale jeśli tylko nie drukujesz wyników (jak pokazuje @Jayanth), musisz zamiast tego przekazać kursor z powrotem do dzwoniącego. Możesz wykonać bulk collect into
zamiast tego kolekcja, ale nadal musisz coś z tym zrobić.