Du skal vælge til noget. Hvis du ikke gør det, så forespørgslen er ikke engang udført (selvom det er parset).
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;
/
Men uden bestemt rækkefølge:(a) du bør bruge bindevariabler i stedet for at have den bogstavelige værdi 1 indlejret i den dynamiske sætning; (b) dette behøver slet ikke at være dynamisk; og (c) den, der ringer, vil alligevel ikke være i stand til at se værdierne returneret af forespørgslen - medmindre du vælger OUT
argumenter i stedet for, eller vis dem med dbms_output()
(selvom det egentlig kun skal bruges til fejlretning, da du ikke kan kontrollere, om klienten vil vise det).
Så du kunne gøre:
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;
/
eller
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;
/
og få din opkalder til at sende sine egne variabelnavne til at udfylde, og derefter gøre, hvad den har brug for med dem. Den, der ringer op, vil normalt også indgive det ID, du leder efter, så du ikke har 1'et hårdtkodet.
Det ser dog ikke ud til, at en procedure virkelig er den bedste mekanisme til dette.
Brug også en select ... into
(statisk eller dynamisk) vil fejle, hvis forespørgslen returnerer nul rækker eller mere end én række. Det vil kun virke, hvis der er præcis én række returneret. En markør ville håndtere et hvilket som helst antal rækker - men medmindre du bare udskriver resultaterne (som @Jayanth viser), skal du i stedet sende markøren tilbage til den, der ringer. Du kunne foretage en bulk collect into
en samling i stedet for, men det skal du stadig gøre noget ved.