web-dev-qa-db-fra.com

Comment déclarer une variable et l'utiliser dans le même script Oracle SQL?

Je veux écrire du code réutilisable et je dois déclarer certaines variables au début et les réutiliser dans le script, telles que:

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;

Comment puis-je déclarer une variable et la réutiliser dans les instructions suivantes, telles que l’utilisation de SQLDeveloper?.


tentatives

  • Utilisez une section DECLARE et insérez l'instruction SELECT suivante dans BEGIN et END;. Accède à la variable en utilisant &stupidvar.
  • Utilisez le mot-clé DEFINE pour accéder à la variable.
  • En utilisant le mot-clé VARIABLE et accédez à la variable.

Mais je reçois toutes sortes d’erreurs lors de mes essais (Variable non liée, Erreur de syntaxe, Expected SELECT INTO...).

113
bl4ckb0l7

Il existe plusieurs façons de déclarer des variables dans des scripts SQL * Plus.

La première consiste à utiliser VAR. Le mécanisme d'attribution de valeurs à un VAR est un appel EXEC:

SQL> var name varchar2(20)
SQL> exec :name := 'SALES'

PL/SQL procedure successfully completed.

SQL> select * from dept
  2  where dname = :name
  3  /

    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

SQL>

Un VAR est particulièrement utile lorsque vous souhaitez appeler une procédure stockée ayant des paramètres OUT ou une fonction.

Alternativement, nous pouvons utiliser des variables de souscription. Ce sont bons pour le mode interactif:

SQL> accept p_dno Prompt "Please enter Department number: " default 10
Please enter Department number: 20
SQL> select ename, sal
  2  from emp
  3  where deptno = &p_dno
  4  /
old   3: where deptno = &p_dno
new   3: where deptno = 20

ENAME             SAL
---------- ----------
CLARKE            800
ROBERTSON        2975
RIGBY            3000
KULASH           1100
GASPAROTTO       3000

SQL>

Lorsque nous écrivons un script qui appelle d'autres scripts, il peut être utile de définir les variables à l'avance:

SQL> def p_dno = 40
SQL> select ename, sal
  2  from emp
  3  where deptno = &p_dno
  4  /
old   3: where deptno = &p_dno
new   3: where deptno = 40

no rows selected

SQL>

Enfin, il y a le bloc anonyme PL/SQL. Comme vous le voyez, nous pouvons toujours affecter des valeurs aux variables déclarées de manière interactive:

SQL> set serveroutput on size unlimited
SQL> declare
  2      n pls_integer;
  3      l_sal number := 3500;
  4      l_dno number := &dno;
  5  begin
  6      select count(*)
  7      into n
  8      from emp
  9      where sal > l_sal
 10      and deptno = l_dno;
 11      dbms_output.put_line('top earners = '||to_char(n));
 12  end;
 13  /
Enter value for dno: 10
old   4:     l_dno number := &dno;
new   4:     l_dno number := 10;
top earners = 1

PL/SQL procedure successfully completed.

SQL>
124
APC

Essayez d’utiliser des guillemets doubles s’il s’agit d’une variable char:

DEFINE stupidvar = "'stupidvarcontent'";

ou

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata  
FROM stupidtable  
WHERE stupidcolumn = '&stupidvar'

upd:

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 25 17:13:26 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn od/[email protected]
Connected.
SQL> define var = "'FL-208'";
SQL> select code from product where code = &var;
old   1: select code from product where code = &var
new   1: select code from product where code = 'FL-208'

CODE
---------------
FL-208

SQL> define var = 'FL-208';
SQL> select code from product where code = &var;
old   1: select code from product where code = &var
new   1: select code from product where code = FL-208
select code from product where code = FL-208
                                      *
ERROR at line 1:
ORA-06553: PLS-221: 'FL' is not a procedure or is undefined
25
be here now

En PL/SQL v.10

le mot clé declare est utilisé pour déclarer une variable

DECLARE stupidvar varchar(20);

pour attribuer une valeur, vous pouvez la définir lorsque vous déclarez

DECLARE stupidvar varchar(20) := '12345678';

ou pour sélectionner quelque chose dans cette variable, utilisez l'instruction INTO. Toutefois, vous devez envelopper l'instruction dans BEGIN et END. Vous devez également vous assurer que seule une valeur unique est renvoyée. 'oubliez pas les points-virgules.

donc la déclaration complète sortirait après:

DECLARE stupidvar varchar(20);
BEGIN
    SELECT stupid into stupidvar FROM stupiddata CC 
    WHERE stupidid = 2;
END;

Votre variable n'est utilisable que dans BEGIN et END donc si vous voulez en utiliser plusieurs, vous devrez créer plusieurs BEGIN END enveloppes.

DECLARE stupidvar varchar(20);
BEGIN
    SELECT stupid into stupidvar FROM stupiddata CC 
    WHERE stupidid = 2;

    DECLARE evenmorestupidvar varchar(20);
    BEGIN
        SELECT evenmorestupid into evenmorestupidvar FROM evenmorestupiddata CCC 
        WHERE evenmorestupidid = 42;

        INSERT INTO newstupiddata (newstupidcolumn, newevenmorestupidstupidcolumn)
        SELECT stupidvar, evenmorestupidvar 
        FROM dual

    END;
