2010-08-03 16 views
17

Sto tentando di scrivere una query semplice in cui dichiaro alcune variabili e quindi le utilizzo in un'istruzione select in Oracle. Sono stato in grado di farlo prima in SQL Server con il seguente:Dichiarazione e impostazione di variabili in un'istruzione Select

DECLARE @date1 DATETIME 
SET @date1 = '03-AUG-2010' 

SELECT U.VisualID 
FROM Usage u WITH(NOLOCK) 
WHERE U.UseTime > @Date1 

Dalla ricerca che ho fatto sembra non è possibile dichiarare e impostare le variabili di questo tipo in istruzioni Select. È giusto o sto facendo qualcosa?

risposta

16

Dalla ricerca che ho fatto sembra non è possibile dichiarare e impostare le variabili di questo tipo in istruzioni Select. È giusto o mi manca qualcosa?

All'interno di Oracle PL/SQL e SQL sono due lingue separate con due motori separati. È possibile incorporare DML SQL in PL/SQL e questo otterrà variabili. Come il seguente blocco anonimo PL/SQL. Notare che lo / alla fine non fa parte di PL/SQL, ma indica a SQL * Plus di inviare il blocco precedente.

declare 
    v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY'); 
    v_Count number; 
begin 
    select count(*) into v_Count 
    from Usage 
    where UseTime > v_Date1; 
    dbms_output.put_line(v_Count); 
end; 
/

Il problema è che un blocco che è equivalente al codice T-SQL non funziona:

SQL> declare 
    2  v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY'); 
    3 begin 
    4  select VisualId 
    5  from Usage 
    6  where UseTime > v_Date1; 
    7 end; 
    8/
    select VisualId 
    * 
ERROR at line 4: 
ORA-06550: line 4, column 5: 
PLS-00428: an INTO clause is expected in this SELECT statement 

per passare i risultati di una query di un PL/SQL, sia un anonimo blocco, stored procedure o funzione memorizzata, un cursore deve essere dichiarato, aperto e quindi restituito al programma chiamante. (Al di là del campo di applicazione della rispondere a questa domanda EDIT:. vedi Get resultset from oracle stored procedure)

Lo strumento client che si connette al database può avere il proprio le variabili di bind. In SQL * Plus:

SQL> -- SQL*Plus does not all date type in this context 
SQL> -- So using varchar2 to hold text 
SQL> variable v_Date1 varchar2(20) 
SQL> 
SQL> -- use PL/SQL to set the value of the bind variable 
SQL> exec :v_Date1 := '02-Aug-2010'; 

PL/SQL procedure successfully completed. 

SQL> -- Converting to a date, since the variable is not yet a date. 
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1 
SQL> -- is a bind variable. 
SQL> select VisualId 
    2 from Usage 
    3 where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY'); 

no rows selected 

Nota quanto sopra è in SQL Inoltre, non può (probabilmente no) lavorare in Toad PL sviluppatore/SQL, ecc Le linee che iniziano con variabile e exec sono SQL più comandi. Non sono comandi SQL o PL/SQL. Nessuna riga selezionata perché la tabella è vuota.

+4

+1: Questa non è una risposta, questa è una * dissertazione *! –

+0

+1 concorda con @OMG Ponies :) – ThinkJet

+0

+1 allo stesso modo TJ! –

0

Provare la funzione to_date.

+0

sto essenzialmente cercando di impostare un valore di data (o un valore VARCHAR2) e quindi fare riferimento nella dichiarazione prescelta. Pensavo che TO_DATE fosse più una funzione per convertire una stringa in una data Oracle. –

1

Il comando SET è TSQL specifico - ecco il PLSQL equivalente a quello che hai postato:

v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY'); 

SELECT u.visualid 
    FROM USAGE u 
WHERE u.usetime > v_date1; 

C'è anche bisogno di prefisso variabili con "@"; Tendo a prefisso variabili con "v_" per distinguere tra variabili & colonne/ecc.

Vedi this thread about the Oracle equivalent of NOLOCK ...

2

Ho provato questo e ha funzionato:

define PROPp_START_DT = TO_DATE('01-SEP-1999') 

select * from proposal where prop_start_dt = &PROPp_START_DT 

 

Problemi correlati