sql >> Database >  >> RDS >> Oracle

Variabelen declareren en instellen in een Select-statement

Uit het zoeken dat ik heb gedaan, blijkt dat je variabelen zoals deze niet kunt declareren en instellen in Select-statements. Klopt dit of mis ik iets?

Binnen Oracle zijn PL/SQL en SQL twee aparte talen met twee aparte engines. Je kunt SQL DML insluiten in PL/SQL, en dat levert variabelen op. Zoals het volgende anonieme PL/SQL-blok. Let op de / aan het einde maakt geen deel uit van PL/SQL, maar vertelt SQL*Plus om het voorgaande blok te verzenden.

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

Het probleem is dat een blok dat gelijk is aan uw T-SQL-code niet zal werken:

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

Om de resultaten van een query uit een PL/SQL, ofwel een anoniem blok, een opgeslagen procedure of een opgeslagen functie, door te geven, moet een cursor worden gedeclareerd, geopend en vervolgens teruggestuurd naar het aanroepende programma. (Buiten het bereik van het beantwoorden van deze vraag. EDIT: zie Resultatenset ophalen van opgeslagen procedure in orakel)

Het clienthulpprogramma dat verbinding maakt met de database, heeft mogelijk zijn eigen bindvariabelen. In 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

Let op:het bovenstaande is in SQLPlus, werkt mogelijk niet (waarschijnlijk niet) in Toad PL/SQL-ontwikkelaar, enz. De regels die beginnen met variabele en exec zijn SQL Plus commando's. Het zijn geen SQL- of PL/SQL-opdrachten. Geen rijen geselecteerd omdat de tabel leeg is.



  1. Onbeantwoorde vragen over MS SQL Server-beveiliging en toegangscontrole

  2. CTE-recursie om boomhiërarchie te krijgen

  3. Zoeken in volledige tekst gebruiken in SQL Server 2008 voor meerdere tabellen, kolommen

  4. Wat is subquery's in orakel