2010-08-03 11 views
17

Próbuję napisać proste zapytanie, w którym deklaruję niektóre zmienne, a następnie używam ich w instrukcji select w Oracle. Byłem w stanie to zrobić, zanim w SQL Server z następujących czynności:Deklarowanie i ustawianie zmiennych w instrukcji Select

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

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

Z poszukiwań robiłem wydaje się nie można zadeklarować i ustawić zmienne jak to w instrukcji SELECT. Czy to prawda, czy coś robię?

Odpowiedz

16

Z poszukiwań robiłem wydaje się nie można zadeklarować i ustawić zmienne jak to w instrukcji SELECT. Czy to prawda, czy też czegoś brakuje?

W Oracle PL/SQL i SQL są dwa oddzielne języki z dwoma oddzielnymi silnikami. Możesz osadzić SQL DML w PL/SQL, a to dostaniesz zmienne. Takich jak następujący anonimowy blok PL/SQL. Zauważ, że / na końcu nie jest częścią PL/SQL, ale mówi SQL * Plus, aby wysłać poprzedni blok.

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

Problemem jest to, że blok, który jest odpowiednikiem kodu T-SQL nie będą działać:

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 

przekazać wyniki kwerendy z w PL/SQL, bądź anonimowy blok, procedura składowana lub funkcja zapisana, kursor musi zostać zadeklarowany, otwarty, a następnie powrócony do programu wywołującego. (Poza zakresem od odpowiedzi na to pytanie EDIT:. zobaczyć Get resultset from oracle stored procedure)

Narzędzie klienta, który łączy się z bazą danych może mieć swoje własne zmienne związać. W 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 

Uwaga powyższa jest w SQL Plus, może nie (pewnie nie) pracować w Toad PL/SQL Developer, itp Linie zaczynające się od zmiennej i exec są SQL Plus polecenia. Nie są to polecenia SQL ani PL/SQL. Nie wybrano żadnych wierszy, ponieważ tabela jest pusta.

+4

+1: To nie jest odpowiedź, to * rozprawa *! –

+0

+1 zgadzam się z @OMG Kucyki :) – ThinkJet

+0

+1 podobnie TJ! –

0

Wypróbuj funkcję to_date.

+0

jestem zasadniczo próbuje ustawić wartość daty (lub wartość VARCHAR2), a następnie odwołać go w SELECT. Sądziłem, że TO_DATE jest bardziej funkcją konwersji ciągu znaków w datę Oracle. –

1

Komenda SET TSQL jest specyficzna - tutaj jest równoznaczne PLSQL do tego, co napisali:

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

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

Tam też nie ma potrzeby poprzedzania zmiennych z „@”; Mam tendencję do przedrostowania zmiennych za pomocą "v_", aby rozróżnić zmienne & kolumn/etc.

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

2

Próbowałem to i to działało:

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

select * from proposal where prop_start_dt = &PROPp_START_DT 

 

Powiązane problemy