2010-08-03 18 views
17

Estoy intentando escribir una consulta simple donde declaro algunas variables y luego las uso en una declaración select en Oracle. He sido capaz de hacer esto antes en SQL Server con lo siguiente:Declaración y configuración de variables en una instrucción Select

DECLARE @date1 DATETIME 
SET @date1 = '03-AUG-2010' 

SELECT U.VisualID 
FROM Usage u WITH(NOLOCK) 
WHERE U.UseTime > @Date1 

A partir de la búsqueda que he hecho, parece que no se puede declarar y establecer las variables de este tipo en las sentencias SELECT. ¿Es esto correcto o estoy alterando algo?

Respuesta

16

A partir de la búsqueda que he hecho, parece que no se puede declarar y establecer las variables de este tipo en las sentencias SELECT. ¿Es correcto o me estoy perdiendo algo?

Dentro de Oracle PL/SQL y SQL hay dos idiomas separados con dos motores separados. Puede incrustar SQL DML dentro de PL/SQL, y eso le dará variables. Como el siguiente bloque anónimo de PL/SQL. Tenga en cuenta que 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 que es equivalente a su código de 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 anónimo bloque, procedimiento almacenado o función almacenada, un cursor debe ser declarado, abierto y luego devuelto al programa que realiza la llamada. (Más allá del alcance de responder a esta pregunta EDIT:. ver Get resultset from oracle stored procedure)

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

cuenta que lo anterior es en SQL Además, puede que no (probablemente no) trabajar en sapo PL/SQL Developer, etc. Las líneas que comienzan con la variable y ejecutivo son SQL Plus comandos. No son comandos SQL o PL/SQL. No hay filas seleccionadas porque la tabla está vacía.

+4

+1: ¡Esa no es una respuesta, es una * disertación *! –

+0

+1 de acuerdo con @OMG Ponies :) – ThinkJet

+0

+1 también TJ! –

0

Pruebe la función to_date.

+0

estoy esencialmente tratando de establecer un valor de fecha (o un valor VARCHAR2) y luego hacer referencia en la instrucción SELECT. Pensé que TO_DATE era más una función para convertir una cadena en una fecha de Oracle. –

1

El comando TSQL SET es específica - aquí está la PLSQL equivalente a lo que usted envió:

v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY'); 

SELECT u.visualid 
    FROM USAGE u 
WHERE u.usetime > v_date1; 

Tampoco hay necesidad de prefijar las variables con "@"; Tiendo a prefijar las variables con "v_" para distinguir entre las variables & columnas/etc.

Ver this thread about the Oracle equivalent of NOLOCK ...

2

He intentado esto y funcionó:

define PROPp_START_DT = TO_DATE('01-SEP-1999') 

select * from proposal where prop_start_dt = &PROPp_START_DT 

 

Cuestiones relacionadas