2010-08-03 8 views
17

Ich versuche eine einfache Abfrage zu schreiben, in der ich einige Variablen deklariere und sie dann in einer select-Anweisung in Oracle verwende. Ich habe in der Lage gewesen, diese zuvor in SQL Server zu tun, mit dem folgenden:Deklarieren und Festlegen von Variablen in einer Select-Anweisung

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

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

Von der Suche ich getan habe, scheint es, können Sie in Select-Anweisungen nicht deklarieren und Variablen wie folgt festgelegt. Ist das richtig oder messe ich etwas?

Antwort

16

Von der Suche ich getan habe, es scheint, kann man nicht erklären und Aussagen in Select Variablen wie folgt festgelegt. Ist das richtig oder fehlt mir etwas?

Innerhalb von Oracle PL/SQL und SQL sind zwei separate Sprachen mit zwei separaten Engines. Sie können SQL-DML in PL/SQL einbetten, und dadurch erhalten Sie Variablen. Wie der folgende anonyme PL/SQL-Block. Beachten Sie, dass die / am Ende nicht Teil von PL/SQL ist, sondern SQL * Plus anweist, den vorhergehenden 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 besteht darin, dass ein Block, der zu Ihrem T-SQL-Code entspricht nicht funktionieren:

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-Pass, entweder anonym Block, gespeicherte Prozedur oder gespeicherte Funktion, muss ein Cursor deklariert, geöffnet und dann an das aufrufende Programm zurückgegeben werden. (Über den Rahmen der Beantwortung dieser Frage EDIT:. siehe Get resultset from oracle stored procedure)

Der Client-Tool, das mit der Datenbank verbindet haben kann seine eigene Bind-Variablen. 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 die oben in SQL Plus kann nicht (wahrscheinlich nicht) arbeiten in Toad PL/SQL-Entwickler, usw. Die Linien mit variabler und exec sind Start-SQL plus Befehle. Sie sind keine SQL- oder PL/SQL-Befehle. Keine Zeilen ausgewählt, da die Tabelle leer ist.

+4

+1: Das ist keine Antwort, das ist eine * Dissertation *! –

+0

+1 einverstanden mit @OMG Ponys :) – ThinkJet

+0

+1 ebenfalls TJ! –

0

Versuchen Sie die to_date Funktion.

+0

Ich bin im Wesentlichen einen Datumswert (oder einen VARCHAR2-Wert) und verweisen Sie dann in der select-Anweisung zu setzen versucht. Ich dachte, das TO_DATE wäre eher eine Funktion, um eine Zeichenfolge in ein Oracle-Datum zu konvertieren. –

1

Der SET Befehl TSQL spezifisch - hier ist der PLSQL entspricht dem, was Sie auf dem Laufenden:

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

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

Es gibt auch keine Notwendigkeit für Variablen mit „@“ vorangestellt; Ich neige dazu, Variable mit "v_" zu präfixieren, um zwischen Variablen & Spalten/etc. Zu unterscheiden.

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

2

Ich habe dies versucht, und es hat funktioniert:

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

select * from proposal where prop_start_dt = &PROPp_START_DT 

 

Verwandte Themen