Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Deklarowanie i ustawianie zmiennych w instrukcji Select

Z przeprowadzonego przeze mnie wyszukiwania wynika, że ​​nie można deklarować i ustawiać zmiennych w ten sposób w instrukcjach Select. Czy to prawda, czy czegoś mi 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 da ci zmienne. Takich jak następujący anonimowy blok PL/SQL. Zwróć uwagę na / 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;
/

Problem polega na tym, że blok, który jest odpowiednikiem twojego kodu T-SQL, nie zadział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

Aby przekazać wyniki zapytania z PL/SQL, anonimowego bloku, procedury składowanej lub funkcji składowanej, kursor musi być zadeklarowany, otwarty, a następnie zwrócony do programu wywołującego. (Poza zakresem odpowiedzi na to pytanie. EDYTUJ: zobacz Pobierz zestaw wyników z procedury składowanej Oracle)

Narzędzie klienta, które łączy się z bazą danych, może mieć własne zmienne wiązania. 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

Zauważ, że powyższe jest w SQLPlus, może nie (prawdopodobnie nie będzie) działać w Toad PL/SQL developer itp. Wiersze zaczynające się od zmiennej i exec to SQL Plus polecenia. Nie są to polecenia SQL ani PL/SQL. Nie wybrano wierszy, ponieważ tabela jest pusta.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle INSERT do dwóch tabel w jednym zapytaniu

  2. Jak wywołać funkcję lub procedurę składowaną Oracle przy użyciu frameworka trwałości wiosennej?

  3. Nowe funkcje bazy danych Oracle 20c

  4. Polityka poprawek

  5. N-ta maksymalna pensja w Oracle