127 votes

Comment utiliser les variables dans Oracle SQL Developer ?

Vous trouverez ci-dessous un exemple d'utilisation des variables dans SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Je veux faire exactement la même chose dans Oracle en utilisant SQL Developer sans complexité supplémentaire. Cela semble être une chose très simple à faire, mais je n'arrive pas à trouver une solution simple. Comment puis-je le faire ?

0 votes

Comme une procédure stockée ou comme un script ? Si vous codez en dur la valeur de EmpIDVar, pourquoi utiliser une variable ?

103voto

Omphaloskopie Points 645

J'utilise le SQL-Developer dans la version 3.2. Les autres outils n'ont pas fonctionné pour moi, mais celui-ci a fonctionné :

define value1 = 'sysdate'

SELECT &&value1 from dual;

C'est aussi le moyen le plus astucieux présenté ici, pour l'instant.

(Si vous omettez la partie "define", vous serez invité à saisir cette valeur).

15 votes

Si vous comparez &&valeur1 à une chaîne de caractères comme : &&valeur1 = 'Une certaine chaîne de caractères', alors &&valeur1 doit être placée entre guillemets simples comme suit : &&valeur1' = 'Une certaine chaîne de caractères'.

1 votes

Dans SQL Developer, les variables de substitution définies par DEFINE semblent être persistantes entre les exécutions de requêtes. Si je change la valeur de la variable, mais que je ne mets pas explicitement en évidence la ligne DEFINE lors de l'exécution, la valeur précédente reste. (Est-ce à cause du double && ?)

9 votes

Cette page La section 2.4 explique la différence entre l'esperluette simple (&) et l'esperluette double (&&).

80voto

gavenkoa Points 6974

Il existe deux types de variables en SQL-plus : substitution et bind.

C'est substitution (les variables de substitution peuvent remplacer les options de commande SQL*Plus ou tout autre texte codé en dur) :

define a = 1;
select &a from dual;
undefine a;

C'est lier (Les variables de liaison stockent les valeurs des données pour les instructions SQL et PL/SQL exécutées dans le SGBDR ; elles peuvent contenir des valeurs uniques ou des ensembles de résultats complets) :

var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;

SQL Developer prend en charge les variables de substitution, mais lorsque vous exécutez une requête avec bind :var syntaxe, on vous demande la liaison (dans une boîte de dialogue).

Référence :

3 votes

J'ai essayé la liaison dans SQL Developer (4.1.1.19) et cela fonctionne aussi. Je veux dire le cas avec var x et exec :x pas d'invite.

53voto

Justin Cave Points 114578

En SQL*Plus, vous pouvez faire quelque chose de très similaire

SQL> variable v_emp_id number;
SQL> select 1234 into :v_emp_id from dual;

      1234
----------
      1234

SQL> select *
  2    from emp
  3   where empno = :v_emp_id;

no rows selected

Dans SQL Developer, si vous exécutez une instruction comportant un nombre quelconque de variables liées (préfixées par deux points), vous serez invité à saisir des valeurs. Comme le souligne Alex, vous pouvez également faire quelque chose de similaire en utilisant la fonction "Run script" (F5) avec la syntaxe EXEC alternative suggérée par Alex.

variable v_count number;
variable v_emp_id number;
exec :v_emp_id := 1234;
exec select count(1) into :v_count from emp;
select *
  from emp
 where empno = :v_emp_id
exec print :v_count;

14 votes

Si vous exécutez script (F5) au lieu de 'run statement', il n'y aura pas de demande pour les variables de liaison. Mais il ne semble pas aimer l'option select...into (ORA-01006), il faudrait donc faire exec :v_emp_id := 1234; à la place.

0 votes

@Alex - Bien ! J'ai juste abandonné et supposé que SQL Developer demandait toujours les valeurs des variables de liaison. J'ai intégré vos suggestions dans ma réponse.

1 votes

@Nathan si vous cherchez à exécuter un paquet avec :v_emp_id, vous pouvez utiliser des variables bind pour les refcursors également. Voir le bas de l'article d'Alex réponse à une question similaire que j'ai posée

14voto

zpontikas Points 5008

Ok je sais que c'est un peu un hack mais c'est une façon d'utiliser une variable dans une simple requête, pas un script :

WITH
    emplVar AS
    (SELECT 1234 AS id FROM dual)
SELECT
    *
FROM
    employees,
    emplVar
WHERE
    EmployId=emplVar.id;

Tu peux l'utiliser partout.

0 votes

Existe-t-il un moyen d'utiliser cette méthode avec UPDATE au lieu de select ?

13voto

Chandu Points 40028

Réponse simple : NON.

Cependant, vous pouvez obtenir quelque chose de similaire en exécutant la version suivante en utilisant des variables liées :

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Lorsque vous exécutez la requête ci-dessus dans SQL Developer, vous serez invité à entrer une valeur pour la variable de liaison EmployeeID.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X