sql >> Base de Datos >  >> RDS >> Oracle

Declaración y configuración de variables en una declaración de selección

De la búsqueda que he hecho, parece que no puede declarar y establecer variables como esta en declaraciones Select. ¿Es esto correcto o me estoy perdiendo algo?

Dentro de Oracle PL/SQL y SQL hay dos lenguajes separados con dos motores separados. Puede incrustar SQL DML dentro de PL/SQL, y eso le dará variables. Como el siguiente bloque PL/SQL anónimo. Tenga en cuenta el / al final no es parte de PL/SQL, pero le dice a SQL*Plus que envíe el bloque 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;
/

El problema es que un bloque equivalente a su código T-SQL no 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 pasar los resultados de una consulta de un PL/SQL, ya sea un bloque anónimo, un procedimiento almacenado o una función almacenada, se debe declarar un cursor, abrirlo y luego devolverlo al programa de llamada. (Más allá del alcance de responder esta pregunta. EDITAR: consulte Obtener conjunto de resultados del procedimiento almacenado de Oracle)

La herramienta cliente que se conecta a la base de datos puede tener sus propias variables de vinculación. 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

Tenga en cuenta que lo anterior está en SQLPlus, es posible que no funcione (probablemente no funcione) en el desarrollador Toad PL/SQL, etc. Las líneas que comienzan con variable y exec son SQL Más comandos. No son comandos SQL o PL/SQL. No se seleccionaron filas porque la tabla está vacía.