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.
+1: To nie jest odpowiedź, to * rozprawa *! –
+1 zgadzam się z @OMG Kucyki :) – ThinkJet
+1 podobnie TJ! –