Ich möchte wiederverwendbaren Code schreiben und muss zu Beginn 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 einEND;
. Zugriff auf die Variable mit&stupidvar
. - 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
...).
sql
oracle
variables
declaration
bl4ckb0l7
quelle
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, Variablen in SQL * Plus-Skripten zu deklarieren.
Die erste besteht darin, VAR zu verwenden, um eine Bindungsvariable zu deklarieren. Der Mechanismus zum Zuweisen von Werten zu einem VAR erfolgt mit einem EXEC-Aufruf:
Ein VAR ist besonders nützlich, wenn wir eine gespeicherte Prozedur mit OUT-Parametern oder einer Funktion aufrufen möchten.
Alternativ können wir Substitutionsvariablen verwenden. Diese sind gut für den interaktiven Modus:
Wenn wir ein Skript schreiben, das andere Skripte aufruft, kann es nützlich sein, die Variablen im Voraus zu definieren. Dieses Snippet wird ausgeführt, ohne dass ich aufgefordert werde, einen Wert einzugeben:
Schließlich gibt es den anonymen PL / SQL-Block. Wie Sie sehen, können wir deklarierten Variablen weiterhin interaktiv Werte zuweisen:
quelle
Versuchen Sie es mit doppelten Anführungszeichen, wenn es sich um eine char-Variable handelt:
oder
upd:
quelle
ORA-01008: not all variables bound
.DEFINE num = 1; SELECT &num FROM dual;
führt zu:ORA-01008: not all variables bound
In PL / SQL v.10
Das Schlüsselwort deklarieren wird verwendet, um eine Variable zu deklarieren
Um einen Wert zuzuweisen, können Sie ihn bei der Deklaration festlegen
oder um etwas in diese Variable auszuwählen, verwenden Sie die
INTO
Anweisung. Sie müssen jedoch die Anweisung einschließenBEGIN
undEND
außerdem sicherstellen, dass nur ein einzelner Wert zurückgegeben wird, und Semikolons nicht vergessen.Die vollständige Erklärung würde also wie folgt lauten:
Ihre Variable ist nur verwendbar innerhalb
BEGIN
undEND
so , wenn Sie mehr verwenden möchten , als werden Sie mehrere tun müssenBEGIN END
UmhüllungenHoffe das spart dir etwas Zeit
quelle
Wenn Sie das Datum deklarieren und dann in SQL Developer verwenden möchten.
quelle
Ich möchte nur Matas 'Antwort hinzufügen . Vielleicht ist es offensichtlich, aber ich habe lange gesucht, um herauszufinden, dass auf die Variable nur innerhalb der BEGIN-END- Konstruktion zugegriffen werden kann. Wenn Sie sie also später in einem Code verwenden müssen, müssen Sie diesen Code in BEGIN einfügen -END Block .
Beachten Sie, dass diese Blöcke verschachtelt werden können :
quelle
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.
Dieses Beispiel funktioniert aufgrund der automatischen Typkonvertierung (oder wie auch immer es heißt) einwandfrei.
Wenn Sie dies durch Eingabe von DEFINE in SQL * Plus überprüfen, wird angezeigt, dass die Variable num CHAR ist.
In diesem Fall ist dies kein Problem, da Oracle das Parsen von Zeichenfolgen in Zahlen verarbeiten kann, wenn es sich um eine gültige Zahl handelt.
Wenn die Zeichenfolge nicht nach Zahlen analysiert werden kann, kann Oracle nicht damit umgehen.
Wenn Sie also ein Zitat verwenden und Oracle nicht zwingen, es nach Zahlen zu analysieren, ist dies in Ordnung:
Um die ursprüngliche Frage zu beantworten, sollte es wie folgt aussehen:
Es gibt eine andere Möglichkeit, Variablen in SQL * Plus mithilfe des Abfragespaltenwerts zu speichern .
Die COL [UMN] verfügt über die Option new_value , um den Wert der Abfrage nach Feldnamen zu speichern.
Wie Sie sehen können, wurde der X.log-Wert in die Variable dumm_var gesetzt , sodass wir feststellen können, dass eine X.log-Datei im aktuellen Verzeichnis ein Protokoll enthält.
quelle
Hier ist deine Antwort:
quelle
In Toad verwende ich diese Arbeiten:
Dann wird der Wert in das
DBMS Output
Fenster gedruckt .Verweis auf hier und hier2 .
quelle
Manchmal müssen Sie eine Makrovariable verwenden, ohne den Benutzer zur Eingabe eines Werts aufzufordern. Meistens muss dies mit optionalen Skriptparametern erfolgen. Der folgende Code ist voll funktionsfähig
Ein ähnlicher Code wurde irgendwie im Verzeichnis rdbms / sql gefunden.
quelle
Ein möglicher Ansatz, wenn Sie einen Parameter nur einmal angeben und an mehreren Stellen replizieren müssen, besteht darin, Folgendes zu tun:
Dieser Code generiert eine Zeichenfolge mit 8 zufälligen Ziffern.
Beachten Sie, dass ich eine Art Alias mit dem Namen erstelle
str_size
, der die Konstante enthält8
. Es ist vernetzt, um mehr als einmal in der Abfrage verwendet zu werden.quelle