Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Sofortige Auswahl ausführen gibt keine Werte zurück

Sie müssen in auswählen etwas. Wenn nicht, dann die Abfrage wird nicht einmal ausgeführt (obwohl es geparst wird).

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;
/

Aber in keiner bestimmten Reihenfolge:(a) Sie sollten Bind-Variablen verwenden, anstatt den Literalwert 1 in die dynamische Anweisung einzubetten; (b) dies muss überhaupt nicht dynamisch sein; und (c) der Aufrufer kann die von der Abfrage zurückgegebenen Werte sowieso nicht sehen – es sei denn, Sie wählen OUT aus stattdessen Argumente oder zeigen Sie sie mit dbms_output() an (obwohl das wirklich nur zum Debuggen verwendet werden sollte, da Sie nicht kontrollieren können, ob der Client es anzeigt).

Sie könnten also Folgendes tun:

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;
/

oder

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;
/

und lassen Sie Ihren Aufrufer seine eigenen Variablennamen zum Auffüllen übergeben und tun Sie dann, was immer er mit diesen benötigt. Der Anrufer würde normalerweise auch die gesuchte ID weitergeben, sodass Sie die 1 nicht fest codiert haben.

Es scheint jedoch nicht so, als ob eine Prozedur wirklich der beste Mechanismus dafür ist.

Verwenden Sie auch ein select ... into (statisch oder dynamisch) gibt einen Fehler aus, wenn die Abfrage null Zeilen oder mehr als eine Zeile zurückgibt. Es funktioniert nur, wenn genau eine Zeile zurückgegeben wird. Ein Cursor würde eine beliebige Anzahl von Zeilen verarbeiten - aber wenn Sie nicht nur die Ergebnisse drucken (wie @Jayanth zeigt), müssen Sie den Cursor stattdessen an den Aufrufer zurückgeben. Sie könnten eine bulk collect into durchführen stattdessen eine Sammlung, aber damit müssen Sie noch etwas anfangen.