web-dev-qa-db-fra.com

Comment utiliser des variables dans Oracle SQL Developer?

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?

90
Nathan

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;

Aussi, c'est la façon la plus simple présentée ici, pour le moment.

(Si vous omettez la partie "define", cette valeur vous sera demandée)

76
Omphaloskopie

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

Il s’agit de substitution (les variables de substitution peuvent remplacer les options de la commande SQL * Plus ou un autre texte codé en dur):

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

Il s'agit de bind (les variables de liaison stockent des 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 la syntaxe bind :var, vous êtes invité à indiquer la liaison (dans une boîte de dialogue).

Référence:

UPDATE _ ​​substitution les variables sont un peu délicates à utiliser, regardez:

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is number
select '&phone' from dual; -- plus is preserved as it is string
58
gavenkoa

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 de liaison (précédée de deux points), vous serez invité à entrer des valeurs. Comme Alex le souligne, vous pouvez également faire quelque chose de similaire en utilisant la fonction "Exécuter le script" (F5) avec la syntaxe alternative EXEC 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;
47
Justin Cave

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.

12
Chandu

Ok, je sais que c'est un peu un bidouillage, 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.

8
zpontikas

Vous pouvez lire ailleurs sur les variables de substitution; ils sont très utiles 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 terrain du SQL pur et utilisons un moteur différent dans Oracle. Vous voyez la SELECT ci-dessus? En PL/SQL, vous devez toujours SELECT ... INTO variable ou un refcursor. Vous ne pouvez pas simplement SELECT et renvoyer un jeu de résultats en PL/SQL.

7
Baodad

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, cela ressemblera à:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
0
Peter

Dans SQL Developer, définissez les propriétés par défaut sur "ON". Si c'est le cas, utilisez les étapes ci-dessous. 

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

0
Md. Kamruzzaman

Essayez ceci cela fonctionnera, il est préférable de 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;
0

Utilisez la requête suivante:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
0
Ivan Gerasimenko