sql >> Databasteknik >  >> RDS >> Oracle

Deklarera och ställa in variabler i ett urvalsutdrag

Från sökningen jag har gjort verkar det som att du inte kan deklarera och ställa in variabler så här i Select-satser. Stämmer detta eller har jag missat något?

Inom Oracle är PL/SQL och SQL två separata språk med två separata motorer. Du kan bädda in SQL DML i PL/SQL, så får du variabler. Såsom följande anonyma PL/SQL-block. Notera / i slutet är inte en del av PL/SQL, men säger åt SQL*Plus att skicka föregående block.

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

Problemet är att ett block som motsvarar din T-SQL-kod inte kommer att fungera:

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

För att skicka ut resultatet av en fråga från en PL/SQL, antingen ett anonymt block, en lagrad procedur eller en lagrad funktion, måste en markör deklareras, öppnas och sedan återgå till det anropande programmet. (Utanom räckvidden för att besvara den här frågan. EDIT: se Hämta resultat från oracles lagrade procedur)

Klientverktyget som ansluter till databasen kan ha sina egna bindningsvariabler. I 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

Observera att ovanstående är i SQLPlus, kanske inte (kommer förmodligen inte) att fungera i Toad PL/SQL-utvecklare, etc. Raderna som börjar med variabel och exec är SQL Plus kommandon. De är inte SQL- eller PL/SQL-kommandon. Inga rader markerade eftersom tabellen är tom.



  1. Ändra kolumntyper i en stor tabell

  2. Oväntad variabeltyp som returneras av Receive-Job

  3. Vilka rader returneras när du använder LIMIT med OFFSET i MySQL?

  4. Hur man anropar en lagrad procedur i JDBC