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
BEGIN
et END;
. Accède à la variable en utilisant &stupidvar
.DEFINE
pour accéder à la variable.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
...).
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>
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/od@etalon
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
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
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
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.
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;
Voici votre réponse:
DEFINE num := 1; -- The semi-colon is needed for default values.
SELECT &num FROM dual;