Du måste välja in något. Om du inte gör det gör du frågan körs inte ens (även om det är tolkat).
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, i ingen speciell ordning:(a) du bör använda bindningsvariabler istället för att ha det bokstavliga värdet 1 inbäddat i den dynamiska satsen; (b) detta behöver inte alls vara dynamiskt; och (c) den som ringer kommer inte att kunna se värdena som returneras av frågan hur som helst - om du inte väljer OUT
argument istället, eller visa dem med dbms_output()
(även om det egentligen bara ska användas för felsökning eftersom du inte kan kontrollera om klienten ska visa det).
Så du kan göra:
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;
/
och låt din uppringare skicka in sina egna variabelnamn för att fylla i, och gör sedan vad den behöver med dessa. Den som ringer skickar vanligtvis också in det ID du letar efter, så att du inte har 1:an hårdkodad.
Det verkar dock inte som om en procedur verkligen är den bästa mekanismen för detta.
Använd också en select ... into
(statisk eller dynamisk) kommer att felas om frågan returnerar noll rader eller mer än en rad. Det fungerar bara om det finns exakt en rad som returneras. En markör skulle hantera hur många rader som helst - men om du inte bara skriver ut resultaten (som @Jayanth visar) måste du skicka tillbaka markören till den som ringer istället. Du kan göra en bulk collect into
en samling istället, men det måste du ändå göra något åt.