it-swarm.com.de

Wie verwende ich Variablen in Oracle SQL Developer?

Im Folgenden 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 das gleiche 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?

90
Nathan

Ich verwende den SQL-Developer in Version 3.2. Das andere Zeug hat für mich nicht funktioniert, aber dies tat:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Es ist auch der glitzeste Weg, der hier präsentiert wird.

(Wenn Sie den "define" -Part nicht angeben, werden Sie aufgefordert, diesen Wert einzugeben.)

76
Omphaloskopie

Es gibt zwei Arten von Variablen in SQL-plus: Ersetzen und Binden.

Dies ist substitution (Substitutionsvariablen können SQL * Plus-Befehlsoptionen oder anderen hartcodierten Text ersetzen):

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

Dies 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 der Syntax bind :var ausführen, werden Sie zur Eingabe der Bindung (in einem Dialogfeld) aufgefordert.

Referenz:

UPDATE _ ​​Substitution Variablen sind etwas komplizierter zu bedienen, siehe:

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is number
select '&phone' from dual; -- plus is preserved as it is string
58
gavenkoa

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 über mehrere Bindungsvariablen (mit einem Doppelpunkt) verfügt, werden Sie zur Eingabe von Werten aufgefordert. Alex weist darauf hin, dass Sie mit der "Run Script" -Funktion (F5) und der alternativen EXEC-Syntax von Alex etwas Ähnliches tun können.

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;
47
Justin Cave

Einfache antwort NEIN.

Ähnliches erreichen Sie jedoch, wenn Sie die folgende Version mit Bind-Variablen ausführen:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Wenn Sie die obige Abfrage in SQL Developer ausführen, werden Sie aufgefordert, einen Wert für die Bind-Variable EmployeeID einzugeben.

12
Chandu

Ok, ich weiß das ein bisschen wie ein Hack, 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;

Du kannst es überall laufen lassen.

8
zpontikas

Sie können sich an anderer Stelle über Substitutionsvariablen informieren. Sie sind in SQL Developer sehr praktisch. Aber ich habe Anfälle, die versuchen, Bind-Variablen 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 sorgt dafür, dass Text an die Skriptausgabekonsole gedruckt werden kann.

Ich glaube, was wir hier tun, heißt offiziell PL/SQL. Wir haben das reine SQL-Land verlassen und verwenden in Oracle eine andere Engine. Sie sehen die SELECT oben? In PL/SQL müssen Sie SELECT ... INTO entweder eine Variable oder einen Refcursor eingeben. Sie können nicht einfach SELECT und eine Ergebnismenge in PL/SQL zurückgeben.

7
Baodad

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

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Für die String-Werte ist es wie folgt:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
0
Peter

In SQL-Entwickler definieren Sie Eigenschaften standardmäßig "ON". Wenn es auf "AUS" steht, 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';

0
Md. Kamruzzaman

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;
0

Verwenden Sie die nächste Abfrage:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
0