Come si utilizzano le variabili in Oracle SQL Developer?


116

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Voglio fare la stessa identica 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?


Come stored procedure o come script? Se stai codificando il valore per EmpIDVar, perché usare una variabile?
kurosch

Risposte:


95

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

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

(Se ometti la parte "define" ti verrà chiesto di inserire quel valore)


12
Se si confronta && valore1 con un valore stringa come: && valore1 = 'Some string', && value1 deve essere racchiuso tra virgolette singole come: '&& value1' = 'Some string'
Ryan E

1
In SQL Developer, le variabili di sostituzione definite da DEFINE sembrano essere persistenti tra le esecuzioni delle query. Se cambio il valore della variabile, ma non evidenzio esplicitamente la riga DEFINE durante l'esecuzione, il valore precedente rimane. (È a causa del doppio &&?)
Baodad

9
Questa pagina nella sezione 2.4 parla della differenza tra la e commerciale singola (&) e la doppia e commerciale (&&)
Baodad

1
Per quelli di noi abituati a lavorare con query con variabili in Microsoft SQL Server Management Studio, questa è la risposta migliore. Tuttavia, potrebbe essere necessario abituarsi a evidenziare l'intera query prima dell'esecuzione.
Baodad

Questa risposta è stata la soluzione che ha funzionato per me in SQL-Developer 2.1. È sicuramente il metodo più semplice per implementare un modo per l'utente di modificare un valore sopra la query e non dover modificare la query stessa.
YonkeyDonk64

74

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

Questa è la sostituzione (le variabili di sostituzione possono sostituire le opzioni del comando SQL * Plus o altro testo hardcoded):

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

Questo è bind (le variabili bind memorizzano i valori dei dati per le istruzioni SQL e PL / SQL eseguite nell'RDBMS; possono contenere valori singoli 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 la :varsintassi di bind , viene richiesto il collegamento (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 stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string

2
Ho provato il bind in SQL Developer (4.1.1.19) e funziona anche lui. Intendo il caso con var xe exec :x, nessun prompt.
Betlista

50

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 esegui un'istruzione che ha un numero qualsiasi di variabili di associazione (precedute da due punti), ti verrà chiesto di inserire i valori. Come sottolinea Alex, puoi anche fare qualcosa di simile usando la funzione "Esegui script" (F5) con la sintassi EXEC alternativa che Alex suggerisce di fare.

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;

14
se "esegui script" (F5) invece di "esegui istruzione", non verranno richieste le variabili di associazione. Ma non sembra gradire select...into(ORA-01006), quindi dovresti farlo exec :v_emp_id := 1234;invece.
Alex Poole

@Alex - Bello! Mi sono arreso e ho pensato che SQL Developer richiedesse sempre i valori delle variabili di associazione. Ho incorporato i tuoi suggerimenti nella mia risposta.
Justin Cave

1
@ Nathan se stai cercando di eseguire un pacchetto con: v_emp_id, puoi usare anche le variabili di bind per i refcursors. Vedi la parte inferiore della risposta di Alex a una domanda simile che avevo
Conrad Frix

2
@AlexPoole c'è un modo per inviare l'output alla finestra dei risultati della query? Nel mio lavoro eseguo query per esportare in file Excel.
tp9

13

Ok, lo so che questo è un po 'un trucco, 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;

Puoi eseguirlo ovunque.


C'è un modo per usarlo con UPDATE invece di selezionare?
Ron Jensen - Siamo tutti Monica il

12

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 precedente in SQL Developer, ti verrà chiesto di inserire il valore per la variabile di associazione EmployeeID.


8

Puoi leggere altrove sulle variabili di sostituzione; sono abbastanza utili in SQL Developer. Ma ho dei tentativi di utilizzare le variabili di associazione 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 nella console di output dello script.

Credo che quello che stiamo facendo qui sia ufficialmente chiamato PL / SQL. Abbiamo lasciato la pura terra SQL e stiamo utilizzando un motore diverso in Oracle. Vedi quanto SELECTsopra? In PL / SQL devi sempre scegliere SELECT ... INTOuna variabile o un refcursor. Non puoi semplicemente SELECTrestituire un set di risultati in PL / SQL.


2

Penso che il modo più semplice nel tuo caso sia:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Per i valori di stringa sarà come:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

Utilizza la query successiva:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

errore restituito "PLS-00428 una clausola INTO è prevista in questa istruzione SELECT"
Thundter

0

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

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

0

Nello sviluppatore sql definire le proprietà per impostazione predefinita "ON". Se è comunque "OFF", utilizzare i passaggi seguenti.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.