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?
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.)
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
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;
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.
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.
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.
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'
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';
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;
Verwenden Sie die nächste Abfrage:
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;