Wie verwende ich Variablen in Oracle SQL Developer?

116

Unten finden Sie ein Beispiel für die Verwendung von Variablen in SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Ich möchte genau dasselbe in Oracle mit SQL Developer ohne zusätzliche Komplexität tun. Es scheint eine sehr einfache Sache zu sein, aber ich kann keine einfache Lösung finden. Wie kann ich es tun?

Nathan
quelle
Als gespeicherte Prozedur oder als Skript? Wenn Sie den Wert für EmpIDVar fest codieren, warum sollten Sie überhaupt eine Variable verwenden?
Kurosch

Antworten:

95

Ich verwende den SQL-Developer in Version 3.2. Das andere Zeug hat bei mir nicht funktioniert, aber das hat funktioniert:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Es ist auch der bisher schickste Weg, der hier vorgestellt wird.

(Wenn Sie den "define" -Teil weglassen, werden Sie zur Eingabe dieses Werts aufgefordert.)

Omphaloskopie
quelle
12
Wenn Sie && value1 mit einem Zeichenfolgenwert wie: && value1 = 'Some string' vergleichen, muss && value1 in einfache Anführungszeichen gesetzt werden wie: '&& value1' = 'Some string'
Ryan E
1
In SQL Developer scheinen durch DEFINE definierte Substitutionsvariablen zwischen Abfrageausführungen dauerhaft zu sein. Wenn ich den Variablenwert ändere, aber die Zeile DEFINE bei der Ausführung nicht explizit hervorhole, bleibt der vorherige Wert erhalten. (Liegt das am Doppel &&?)
Baodad
9
Diese Seite in Abschnitt 2.4 spricht über den Unterschied zwischen dem einfachen kaufmännischen Und (&) und dem doppelten kaufmännischen Und (&&)
Baodad
1
Für diejenigen von uns, die es gewohnt sind, mit Abfragen mit Variablen in Microsoft SQL Server Management Studio zu arbeiten, ist dies die beste Antwort. Möglicherweise müssen wir uns jedoch daran gewöhnen, die gesamte Abfrage hervorzuheben, bevor wir sie ausführen.
Baodad
Diese Antwort war die Lösung, die in SQL-Developer 2.1 für mich funktioniert hat. Dies ist definitiv die einfachste Methode, um eine Möglichkeit für den Benutzer zu implementieren, einen Wert über der Abfrage zu ändern, ohne die Abfrage selbst bearbeiten zu müssen.
YonkeyDonk64
74

In SQL-plus gibt es zwei Arten von Variablen: Ersetzen und Binden.

Dies ist eine Substitution (Substitutionsvariablen können SQL * Plus-Befehlsoptionen oder anderen fest codierten Text ersetzen):

define a = 1;
select &a from dual;
undefine a;

Das ist bind (Bindungsvariablen speichern Datenwerte für SQL- und PL / SQL-Anweisungen, die im RDBMS ausgeführt werden; sie können einzelne Werte oder vollständige Ergebnismengen enthalten):

var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;

SQL Developer unterstützt Substitutionsvariablen. Wenn Sie jedoch eine Abfrage mit Bindungssyntax ausführen, werden :varSie zur Eingabe der Bindung aufgefordert (in einem Dialogfeld).

Referenz:

UPDATE- Substitutionsvariablen sind etwas schwierig zu verwenden.

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string
Gavenkoa
quelle
2
Ich habe die Bindung in SQL Developer (4.1.1.19) ausprobiert und sie funktioniert auch. Ich meine den Fall mit var xund exec :xohne Aufforderung.
Betlista
50

In SQL * Plus können Sie etwas sehr Ähnliches tun

SQL> variable v_emp_id number;
SQL> select 1234 into :v_emp_id from dual;

      1234
----------
      1234

SQL> select *
  2    from emp
  3   where empno = :v_emp_id;

no rows selected

Wenn Sie in SQL Developer eine Anweisung ausführen, die eine beliebige Anzahl von Bindevariablen enthält (denen ein Doppelpunkt vorangestellt ist), werden Sie aufgefordert, Werte einzugeben. Wie Alex betont, können Sie mit der Funktion "Skript ausführen" (F5) mit der alternativen EXEC-Syntax, die Alex vorschlägt, auch etwas Ähnliches tun.

