Comment utiliser des variables dans Oracle SQL Developer?

116

Vous trouverez ci-dessous 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. Cela semble être une chose très simple à faire, mais je ne trouve pas de solution simple. Comment puis-je le faire?

Nathan
la source
En tant que procédure stockée ou en tant que script? Si vous codez en dur la valeur de EmpIDVar, pourquoi utiliser une variable?
kurosch

Réponses:

95

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

C'est aussi la manière la plus astucieuse présentée ici, à ce jour.

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

Omphaloskopie
la source
12
Si vous comparez && value1 à une valeur de chaîne comme: && value1 = 'Some string', alors && value1 doit être entourée de guillemets simples comme: '&& value1' = 'Some string'
Ryan E
1
Dans SQL Developer, les variables de substitution définies par DEFINE semblent persistantes entre les exécutions de requêtes. Si je change la valeur de la variable, mais ne met pas explicitement en évidence la ligne DEFINE lors de l'exécution, la valeur précédente reste. (Est-ce à cause du double &&?)
Baodad
9
Cette page de la section 2.4 présente la différence entre l'esperluette simple (&) et l'esperluette double (&&)
Baodad
1
Pour ceux d'entre nous habitués à travailler avec des requêtes avec des variables dans Microsoft SQL Server Management Studio, c'est la meilleure réponse. Nous devrons peut-être nous habituer à mettre en évidence toute la requête avant de l'exécuter.
Baodad
Cette réponse était la solution qui a fonctionné pour moi dans SQL-Developer 2.1. C'est certainement la méthode la plus simple pour implémenter un moyen pour l'utilisateur de modifier une valeur au-dessus de la requête et de ne pas avoir à modifier la requête elle-même.
YonkeyDonk64
74

Il existe deux types de variables dans SQL-plus: la substitution et la liaison.

Il s'agit d'une 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;

Il s'agit de bind (les variables de liaison stockent les valeurs de 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 de vous êtes invité pour la liaison (dans une boîte de dialogue).

Référence:

Les variables de substitution UPDATE sont un peu difficiles à utiliser, regardez:

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string
gavenkoa
la source
2
J'ai essayé la liaison dans SQL Developer (4.1.1.19) et cela fonctionne aussi. Je veux dire le cas avec var xet exec :x, pas d'invite.
Betlista
50

Dans 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 contenant un nombre quelconque de variables de liaison (précédées d'un signe deux-points), vous serez invité à entrer des valeurs. Comme Alex le fait remarquer, vous pouvez également faire quelque chose de similaire en utilisant la fonction "Exécuter le 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;
Justin Cave
la source
14
si vous «exécutez le script» (F5) au lieu de «exécuter l'instruction», il ne demandera pas les variables de liaison. Mais il ne semble pas aimer le select...into(ORA-01006), vous devriez donc le faire à la exec :v_emp_id := 1234;place.
Alex Poole
@Alex - Bien! J'ai juste abandonné et j'ai supposé que SQL Developer demandait toujours des valeurs de variable de liaison. J'ai incorporé vos suggestions dans ma réponse.
Justin Cave du
1
@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
Conrad Frix
2
@AlexPoole existe-t-il un moyen d'envoyer la sortie à la fenêtre Résultat de la requête? Dans mon travail, j'exécute des requêtes pour exporter vers des fichiers Excel.
tp9
13

Ok, je sais que c'est un peu un hack mais c'est un moyen 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;

Vous pouvez l'exécuter partout.

zpontikas
la source
Existe-t-il un moyen d'utiliser ceci avec UPDATE au lieu de select?
Ron Jensen - Nous sommes tous Monica
12

Réponse simple NON.

Cependant, vous pouvez obtenir quelque chose de similaire en exécutant la version suivante à l'aide de variables de liaison:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Une fois que vous avez exécuté la requête ci-dessus dans SQL Developer, vous serez invité à entrer une valeur pour la variable de liaison EmployeeID.

Chandu
la source
8

Vous pouvez lire ailleurs sur les variables de substitution; ils sont assez pratiques dans SQL Developer. Mais j'ai des difficultés à essayer d'utiliser des variables de liaison dans SQL Developer. C'est ce que je fais:

SET SERVEROUTPUT ON
declare
  v_testnum number;
  v_teststring varchar2(1000);

begin
   v_testnum := 2;
   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);

   SELECT 36,'hello world'
   INTO v_testnum, v_teststring
   from dual;

   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);
   DBMS_OUTPUT.put_line('v_teststring is ' || v_teststring);
end;

SET SERVEROUTPUT ON fait en sorte que le texte puisse être imprimé sur la console de sortie du script.

Je crois que ce que nous faisons ici s'appelle officiellement PL / SQL. Nous avons quitté le domaine du SQL pur et utilisons un moteur différent dans Oracle. Vous voyez ce qui SELECTprécède? En PL / SQL, vous devez toujours SELECT ... INTOsoit une variable, soit un refcursor. Vous ne pouvez pas simplement SELECTet retourner un jeu de résultats en PL / SQL.

Baodad
la source
2

Je pense que le moyen le plus simple dans votre cas est:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Pour les valeurs de chaîne, ce sera comme:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Peter
la source
1

Utilisez la requête suivante:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
Ivan Gerasimenko
la source
erreur renvoyée "PLS-00428, une clause INTO est attendue dans cette instruction SELECT"
Thundter
0

Essayez ceci, cela fonctionnera, il vaut mieux créer une procédure, si la procédure n'est pas possible, vous pouvez utiliser ce script.

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
Jeen Jose Akkanath
la source
0

Dans le développeur SQL, définissez les propriétés par défaut "ON". S'il est "OFF" dans tous les cas, utilisez les étapes ci-dessous.

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

Md. Kamruzzaman
la source