129 votes

Comment utiliser les variables dans Oracle SQL Developer?

Voici un exemple d'utilisation de 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. Il semble que ce soit une chose très simple à faire, mais je ne trouve pas de solution simple. Comment puis-je faire cela?

0 votes

En tant que procédure stockée ou script? Si vous codifiez en dur la valeur de EmpIDVar, pourquoi utiliser une variable du tout?

106voto

Omphaloskopie Points 645

Je suis en train d'utiliser le SQL-Developer en Version 3.2. Les autres solutions n'ont pas fonctionné pour moi, mais celle-ci l'a fait :

define value1 = 'sysdate'

SELECT &&value1 from dual;

Aussi c'est la méthode la plus élégante présentée ici, jusqu'à présent.

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

15 votes

Si on compare &&value1 à une valeur de type chaîne de caractères comme : &&value1 = 'Some string' alors &&value1 doit être enveloppé de guillemets simples comme : '&&value1' = 'Some string'

1 votes

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

10 votes

Cette page dans la section 2.4 parle de la différence entre le simple esperluette (&) et le double esperluette (&&)

82voto

gavenkoa Points 6974

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

Il s'agit de substitution (les variables de substitution peuvent remplacer les options de commande SQL*Plus ou d'autres textes codés en dur) :

définir a = 1;
sélectionner &a from dual;
ne pas définir a;

Il s'agit de bind (les variables bind stockent des valeurs de données pour les instructions SQL et PL/SQL exécutées dans le RDBMS ; elles peuvent contenir des valeurs uniques ou des ensembles de résultats complets) :

var x number;
exec :x := 10;
sélectionner :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 la syntaxe de bind :var, vous êtes invité pour le binding (dans une boîte de dialogue).

Référence :

MISE À JOUR les variables de substitution sont un peu compliquées à utiliser, regardez :

définir phone = '+38097666666';
sélectionner &phone from dual; -- le plus est supprimé car c'est un nombre
sélectionnez '&phone' from dual; -- le plus est conservé car c'est une chaîne de caractères

3 votes

J'ai essayé le bind dans SQL Developer (4.1.1.19) et cela fonctionne également. Je veux dire le cas avec var x et exec :x, pas de prompt.

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 qui contient un certain nombre de variables de liaison (préfixées par un deux-points), vous serez invité à saisir des valeurs. Comme le souligne Alex, vous pouvez également faire quelque chose de similaire en utilisant la fonction "Exécuter le script" (F5) avec la syntaxe EXEC alternative proposé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 le 'script' (F5) au lieu de 'exécuter la déclaration', il ne demandera pas les variables de liaison. Mais il semble ne pas aimer le sélectionner... dans (ORA-01006), donc vous devriez faire exec :v_emp_id := 1234; à la place.

0 votes

@Alex - Génial! Je viens tout juste d'abandonner et de supposer que SQL Developer demandait toujours les valeurs des variables de liaison. J'ai intégré tes suggestions dans ma réponse.

1 votes

@Nathan si vous cherchez à exécuter un package avec :v_emp_id, vous pouvez également utiliser des variables de liaison pour les refcursors. Voir le bas de la réponse d'Alex à une question similaire que j'avais

15voto

zpontikas Points 5008

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

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

Vous pouvez l'exécuter partout.

0 votes

Y a-t-il un moyen d'utiliser ceci 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 de liaison :

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Une fois que vous exécutez la requête ci-dessus dans SQL Developer, vous serez invité à entrer la valeur de 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