END;

J'espère que cela vous fait gagner du temps

15

Si vous souhaitez déclarer une date, puis l’utiliser dans SQL Developer.

DEFINE PROPp_START_DT = TO_DATE('01-SEP-1999')

SELECT * 
FROM proposal 
WHERE prop_start_dt = &PROPp_START_DT
6
SVK

La question est sur le point d'utiliser une variable dans un script signifie pour moi, il sera utilisé dans SQL * Plus.

Le problème est que vous avez oublié les guillemets et Oracle ne peut pas analyser la valeur en nombre.

SQL> DEFINE num = 2018
SQL> SELECT &num AS your_num FROM dual;
old   1: SELECT &num AS your_num FROM dual
new   1: SELECT 2018 AS your_num FROM dual

  YOUR_NUM
----------
      2018

Elapsed: 00:00:00.01

Cet exemple fonctionne correctement en raison de la conversion automatique du type (ou quel que soit le nom utilisé).

Si vous vérifiez en tapant DEFINE dans SQL * Plus, cela indique que la variable num est CHAR.

SQL>define
DEFINE NUM             = "2018" (CHAR)

Dans ce cas, ce n’est pas un problème, car Oracle peut traiter l’analyse syntaxique de chaîne en nombre s’il s’agit d’un nombre valide.

Lorsque la chaîne ne peut pas analyser en nombre, Oracle ne peut pas s'en occuper.

SQL> DEFINE num = 'Doh'
SQL> SELECT &num AS your_num FROM dual;
old   1: SELECT &num AS your_num FROM dual
new   1: SELECT Doh AS your_num FROM dual
SELECT Doh AS your_num FROM dual
       *
ERROR at line 1:
ORA-00904: "DOH": invalid identifier

Avec une citation, ne forcez donc pas Oracle à numéroter, ça ira:

17:31:00 SQL> SELECT '&num' AS your_num FROM dual;
old   1: SELECT '&num' AS your_num FROM dual
new   1: SELECT 'Doh' AS your_num FROM dual

YOU
---
Doh

Donc, pour répondre à la question initiale, il convient de faire comme cet exemple:

SQL> DEFINE stupidvar = 'X'
SQL>
SQL> SELECT 'print stupidvar:' || '&stupidvar'
  2  FROM dual
  3  WHERE dummy = '&stupidvar';
old   1: SELECT 'print stupidvar:' || '&stupidvar'
new   1: SELECT 'print stupidvar:' || 'X'
old   3: WHERE dummy = '&stupidvar'
new   3: WHERE dummy = 'X'

'PRINTSTUPIDVAR:'
-----------------
print stupidvar:X

Elapsed: 00:00:00.00

Il existe un autre moyen de stocker une variable dans SQL * Plus en utilisant valeur de colonne de requête.

Le COL [UMN] dispose de l'option new_value pour stocker la valeur d'une requête par nom de champ.

SQL> COLUMN stupid_column_name new_value stupid_var noprint
SQL> SELECT dummy || '.log' AS stupid_column_name
  2  FROM dual;

Elapsed: 00:00:00.00
SQL> SPOOL &stupid_var.
SQL> SELECT '&stupid_var' FROM DUAL;
old   1: SELECT '&stupid_var' FROM DUAL
new   1: SELECT 'X.log' FROM DUAL

X.LOG
-----
X.log

Elapsed: 00:00:00.00
SQL>SPOOL OFF;

Comme vous pouvez le constater, la valeur de X.log a été définie dans la variable stupid_var, de sorte que nous pouvons trouver un fichier X.log dans le répertoire en cours contenant un journal.

3
Laszlo Lugosi

Je veux juste ajouter Matas 'answer. C’est peut-être évident, mais je cherche depuis longtemps à comprendre que la construction de la variable n’est accessible que dans BEGIN-END, donc si vous avez besoin de l’utiliser dans un code plus tard, il vous faut to placez ce code dans le bloc BEGIN-END.

Notez que ces les blocs peuvent être imbriqués:

DECLARE x NUMBER;
  BEGIN
    SELECT PK INTO x FROM table1 WHERE col1 = 'test';

    DECLARE y NUMBER;
    BEGIN
    SELECT PK INTO y FROM table2 WHERE col2 = x;

    INSERT INTO table2 (col1, col2)
      SELECT y,'text'
      FROM dual
      WHERE exists(SELECT * FROM table2);
    COMMIT;
  END;
END;
3
Katia Savina

Voici votre réponse:

DEFINE num := 1;       -- The semi-colon is needed for default values.
SELECT &num FROM dual;
2

En crapaud j'utilise ceci fonctionne:

declare 
    num number;
begin 
    ---- use 'select into' works 
    --select 123 into num from dual;

    ---- also can use :=
    num := 123;
    dbms_output.Put_line(num);
end;

La valeur sera ensuite imprimée dans la fenêtre DBMS Output.

Référence à ici et here2 .

0
yu yang Jian