Oracle
 sql >> Base de données >  >> RDS >> Oracle

Déclarer et définir des variables dans une instruction Select

D'après les recherches que j'ai effectuées, il semble que vous ne pouvez pas déclarer et définir des variables comme celle-ci dans les instructions Select. Est-ce exact ou ai-je raté quelque chose ?

Dans Oracle, PL/SQL et SQL sont deux langages distincts avec deux moteurs distincts. Vous pouvez intégrer SQL DML dans PL/SQL, et cela vous donnera des variables. Comme le bloc PL/SQL anonyme suivant. Notez le / à la fin ne fait pas partie de PL/SQL, mais indique à SQL*Plus d'envoyer le bloc précédent.

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

Le problème est qu'un bloc équivalent à votre code T-SQL ne fonctionnera pas :

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

Pour transmettre les résultats d'une requête hors d'un PL/SQL, qu'il s'agisse d'un bloc anonyme, d'une procédure stockée ou d'une fonction stockée, un curseur doit être déclaré, ouvert puis renvoyé au programme appelant. (Au-delà de la portée de répondre à cette question. EDIT : voir Obtenir le jeu de résultats à partir de la procédure stockée oracle)

L'outil client qui se connecte à la base de données peut avoir ses propres variables de liaison. En 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

Notez que ce qui précède est en SQLPlus, peut ne pas (probablement pas) fonctionner dans le développeur Toad PL/SQL, etc. Les lignes commençant par variable et exec sont SQL Commandes en plus. Ce ne sont pas des commandes SQL ou PL/SQL. Aucune ligne sélectionnée car le tableau est vide.