variable v_count number;
variable v_emp_id number;
exec :v_emp_id := 1234;
exec select count(1) into :v_count from emp;
select *
  from emp
 where empno = :v_emp_id
exec print :v_count;
Justin Cave
quelle
14
Wenn Sie "Skript ausführen" (F5) anstelle von "Anweisung ausführen" ausführen, werden Sie nicht zur Eingabe der Bindungsvariablen aufgefordert. Aber es scheint das select...into(ORA-01006) nicht zu mögen , also müssten Sie es exec :v_emp_id := 1234;stattdessen tun .
Alex Poole
@ Alex - Schön! Ich habe einfach aufgegeben und angenommen, dass SQL Developer immer nach Bindevariablenwerten fragt. Ich habe Ihre Vorschläge in meine Antwort aufgenommen.
Justin Cave
1
@ Nathan Wenn Sie ein Paket mit v_emp_id ausführen möchten, können Sie auch Bindungsvariablen für die Refcursor verwenden. Siehe den Grund von Alex ' Antwort auf eine ähnliche Frage, die ich hatte
Conrad Frix
2
@AlexPoole Gibt es eine Möglichkeit, die Ausgabe an das Abfrageergebnisfenster zu senden? In meinem Job führe ich Abfragen aus, um sie in Excel-Dateien zu exportieren.
tp9
13

Ok, ich weiß, dass dies ein bisschen hackt, aber dies ist eine Möglichkeit, eine Variable in einer einfachen Abfrage zu verwenden, nicht in einem Skript:

WITH
    emplVar AS
    (SELECT 1234 AS id FROM dual)
SELECT
    *
FROM
    employees,
    emplVar
WHERE
    EmployId=emplVar.id;

Sie können es überall ausführen.

zpontikas
quelle
Gibt es eine Möglichkeit, dies mit UPDATE anstelle von select zu verwenden?
Ron Jensen - Wir sind alle Monica
12

Einfache Antwort NEIN.

Sie können jedoch etwas Ähnliches erreichen, indem Sie die folgende Version mit Bindevariablen ausführen:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Sobald Sie die obige Abfrage in SQL Developer ausführen, werden Sie aufgefordert, einen Wert für die Bindungsvariable EmployeeID einzugeben.

Chandu
quelle
8

Sie können sich an anderer Stelle über Substitutionsvariablen informieren. Sie sind in SQL Developer sehr praktisch. Aber ich habe Probleme beim Versuch, Bindungsvariablen in SQL Developer zu verwenden. Das ist was ich mache:

SET SERVEROUTPUT ON
declare
  v_testnum number;
  v_teststring varchar2(1000);

begin
   v_testnum := 2;
   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);

   SELECT 36,'hello world'
   INTO v_testnum, v_teststring
   from dual;

   DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);
   DBMS_OUTPUT.put_line('v_teststring is ' || v_teststring);
end;

SET SERVEROUTPUT ON macht es so, dass Text auf der Skriptausgabekonsole gedruckt werden kann.

Ich glaube, was wir hier machen, heißt offiziell PL / SQL. Wir haben das reine SQL-Land verlassen und verwenden in Oracle eine andere Engine. Siehst du das SELECToben? In PL / SQL müssen Sie immer SELECT ... INTOentweder eine Variable oder einen Refcursor verwenden. Sie können SELECTeine Ergebnismenge in PL / SQL nicht einfach zurückgeben.

Baodad
quelle
2

Ich denke, dass der einfachste Weg in Ihrem Fall ist:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Für die Zeichenfolgenwerte sieht es so aus:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Peter
quelle
1

Verwenden Sie die nächste Abfrage:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
Ivan Gerasimenko
quelle
Fehler zurückgegeben "PLS-00428 In dieser SELECT-Anweisung wird eine INTO-Klausel erwartet"
Thundter
0

Versuchen Sie dies, es wird funktionieren, es ist besser, eine Prozedur zu erstellen. Wenn eine Prozedur nicht möglich ist, können Sie dieses Skript verwenden.

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
Jeen Jose Akkanath
quelle
0

In SQL Developer definieren Sie Eigenschaften standardmäßig "ON". Wenn es auf jeden Fall "AUS" ist, führen Sie die folgenden Schritte aus.

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

Md. Kamruzzaman
quelle