Oracle
 sql >> Database >  >> RDS >> Oracle

Dichiarazione e impostazione di variabili in un'istruzione Select

Dalla ricerca che ho fatto sembra che non puoi dichiarare e impostare variabili come questa nelle istruzioni Select. È giusto o mi sfugge qualcosa?

All'interno di Oracle PL/SQL e SQL sono due linguaggi separati con due motori separati. Puoi incorporare SQL DML all'interno di PL/SQL e questo ti darà variabili. Come il seguente blocco PL/SQL anonimo. Nota il / alla fine non fa parte di PL/SQL, ma dice 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 equivalente al tuo codice T-SQL non funzionerà:

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 da un PL/SQL, un blocco anonimo, una procedura memorizzata o una funzione memorizzata, è necessario dichiarare, aprire e quindi restituire un cursore al programma chiamante. (Al di là dello scopo della risposta a questa domanda. EDIT: vedi Ottieni set di risultati dalla procedura memorizzata Oracle)

Lo strumento client che si connette al database potrebbe avere le proprie variabili di collegamento. 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 SQLPlus, potrebbe non funzionare (probabilmente non funzionerà) nello sviluppatore Toad PL/SQL, ecc. Le righe che iniziano con variabile ed exec sono SQL Più comandi. Non sono comandi SQL o PL/SQL. Nessuna riga selezionata perché la tabella è vuota.