2011-11-07 11 views
6

Mimo że spędziłem godzinę na badaniu, nie potrafię wymyślić, jak poprawnie zdefiniować zmienną, a następnie użyć jej w SQL.Zwykła zmienna SQL Przypisanie SQL

To, co do tej pory produkowane:

których

DECLARE startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');

otrzymuję odpowiedź:

ORA-06550: linia 1 kolumna 63: PLS-00103: Napotkano symbol "koniec pliku", gdy oczekiwany jest jeden z następujących parametrów:

start function package pragma procedure type podtyp type use form current kursor

Szczegóły: DECLARE startDate DATA: = to_date ('03/11/2011 ', ' dd/mm/rrrr '); Błąd w linii 1 ORA 06550: wiersz 1, kolumna 63: PLS-00103: Napotkano symbol „EOF”, gdy oczekiwano jedną następujących:

rozpocząć pakiet funkcji procedura pragmy Podtyp formy użytkowe bieżący kursor

Chciałbym dowiedzieć się, jak wykonać takie proste zadanie!

+3

Zmienne są konstrukcją klienta. Musisz nam powiedzieć, z jakiego klienta korzystasz. – APC

+0

@APC - Używam TOAD –

Odpowiedz

10

Twoja deklaracja zmiennych jest poprawna.

Słowo kluczowe DECLARE służy do definiowania zmiennych mieszczących się w bloku PL/SQL (którego treść jest ograniczona przez BEGIN i END;). Jak chcesz używać tej zmiennej?

Poniższy PL/SQL działa dobrze dla mnie:

DECLARE 
    startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy'); 
    reccount INTEGER; 
BEGIN 
    SELECT count(*) INTO reccount 
     FROM my_table tab 
     WHERE tab.somedate < startDate; 
    dbms_output.put_line(reccount); 
END; 

Można również użyć instrukcji DEFINE używać prostych zmiennych podstawiania ciąg. Są odpowiednie dla klienta takiego jak SQL/PLUS lub TOAD.

DEFINE start_date = "to_date('03/11/2011', 'dd/mm/yyyy')" 
SELECT COUNT(*) from my_table tab where tab.some_date < &start_date; 
+1

Więc nie ma sposobu, aby zrobić to zwięźle jak w MS SQL, gdzie jest to prosta 'deklaracja @ zmienna @ zmienna @?". Chciałbym później użyć zmiennej w klauzuli WHERE, jak to zrobić? Jak mogę wydrukować zmienną na ekranie? –

+0

Nie jestem zaznajomiony z MS SQL, ale jeśli odnosisz się do jakiejś zmiennej globalnej, możliwe jest zdefiniowanie zmiennej w pakiecie, dzięki czemu jest ona widoczna dla wszystkich członków pakietu, nawet jeśli zmienne globalne są czymś, prawdopodobnie będę chciał tego uniknąć. Możesz wydrukować zmienną na ekranie za pomocą ['dbms_output.put_line'] (http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_output.htm#i1000105). –

+0

Nie zmienna globalna - po prostu normalna zmienna, którą mogę przypisać, a następnie użyć później. –

3

Weź pod uwagę, że Oracle PL/SQL jest nie SQL.

PL/SQL jest językiem proceduralnym. SQL nie jest proceduralny, ale możesz zdefiniować "zmienne", które użytkownik może wprowadzić za pomocą składni "& var" (patrz http://www.orafaq.com/node/515).

5

Aby osiągnąć to, czego próbujesz użyć w Ropie, nie musisz w ogóle deklarować zmiennej. Po prostu dodaj zmienną z dwukropkiem, a Ropucha wyświetli monit o podanie wartości zmiennej podczas wykonywania zapytania. Na przykład:

select * from all_tables where owner = :this_is_a_variable; 

Jeśli to nie zadziała na początku, kliknij prawym przyciskiem myszy w dowolnym miejscu w edytorze i upewnij się, że „Wiersz dla zmiennych podstawienie” jest zaznaczone.

Jeśli naprawdę chcesz to zrobić w sposób podobny do sposobu SQL Server obsługuje zmienne (lub chcesz być w stanie zrobić to samo w SQL * Plus), można napisać go w następujący sposób:

var this_is_a_variable varchar2(30); 

exec :this_is_a_variable := 'YOUR_SCHEMA_NAME'; 

print this_is_a_variable; 

select * from all_tables where owner = :this_is_a_variable; 

Jednak aby działało to w Ropie, musisz uruchomić go za pomocą polecenia "Execute as script", a nie za pomocą typowej komendy "Execute statement".

0

Czy możesz spróbować tego:

DEF startDate = to_date('03/11/2011', 'dd/mm/yyyy'); 
Select &startDate from dual; 
3

Jest to stary post, ale w przypadku gdy ktoś potknie się na tym (jak już nie), można sobie z tym poradzić z CTE:

with params as (
     select date '2011-11-03' as startdate 
     from dual 
    ) 
select . . . 
from params cross join 
    . . . 

Prawie taka sama składnia działa w SQL Server (pomijając date - specyficzne rzeczy i from dual).