U moet in . selecteren iets. Als u dat niet doet, moet u de query wordt niet eens uitgevoerd (hoewel het geparseerd is).
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;
/
Maar, in willekeurige volgorde:(a) u moet bindvariabelen gebruiken in plaats van de letterlijke waarde 1 in te bedden in de dynamische instructie; (b) dit hoeft helemaal niet dynamisch te zijn; en (c) de beller kan de door de query geretourneerde waarden toch niet zien - tenzij u selecteert in OUT
argumenten in plaats daarvan, of toon ze met dbms_output()
(hoewel dat eigenlijk alleen zou moeten worden gebruikt voor debuggen, omdat je niet kunt bepalen of de client het zal laten zien).
Dus je zou kunnen doen:
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;
/
of
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;
/
en laat uw beller zijn eigen variabelenamen doorgeven om te vullen, en doe er vervolgens mee wat nodig is. De beller geeft meestal ook de ID door die u zoekt, dus u heeft de 1 niet hard gecodeerd.
Het lijkt er echter op dat een procedure hier niet echt het beste mechanisme voor is.
Gebruik ook een select ... into
(statisch of dynamisch) zal een foutmelding geven als de query nul rijen of meer dan één rij retourneert. Het werkt alleen als er precies één rij wordt geretourneerd. Een cursor kan een willekeurig aantal rijen verwerken - maar tenzij u alleen de resultaten afdrukt (zoals @Jayanth laat zien), moet u de cursor in plaats daarvan teruggeven aan de beller. Je zou een bulk collect into
een verzameling, maar daar moet je toch iets mee doen.