Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exécuter la sélection immédiate ne renvoie aucune valeur

Vous devez sélectionner dans quelque chose. Si ce n'est pas le cas, la requête n'est même pas exécuté (bien qu'il soit analysé).

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

Mais, sans ordre particulier :(a) vous devez utiliser des variables liées au lieu d'avoir la valeur littérale 1 intégrée dans l'instruction dynamique; (b) cela n'a pas du tout besoin d'être dynamique; et (c) l'appelant ne pourra de toute façon pas voir les valeurs renvoyées par la requête - à moins que vous ne sélectionniez dans OUT arguments à la place, ou affichez-les avec dbms_output() (bien que cela ne devrait vraiment être utilisé que pour le débogage car vous ne pouvez pas contrôler si le client l'affichera).

Vous pourriez donc :

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

ou

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

et demandez à votre appelant de passer ses propres noms de variables à remplir, puis faites ce dont il a besoin avec ceux-ci. L'appelant transmettra généralement également l'ID que vous recherchez, de sorte que vous n'ayez pas le 1 codé en dur.

Cependant, il ne semble pas qu'une procédure soit vraiment le meilleur mécanisme pour cela.

Aussi, en utilisant un select ... into (statique ou dynamique) générera une erreur si la requête renvoie zéro ligne ou plusieurs lignes. Cela ne fonctionnera que s'il y a exactement une ligne renvoyée. Un curseur gérerait n'importe quel nombre de lignes - mais à moins que vous n'imprimiez simplement les résultats (comme le montre @Jayanth), vous devez plutôt renvoyer le curseur à l'appelant. Vous pouvez faire une bulk collect into une collection à la place, mais vous devez quand même faire quelque chose avec ça.