Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Deklarieren und Setzen von Variablen in einer Select-Anweisung

Aus der Suche, die ich durchgeführt habe, scheint es, dass Sie Variablen wie diese in Select-Anweisungen nicht deklarieren und setzen können. Stimmt das oder übersehe ich etwas?

Innerhalb von Oracle sind PL/SQL und SQL zwei separate Sprachen mit zwei separaten Engines. Sie können SQL DML in PL/SQL einbetten und erhalten dadurch Variablen. Wie der folgende anonyme PL/SQL-Block. Beachten Sie den / am Ende ist kein Teil von PL/SQL, weist aber SQL*Plus an, den vorangehenden Block zu senden.

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;
/

Das Problem ist, dass ein Block, der Ihrem T-SQL-Code entspricht, nicht funktioniert:

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

Um die Ergebnisse einer Abfrage aus einem PL/SQL herauszugeben, muss entweder ein anonymer Block, eine gespeicherte Prozedur oder eine gespeicherte Funktion ein Cursor deklariert, geöffnet und dann an das aufrufende Programm zurückgegeben werden. (Über den Rahmen der Beantwortung dieser Frage hinaus. EDIT: siehe Ergebnismenge aus gespeicherter Oracle-Prozedur abrufen)

Das Client-Tool, das eine Verbindung zur Datenbank herstellt, kann eigene Bind-Variablen haben. 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

Beachten Sie, dass das Obige in SQLPlus ist, möglicherweise nicht (wahrscheinlich nicht) in Toad PL/SQL-Entwickler usw. funktioniert. Die Zeilen, die mit variable und exec beginnen, sind SQL Plus-Befehle. Sie sind keine SQL- oder PL/SQL-Befehle. Keine Zeilen ausgewählt, da die Tabelle leer ist.