it-swarm.com.de

Wie deklariere ich eine Variable und verwende sie im selben Oracle SQL-Skript?

Ich möchte wiederverwendbaren Code schreiben und muss am Anfang einige Variablen deklarieren und im Skript wiederverwenden, z.

DEFINE stupidvar = 'stupidvarcontent';

SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;

Wie kann ich eine Variable deklarieren und in folgenden Anweisungen wiederverwenden, z. B. bei der Verwendung von SQLDeveloper?.


Versuche

  • Verwenden Sie einen DECLARE-Abschnitt und fügen Sie die folgende SELECT-Anweisung in BEGIN und END; Ein. Greifen Sie mit &stupidvar Auf die Variable zu.
  • Verwenden Sie das Schlüsselwort DEFINE und greifen Sie auf die Variable zu.
  • Verwenden Sie das Schlüsselwort VARIABLE und greifen Sie auf die Variable zu.

Bei meinen Versuchen werden jedoch alle Arten von Fehlern angezeigt (Ungebundene Variable, Syntaxfehler, Erwartet SELECT INTO ...).

113
bl4ckb0l7

Es gibt verschiedene Möglichkeiten, Variablen in SQL * Plus-Skripten zu deklarieren.

Der erste ist die Verwendung von VAR. Der Mechanismus zum Zuweisen von Werten zu einer VAR erfolgt mit einem EXEC-Aufruf:

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>

Eine VAR ist besonders nützlich, wenn eine gespeicherte Prozedur mit OUT-Parametern oder einer Funktion aufgerufen werden soll.

Alternativ können wir auch Substitutionsvariablen verwenden. Diese sind gut für den interaktiven Modus:

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>

Wenn wir ein Skript schreiben, das andere Skripte aufruft, kann es nützlich sein, die Variablen im Voraus zu definieren:

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>

Endlich gibt es den anonymen PL/SQL-Block. Wie Sie sehen, können wir deklarierten Variablen weiterhin interaktiv Werte zuweisen:

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

Verwenden Sie doppelte Anführungszeichen, wenn es sich um eine Zeichenvariable handelt:

DEFINE stupidvar = "'stupidvarcontent'";

oder

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

In PL/SQL v.10

das Schlüsselwort declare wird verwendet, um eine Variable zu deklarieren

DECLARE stupidvar varchar(20);

um einen Wert zuzuweisen, können Sie ihn bei der Deklaration festlegen

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

oder um etwas in dieser Variablen auszuwählen, verwenden Sie die Anweisung INTO. Sie müssen jedoch die Anweisung in BEGIN und END einschließen. Außerdem müssen Sie sicherstellen, dass nur ein einzelner Wert zurückgegeben wird und Semikolons nicht vergessen.

die vollständige Aussage würde also wie folgt lauten:

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

Ihre Variable kann nur in BEGIN und END verwendet werden. Wenn Sie also mehr als eine Variable verwenden möchten, müssen Sie mehrere BEGIN END Umhüllungen

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;

Hoffe das spart dir etwas Zeit

15

Wenn Sie das Datum deklarieren möchten, verwenden Sie es in SQL Developer.

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

SELECT * 
FROM proposal 
WHERE prop_start_dt = &PROPp_START_DT
6
SVK

Die Frage, ob eine Variable in einem Skript verwendet werden soll, bedeutet für mich, dass sie in SQL * Plus verwendet wird.

Das Problem ist, dass Sie die Anführungszeichen verpasst haben und Oracle den Wert nicht in Zahlen analysieren kann.

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

Dieses Beispiel funktioniert aufgrund der automatischen Typkonvertierung (oder wie auch immer es genannt wird) einwandfrei.

Wenn Sie in SQL * Plus DEFINE eingeben, wird angezeigt, dass die Variable num CHAR ist.

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

In diesem Fall ist dies kein Problem, da Oracle die Syntaxanalyse von Zeichenfolgen zu Zahlen verarbeiten kann, wenn es sich um eine gültige Zahl handelt.

Wenn die Zeichenfolge nicht zu einer Zahl analysiert werden kann, kann Oracle nicht damit umgehen.

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

Wenn Sie ein Zitat verwenden, müssen Sie Oracle nicht zwingen, die Zahlen zu analysieren.

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

Um die ursprüngliche Frage zu beantworten, sollte dies folgendermaßen aussehen:

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

Es gibt eine andere Möglichkeit, Variablen in SQL * Plus zu speichern, indem Sie Wert der Abfragespalte verwenden.

Die Option COL [UMN] hat die Option new_value, um den Wert aus der Abfrage anhand des Feldnamens zu speichern.

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;

Wie Sie sehen, wurde der X.log-Wert in die Variable stupid_var gesetzt, sodass eine X.log-Datei im aktuellen Verzeichnis ein Protokoll enthält.

3
Laszlo Lugosi

Ich möchte nur die Antwort von Matas hinzufügen. Vielleicht ist es offensichtlich, aber ich habe lange gesucht, um herauszufinden, dass die Variable nur innerhalb der BEGIN-END -Konstruktion zugänglich ist. Wenn Sie sie also später in einem Code verwenden müssen, müssen Sie dies tun bis diesen Code in den BEGIN-END-Block einfügen.

Beachten Sie, dass diese Blöcke können verschachtelt sein:

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

Hier ist deine Antwort:

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

In Toad verwende ich diese Arbeiten:

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;

Dann wird der Wert auf DBMS Output Fenster.

Verweis auf hier und hier2 .

0
yu yang Jian