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....
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
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;
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;
ne sont pas définies, mais déclarées.
c'est un duplicata possible de déclarer des variables dans un bloc pl/sql
mais vous pouvez regarder ici:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm
mise à jour:
Consultez ici : Comment retourner un jeu de résultats / curseur à partir d'un Oracle PL/SQL anonyme bloc qui exécute SQL Dynamique?