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.
+1: Questa non è una risposta, questa è una * dissertazione *! –
+1 concorda con @OMG Ponies :) – ThinkJet
+1 allo stesso modo TJ! –