Comment puis-je déclarer et utiliser des variables dans PL/SQL comme je le fais dans T-SQL?

dans Sql Server, souvent quand je teste le corps d'une procédure stockée, je copie le corps dans SSMS, déclare les variables en haut de la page, les fixe à certaines valeurs d'échantillon, et exécute le corps tel quel.

par exemple, si mon proc est

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

alors mon test sql serait

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

qu'est-ce que le PL/SQL Oracle équivalent à ceci?

avec, mais je reçois "PLS-00428: une clause dans est attendue dans cette déclaration SELECT "

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     select myname from DUAL;
END;

C'est un meilleur exemple de ce que j'essaie vraiment de faire:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     SELECT *
     FROM   Customers
     WHERE  Name = myname;
END;

mais encore une fois, il veut un "dans" quand vraiment je veux juste les enregistrements imprimés sur l'écran, pas stockés dans une autre table....

résolu:

grâce à @Allan, ça marche assez bien. Oracle SQL Developer apparement mémorise les valeurs de paramètre que vous fournir avec. PL / SQL Developer, cependant, ne veut rien à voir avec cela....

enter image description here

si vous "exécutez en tant que Script", il respectera vos valeurs par défaut, mais il ne retournera les résultats qu'en texte ASCI, pas dans une grille / feuille de calcul

enter image description here

23
demandé sur Tom Halladay 2012-06-04 22:48:15

3 réponses

Réponse Révisée

si vous n'appelez pas ce code à partir d'un autre programme, une option est de sauter PL / SQL et de le faire strictement en SQL en utilisant les variables bind:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

dans de nombreux outils (tels que Toad et SQL Developer), en omettant les déclarations var et exec , le programme vous demandera la valeur.


Réponse Originale

une grande différence entre T-SQL et PL/SQL est Qu'Oracle ne vous laisse pas retourner implicitement le résultat d'une requête. Le résultat doit toujours être explicitement renvoyé d'une certaine façon. La manière la plus simple est d'utiliser DBMS_OUTPUT (à peu près équivalent à print ) pour afficher la variable:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

Ce n'est pas très utile si vous essayez de retourner un résultat, cependant. Dans ce cas, vous voulez retourner un collection ou d'un refcursor. Cependant, l'utilisation de l'une ou l'autre de ces solutions nécessiterait d'envelopper votre code dans une fonction ou une procédure et d'exécuter la fonction/procédure à partir de quelque chose qui est capable de consommer les résultats. Une fonction qui fonctionnait de cette façon pourrait ressembler à quelque chose comme ceci:

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;
18
répondu Allan 2013-08-12 16:12:01

dans Oracle PL / SQL, si vous exécutez une requête qui peut retourner plusieurs lignes, vous avez besoin d'un curseur pour itérer au-dessus des résultats. La manière la plus simple est d'utiliser une boucle for, par exemple:

declare
  myname varchar2(20) := 'tom';
begin
  for result_cursor in (select * from mytable where first_name = myname) loop
    dbms_output.put_line(result_cursor.first_name);
    dbms_output.put_line(result_cursor.other_field);
  end loop;
end;

si vous avez une requête qui retourne exactement une ligne, alors vous pouvez utiliser la syntaxe select...into... , par exemple:

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
4
répondu GriffeyDog 2012-06-04 20:26:53