Come utilizzare le variabili in Oracle SQL Developer?

Di seguito è riportato un esempio dell’utilizzo di variabili in SQL Server 2000.

DECLARE @EmpIDVar INT SET @EmpIDVar = 1234 SELECT * FROM Employees WHERE EmployeeID = @EmpIDVar 

Voglio fare esattamente la stessa cosa in Oracle usando SQL Developer senza ulteriore complessità. Sembra una cosa molto semplice da fare, ma non riesco a trovare una soluzione semplice. Come posso farlo?

Sto usando SQL-Developer nella versione 3.2. Le altre cose non hanno funzionato per me, ma questo ha fatto:

 define value1 = 'sysdate' SELECT &&value1 from dual; 

Inoltre è il modo più furbo presentato qui, ancora.

(Se ometti la parte “define” ti verrà richiesto quel valore)

Esistono due tipi di variabili in SQL-plus: sostituzione e binding.

Questa è una sostituzione (le variabili di sostituzione possono sostituire le opzioni di comando SQL * Plus o altro testo codificato):

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

Questo è bind (le variabili di binding memorizzano i valori dei dati per le istruzioni SQL e PL / SQL eseguite nell’RDBMS, possono contenere singoli valori o set di risultati completi):

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

SQL Developer supporta le variabili di sostituzione, ma quando si esegue una query con bind :var syntax viene richiesto il binding (in una finestra di dialogo).

Riferimento:

Le variabili di sostituzione UPDATE sono un po ‘complicate da usare, guarda:

 define phone = '+38097666666'; select &phone from dual; -- plus is striped as it is number )) select '&phone' from dual; -- plus is preserved as it is string 

In SQL * Plus, puoi fare qualcosa di molto simile

 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 

In SQL Developer, se si esegue un’istruzione con un numero qualsiasi di variabili di collegamento (precedute da due punti), verrà richiesto di inserire i valori. Come sottolinea Alex, puoi anche fare qualcosa di simile usando la funzione “Esegui script” (F5) con la syntax EXEC alternativa suggerita da Alex.

 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; 

Risposta semplice NO.

Tuttavia puoi ottenere qualcosa di simile eseguendo la seguente versione usando le variabili di bind:

 SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Dopo aver eseguito la query sopra in SQL Developer, verrà richiesto di immettere il valore per la variabile bind EmployeeID.

Ok, so che è un po ‘un trucco, ma questo è un modo di usare una variabile in una semplice query, non uno script:

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

Puoi correre ovunque.

Puoi leggere altrove su variabili di sostituzione; sono abbastanza a portata di mano in SQL Developer. Ma ho difficoltà a provare a utilizzare le variabili di bind in SQL Developer. Questo è ciò che faccio:

 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 fa in modo che il testo possa essere stampato sulla console di output degli script.

Credo che quello che stiamo facendo sia ufficialmente chiamato PL / SQL. Abbiamo lasciato il terreno SQL puro e stiamo utilizzando un motore diverso in Oracle. Vedi la SELECT sopra? In PL / SQL devi sempre selezionare SELECT ... INTO una variabile o un refcursor. Non puoi semplicemente selezionare e restituire un set di risultati in PL / SQL.

Usa la prossima query:

 DECLARE EmpIDVar INT; BEGIN EmpIDVar := 1234; SELECT * FROM Employees WHERE EmployeeID = EmpIDVar; END; 

Prova questo funzionerà, è meglio creare una procedura, se la procedura non è ansible puoi usare questo script.

 with param AS( SELECT 1234 empid FROM dual) SELECT * FROM Employees, param WHERE EmployeeID = param.empid; END;