2016-04-18 5 views
1

Ich habe eine Anforderung für eine Abfrage. Es muss jede Nummer aus einer Liste auswählen, die NICHT in einer Spalte vorhanden ist. Momentan funktioniert das gut. Diese Abfrage gibt jede Zahl zwischen 1833 und 2000 zurück, die in der Tabelle ATTR nicht vorhanden ist.Einmalige Verwendung einer temporären Variablen in Oracle SQL Developer

SELECT LEVEL + 1833 
FROM DUAL 
CONNECT BY LEVEL <= (2000 - 1833) 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN 1834 AND 2000; 

Was ich tun möchte, ist dies so benutzerfreundlich wie möglich zu machen. Um das zu tun, kann ich zwei Variablen eingeben, eine STARTING_ID und LIST_LENGTH. Jetzt sieht meine Abfrage so aus.

SELECT LEVEL + &STARTING_ID 
FROM DUAL 
CONNECT BY LEVEL <= &LIST_LENGTH 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN &STARTING_ID AND &STARTING_ID + &LIST_LENGTH; 

Zuerst war ich mit &&, aber dann konnte ich nur diese Abfrage einmal verwenden. UNDEFINE konnte nicht in den Codeblock eingefügt werden und löschte meine Variablen sowieso nicht. Jetzt ist mein Problem, dass es jede & Variable als unterschiedlich betrachtet, so dass der Benutzer 5 Variablen statt 2 eingibt.

Wie mache ich es, wo ich noch temporäre Variablen benutze (mit oder ohne das Popup zu Geben Sie die Variable ein, aber die Person, die die Abfrage ausführt, muss nur zwei Werte eingeben: 1833 und 67?

+0

Weiß nicht, wie man eine Frage stellt, ohne eine Frage zu stellen, also werde ich eine Frage stellen = P. Aber ohne ein Fragezeichen! Mit welchem ​​Tool kannst du das machen? = P –

Antwort

1

Wie wäre es mit: als Eingabeaufforderung?

SELECT LEVEL + :STARTING_ID 
FROM DUAL 
CONNECT BY LEVEL <= :LIST_LENGTH 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN :STARTING_ID AND :STARTING_ID + :LIST_LENGTH; 

Dies verwendet das Konzept der Bind-Variablen. Somit könnte der Benutzer die erforderlichen Werte eingeben und fortfahren.

enter image description here

enter image description here

+0

Danke, Batman. Das macht, was ich brauche. Ich suchte nach einer Möglichkeit, die Variablen in die Abfrage selbst einzufügen, aber da das Popup "Enter Binds" die Variablen speichert, aber immer noch änderbar ist, ist es einfach benutzerfreundlich genug für das, was ich brauche. –

0

Versuchen Sie, '& &' anstatt einer '&' zu verwenden.

Wenn ein einzelnes Und-Zeichen-Präfix mit einer nicht definierten Variablen verwendet wird, wird der Wert, den Sie an der Eingabeaufforderung eingeben, nicht gespeichert. Sobald der Wert ersetzt wird, wird die Variable verworfen und bleibt undefiniert. Wenn die Variable zweimal in derselben Anweisung referenziert wird, werden Sie zweimal aufgefordert.

Wenn Sie '& &' verwenden, wird der Wert gespeichert und Sie werden daher nur eine Abfrage erhalten.

2

Ein bisschen ein Fudge, aber wenn Sie die Eingabeaufforderung für Substitutionsvariablen können Sie Bind-Variablen verwenden, aber füllen sie nur Substitutionsvariablen wie folgt aus:

(Führen Sie es als Skript mit F5 und nicht als eine Anweisung mit STRG + Eingabe)

VARIABLE list_length NUMBER; 
VARIABLE start_value NUMBER; 

BEGIN 
    :list_length := &ll; 
    :start_value := &sv; 
END; 
/

SELECT LEVEL + :start_value 
FROM DUAL 
CONNECT BY LEVEL <= :list_length 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN :start_value + 1 AND :start_value + :list_length; 

Andernfalls verwenden Sie einfach Bind-Variablen (z. die Abfrage am unteren Rand des Skripts).

Verwandte Themen