Musíte vybrat do něco. Pokud tak neučiníte, pak dotaz není ani provedeno (ačkoli je analyzován).
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 v žádném konkrétním pořadí:(a) měli byste použít proměnné vazby místo toho, abyste měli doslovnou hodnotu 1 vloženou do dynamického příkazu; (b) nemusí to být vůbec dynamické; a (c) volající stejně neuvidí hodnoty vrácené dotazem – pokud nezvolíte možnost OUT
argumenty nebo je zobrazte pomocí dbms_output()
(ačkoli by se to mělo skutečně používat pouze pro ladění, protože nemůžete ovlivnit, zda to klient zobrazí).
Takže můžete udělat:
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;
/
nebo
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;
/
a nechat volajícího předat své vlastní názvy proměnných, které se mají naplnit, a pak s nimi dělat, co potřebuje. Volající obvykle také předá ID, které hledáte, takže 1 nemáte pevně zakódované.
Nezdá se však, že by postup byl skutečně tím nejlepším mechanismem.
Také pomocí select ... into
(statické nebo dynamické) dojde k chybě, pokud dotaz vrátí nula řádků nebo více než jeden řádek. Bude fungovat pouze v případě, že je vrácen přesně jeden řádek. Kurzor by zvládl libovolný počet řádků – ale pokud zrovna netisknete výsledky (jak ukazuje @Jayanth), musíte místo toho předat kurzor zpět volajícímu. Můžete provést bulk collect into
místo toho sbírku, ale stále s tím musíte něco udělat.