2012-02-23 11 views
8

Tengo algunas consultas SELECT diferentes con los mismos valores. Quiero usar algo como DECLARAR, pero cuando escribo un DECLARACIÓN simple, dice que se espera "INTO".Simple "SELECCIONAR" con variable pero sin "INTO"

Si solo quiero un "SELECCIONAR", ¿cómo puedo usar este formulario sin "INTO"?

me he limitado a dos (o más) selecciona:

SELECT * FROM my_table1 WHERE column1=5 and column2=6; 

y

SELECT * FROM my_table2 WHERE col1=5 and col2=6; 

Ahora quiero declarar una variable como var_col1 y var_col2 y utilizarlos tanto en las consultas de selección al mismo hora.

pensé que esto funcionaría:

DECLARE 
var_col1 number := 5; 
var_vol2 number := 6; 
BEGIN 
SELECT * FROM my_table1 WHERE column1=var_col1 and column2=var_col2; 
SELECT * FROM my_table2 WHERE col1=var_col1 and col2=var_col1; 
/* and more SELECTs with var_col1 and var_col2 */ 
END; 

Pero ninguna posibilidad ... ¿Cómo es la manera de hacer eso sin un procedimiento o función?

+0

¿Qué cliente SQL está utilizando? –

+0

PL/SQL Developer –

Respuesta

6

Cuando escribe select * from some_table; en SQL * Plus, SQL*Plus actúa como el programa cliente, y hace mucho trabajo para usted, bajo las sábanas, en términos de los datos que se devuelven desde la base de datos, formateándolo y mostrándolo .

Tan pronto como escriba DECLARE, comenzará un bloque PL/SQL. Ahora, estás llamando a PL/SQL, y PL/SQL llama a SQL. Como resultado, debe decidir cómo manejar los datos que se devuelven desde el SQL, en PL/SQL. La forma de hacerlo es mediante una cláusula INTO y una variable para recibir la salida. Teniendo en cuenta que, ¿dónde irían los datos de salida del SELECT, si no proporciona una cláusula INTO? Tiene que ir a algún lado, ¿verdad?

Espero que sea claro.

+1

¿Qué tiene de malo el valor que va ** al cliente ** exactamente como si hubiera hecho la selección sin un bloque 'declarar'? – Sorpigal

2

Debe seleccionar en sus variables declaradas si desea hacerlo de esa manera o establecer las columnas. Por ejemplo:

DECLARE 
var_col1 number := 5; 
var_vol2 number := 6; 
BEGIN 
    SELECT my_table1.var_col into var_col1 
    FROM my_table1 
    WHERE column1=var_col1 
     AND column2=var_col2; 
--etc..... 
END; 

O

DECLARE 
    var_col1 number := 5; 
    var_vol2 number := 6; 
    BEGIN 
     SELECT 5 into var_col1 
     FROM my_table1 
     WHERE column1=var_col1 
      AND column2=var_col2; 
    --etc..... 
    END; 

EDIT: También me gustaría añadir que también se puede declarar Vvariables de salida que se pueden utilizar en SQL para devolver una salida para facilitar la depuración, etc Así que usted puede hacer algo así como:

DECLARE 
out varchar2(200); 

Y en su sentencia BEGIN hacer algo como:

dbms_output.put_line(out); 

Que genera alguna información útil potencial (dependiendo de lo que se haya establecido).

+2

¿Pero quiero seleccionar todas las columnas? –

+0

Y no entiendo, ¿cuál es el propósito de "en" realmente? ¿Qué significa eso para DECLARAR? –

+0

Entonces la respuesta que desea es la solución de @Edurado Ivanec. Donde establece el valor en la cláusula BEGIN – northpole

1

Está utilizando PLSQL Developer, que tiene la opción de diferentes tipos de ventanas. Si recuerdo correctamente, la ventana de Comando es la que es un emulador SQL * Plus. Que siendo así que esto debería funcionar:

var n1 number 
var n2 number 

exec &&n1 := 5 
exec &&n2 := 6 

SELECT * FROM my_table1 WHERE column1=&&n1 and column2=&&n2 ; 
SELECT * FROM my_table2 WHERE col1&&n1 and col2=&&n2; 

En otras palabras, definir dos variables de sustitución, asignar valores a ellos y finalmente desplegarlos en todas sus consultas.

+0

Muy interesante "var" es una palabra clave. Pero el Desarrollador Pl/Sql no acepta esta declaración. Entonces este código no funciona. Por cierto, no puedo encontrar el uso correcto de "var" para plsql ... –

+0

@YasinOkumus: 'var' es * no * PL/SQL, es una característica de desarrollador PL/SQL. Debe buscarlo en el manual del desarrollador PL/SQL –

+0

Gracias, quise decir PL/SQL Developer. –

Cuestiones relacionadas