sql >> Database teknologi >  >> RDS >> Oracle

Erklæring og indstilling af variabler i en udvalgt erklæring

Ud fra den søgning, jeg har foretaget, ser det ud til, at du ikke kan erklære og indstille variabler som denne i Select-udsagn. Er det rigtigt, eller mangler jeg noget?

Inden for Oracle er PL/SQL og SQL to separate sprog med to separate motorer. Du kan indlejre SQL DML i PL/SQL, og det vil give dig variabler. Såsom følgende anonyme PL/SQL-blok. Bemærk / i slutningen er ikke en del af PL/SQL, men fortæller SQL*Plus at sende den foregående 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;
/

Problemet er, at en blok, der svarer til din T-SQL-kode, ikke virker:

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

For at sende resultaterne af en forespørgsel ud af en PL/SQL, enten en anonym blok, lagret procedure eller lagret funktion, skal en markør erklæres, åbnes og derefter returneres til det kaldende program. (Ud over omfanget af at besvare dette spørgsmål. EDIT: se Få resultatsæt fra oracle-lagret procedure)

Klientværktøjet, der forbinder til databasen, kan have sine egne bindevariabler. 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

Bemærk, at ovenstående er i SQLPlus, fungerer muligvis ikke (vil sandsynligvis ikke) i Toad PL/SQL-udvikler osv. Linjerne, der starter med variabel og exec, er SQL Plus kommandoer. De er ikke SQL- eller PL/SQL-kommandoer. Ingen rækker valgt, fordi tabellen er tom.



  1. Oracle DBA spørgsmål i realtid

  2. Hvordan konverterer jeg et interval til et antal timer med postgres?

  3. Hvordan sender man vilkårlige parametre til Oracle trigger?

  4. Sådan fungerer TIMEDIFF() i MariaDB