sql >> Databáze >  >> RDS >> Oracle

Deklarování a nastavení proměnných v příkazu Select

Z vyhledávání, které jsem provedl, se zdá, že nemůžete deklarovat a nastavovat proměnné jako je tato v příkazech Select. Je to správně, nebo mi něco uniká?

V rámci Oracle jsou PL/SQL a SQL dva samostatné jazyky se dvěma samostatnými motory. Můžete vložit SQL DML do PL/SQL a tím získáte proměnné. Jako například následující anonymní blok PL/SQL. Všimněte si / na konci není součástí PL/SQL, ale říká SQL*Plus, aby poslal předchozí 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;
/

Problém je v tom, že blok, který je ekvivalentní vašemu T-SQL kódu, nebude fungovat:

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

Chcete-li předat výsledky dotazu z PL/SQL, buď anonymního bloku, uložené procedury nebo uložené funkce, musí být kurzor deklarován, otevřen a poté vrácen volajícímu programu. (Přesahuje rámec odpovědi na tuto otázku. UPRAVIT: viz Získat sadu výsledků z uložené procedury Oracle)

Klientský nástroj, který se připojuje k databázi, může mít vlastní proměnné vazby. V 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

Všimněte si, že výše uvedené je v SQLPlus, nemusí (pravděpodobně nebude) fungovat ve vývojáři Toad PL/SQL atd. Řádky začínající proměnnou a exec jsou SQL Plus příkazy. Nejsou to příkazy SQL nebo PL/SQL. Nejsou vybrány žádné řádky, protože tabulka je prázdná.



  1. Nelze získat přístup k předvyplněné databázi SQLite pomocí PhoneGap/Cordova v systému Android

  2. Jak mohu manipulovat s relevanci fulltextového vyhledávání MySQL, aby bylo jedno pole „hodnotnější“ než jiné?

  3. Eliminace duplikace výrazů Where v aplikaci

  4. Jak vytvořit omezení CHECK v SQL Server (příklady T-SQL)