Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Declarando e Configurando Variáveis ​​em uma Instrução Select


A partir da pesquisa que fiz, parece que você não pode declarar e definir variáveis ​​como esta em instruções Select. Isso está certo ou estou perdendo alguma coisa?

Dentro do Oracle PL/SQL e SQL são duas linguagens separadas com dois mecanismos separados. Você pode incorporar SQL DML dentro de PL/SQL, e isso lhe dará variáveis. Como o seguinte bloco PL/SQL anônimo. Observe o / no final não faz parte do PL/SQL, mas diz ao SQL*Plus para enviar o bloco anterior.
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;
/

O problema é que um bloco equivalente ao seu código T-SQL não funcionará:
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

Para passar os resultados de uma consulta de uma PL/SQL, seja um bloco anônimo, procedimento armazenado ou função armazenada, um cursor deve ser declarado, aberto e depois retornado ao programa chamador. (Além do escopo de responder a esta pergunta. EDIT: consulte Obter conjunto de resultados do procedimento armazenado do Oracle)

A ferramenta cliente que se conecta ao banco de dados pode ter suas próprias variáveis ​​de ligação. No 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

Observe que o acima está em SQLPlus, pode não funcionar (provavelmente não funcionará) no desenvolvedor Toad PL/SQL, etc. As linhas que começam com variável e exec são SQL Mais comandos. Eles não são comandos SQL ou PL/SQL. Nenhuma linha selecionada porque a tabela está vazia.