2011-04-13 16 views
80

seguito è riportato un esempio di utilizzo di variabili in SQL Server 2000.Come utilizzare le variabili in Oracle SQL Developer?

DECLARE @EmpIDVar INT 

SET @EmpIDVar = 1234 

SELECT * 
FROM Employees 
WHERE EmployeeID = @EmpIDVar 

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

+0

Come stored procedure o come script? Se stai codificando il valore di EmpIDVar, perché utilizzare una variabile? – kurosch

risposta

11

Risposta semplice NO.

Tuttavia si può ottenere qualcosa di simile con il seguente versione che utilizza variabili di bind:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Una volta che si esegue la query sopra SQL Developer ti verrà richiesto di inserire il valore per la variabile di legatura EmployeeID.

45

In SQL * Plus, si può 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 una dichiarazione che ha un qualsiasi numero di variabili di bind (con prefisso due punti), ti verrà richiesto per inserire valori. Come sottolinea Alex, puoi anche fare qualcosa di simile usando la funzione "Esegui script" (F5) con la sintassi 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; 
+13

se si esegue 'script' (F5) invece di 'istruzione di esecuzione', allora non richiederà le variabili di binding. Ma non sembra gradire il 'select ... into' (ORA-01006), quindi dovresti fare' exec: v_emp_id: = 1234; 'invece. –

+0

@Alex - Bello! Ho appena rinunciato e ho assunto che SQL Developer chiedesse sempre i valori delle variabili di bind. Ho incorporato i tuoi suggerimenti nella mia risposta. –

+1

@Nathan se stai cercando di eseguire un pacchetto con: v_emp_id, puoi anche usare le variabili di bind per i refcursor. Vedi il fondo di Alex [risposta] (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from-an-oracle-package-procedure/3527037#3527037) a una domanda simile che avevo –

60

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

define value1 = 'sysdate' 

SELECT &&value1 from dual; 

Inoltre è il modo più destro qui presentata, ancora.

(Se si omette il "definire" -parte ti verrà richiesto per quel valore)

+12

funziona anche con uno solo & –

+8

Se si confrontano && valore1 in un valore di stringa come: && value1 = 'Some string' then && value1 deve essere racchiuso tra virgolette come: '&& value1' = 'Some string' –

+1

In SQL Developer, variabili di sostituzione definite da DEFINE sembra essere persistente tra le esecuzioni di query. Se cambio il valore della variabile, ma non evidenzi esplicitamente la riga DEFINE durante l'esecuzione, rimane il valore precedente. (Questo a causa del doppio &&?) – Baodad

49

Ci sono due tipi di variabili in SQL-plus: sostituzione e legano.

Questo è (variabili di sostituzione possono sostituire le opzioni comando SQL * Plus o altro testo hard-coded) sostituzione:

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

Questo è legano (variabili di bind valori dei dati del deposito di SQL e PL/istruzioni SQL eseguite in RDBMS, possono contenere valori singoli o gruppi 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 variabili di sostituzione, ma quando eseguire una query con la sintassi :var associata al bind (richiesto in una finestra di dialogo).

Riferimento:

UPDATEsostituzione variabili sono un po 'difficile 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 
+2

Ho provato il binding in SQL Developer (4.1.1.19) e funziona anche. Intendo il caso con 'var x' e' exec: x', nessun prompt. – Betlista

4

Puoi leggere altrove su substi variabili del tution; sono abbastanza a portata di mano in SQL Developer. Ma ho difficoltà a provare a utilizzare le variabili di bind in SQL Developer. Questo è quello 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 lo rende così il testo può essere stampato sulla console output dello script.

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

5

Ok So che questo un po 'di un hack, ma questo un modo per utilizzare 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; 

Si arriva a eseguirlo ovunque.

+0

C'è un modo per usarlo con UPDATE invece di selezionare? –

0

utilizzare la query seguente:

DECLARE 
    EmpIDVar INT; 

BEGIN 
    EmpIDVar := 1234; 

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

Prova questo funzionerà, è meglio creare una procedura, se procedura non è possibile è possibile utilizzare questo script.

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