2010-08-25 74 views
80

Estoy haciendo algunas pruebas escritas en SQL. Quiero escribir código reutilizable y por lo tanto quiero declarar algunas variables al principio y reutilizarlos en la secuencia de comandos, así:¿Cómo declarar la variable y usarla en la misma secuencia de comandos SQL? (Oracle SQL)

DEFINE stupidvar = 'stupidvarcontent'; 

SELECT stupiddata 
FROM stupidtable 
WHERE stupidcolumn = &stupidvar; 

¿Cómo puedo declarar una variable y reutilizarla en las declaraciones que siguen? (Estoy usando SQLDeveloper para acceder a una base de datos Oracle.)

I probado hasta ahora:

  • Usar una sección de declaración e inserte la siguiente instrucción SELECT en BEGIN y END;. Acceda a la variable usando &stupidvar.
  • Usa la palabra clave DEFINE y accede a la variable.
  • Usando la palabra clave VARIABLE y acceda a la variable.

Pero recibo todo tipo de errores durante mis intentos (variable no vinculada, error de sintaxis, esperado SELECT INTO ...).

Al buscar en la red, encuentro muchas explicaciones diferentes sobre SQL, PL/SQL.

¡Gracias de antemano!

+10

nombres realmente estúpido :) –

Respuesta

106

Hay varias maneras de declarar variables en SQL * Plus guiones.

El primero es usar VAR. El mecanismo para la asignación de valores a un VAR es con una llamada EXEC:

SQL> var name varchar2(20) 
SQL> exec :name := 'SALES' 

PL/SQL procedure successfully completed. 

SQL> select * from dept 
    2 where dname = :name 
    3/

    DEPTNO DNAME   LOC 
---------- -------------- ------------- 
     30 SALES   CHICAGO 

SQL> 

Un VAR es particularmente útil cuando queremos llamar a un procedimiento almacenado que tiene OUT parámetros o una función.

Alternativley podemos utilizar variables de sustitución. Estos son buenos para el modo interactivo:

SQL> accept p_dno prompt "Please enter Department number: " default 10 
Please enter Department number: 20 
SQL> select ename, sal 
    2 from emp 
    3 where deptno = &p_dno 
    4/
old 3: where deptno = &p_dno 
new 3: where deptno = 20 

ENAME    SAL 
---------- ---------- 
CLARKE   800 
ROBERTSON  2975 
RIGBY   3000 
KULASH   1100 
GASPAROTTO  3000 

SQL> 

Cuando estamos escribiendo un script que llama a otros scripts que puede ser útil para definir las variables iniciales:

SQL> def p_dno = 40 
SQL> select ename, sal 
    2 from emp 
    3 where deptno = &p_dno 
    4/
old 3: where deptno = &p_dno 
new 3: where deptno = 40 

no rows selected 

SQL> 

Por último está el bloque anónimo PL/SQL . Como se ve, todavía podemos asignar valores a las variables declaradas de forma interactiva:

SQL> set serveroutput on size unlimited 
SQL> declare 
    2  n pls_integer; 
    3  l_sal number := 3500; 
    4  l_dno number := &dno; 
    5 begin 
    6  select count(*) 
    7  into n 
    8  from emp 
    9  where sal > l_sal 
10  and deptno = l_dno; 
11  dbms_output.put_line('top earners = '||to_char(n)); 
12 end; 
13/
Enter value for dno: 10 
old 4:  l_dno number := &dno; 
new 4:  l_dno number := 10; 
top earners = 1 

PL/SQL procedure successfully completed. 

SQL> 
+4

Todo bien, excepto por el uso del término "variable de vinculación". La declaración de VAR crea una variable de vinculación, mientras que ACEPTAR o DEFINIR crea una variable de sustitución. –

+0

@DaveCosta - corregido. Gracias – APC

+1

¿Es posible concatenar variables + cadenas? – Ecropolis

15

Trate de usar comillas dobles si es una variable de tipo char:

DEFINE stupidvar = "'stupidvarcontent'"; 

o

DEFINE stupidvar = 'stupidvarcontent'; 

SELECT stupiddata 
FROM stupidtable 
WHERE stupidcolumn = '&stupidvar' 

UPD:

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 25 17:13:26 2010 

Copyright (c) 1982, 2005, Oracle. All rights reserved. 

SQL> conn od/[email protected] 
Connected. 
SQL> define var = "'FL-208'"; 
SQL> select code from product where code = &var; 
old 1: select code from product where code = &var 
new 1: select code from product where code = 'FL-208' 

CODE 
--------------- 
FL-208 

SQL> define var = 'FL-208'; 
SQL> select code from product where code = &var; 
old 1: select code from product where code = &var 
new 1: select code from product where code = FL-208 
select code from product where code = FL-208 
             * 
ERROR at line 1: 
ORA-06553: PLS-221: 'FL' is not a procedure or is undefined 
+0

Gracias por su respuesta, pero si incluyo el var entre comillas dobles, aparece un 'ORA-01008: no todas las variables bound'. – bl4ckb0l7

+1

puede dar su entrada completa que conduce a este error? –

+0

¡Claro! 'DEFINE num = 1; SELECT & num FROM dual; 'conduce a: ' ORA-01008: no todas las variables vinculadas' – bl4ckb0l7

1

Aquí está la respuesta:

DEFINIR num: = 1; - Los dos puntos son necesarios para los valores predeterminados. SELECCIONAR & num FROM dual;

8

En PL v.10/SQL

palabra clave declare es usada para declarar variables

DECLARE stupidvar varchar(20); 

para asignar un valor se puede establecer cuando se declara

DECLARE stupidvar varchar(20) := '12345678'; 

o para seleccionar algo en esa variable, usa la instrucción INTO, sin embargo, debe ajustar la declaración en BEGIN y END, también necesita asegúrese de que solo se devuelva un valor único, y no olvide los puntos y comas.

por lo que la declaración completa saldrían siguientes:

DECLARE stupidvar varchar(20); 
BEGIN 
    SELECT stupid into stupidvar FROM stupiddata CC 
    WHERE stupidid = 2; 
END; 

La variable sólo es utilizable dentro BEGIN y END por lo que si desea utilizar más de una que tendrá que hacer varias BEGIN END envoltorios

DECLARE stupidvar varchar(20); 
BEGIN 
    SELECT stupid into stupidvar FROM stupiddata CC 
    WHERE stupidid = 2; 

    DECLARE evenmorestupidvar varchar(20); 
    BEGIN 
     SELECT evenmorestupid into evenmorestupidvar FROM evenmorestupiddata CCC 
     WHERE evenmorestupidid = 42; 

     INSERT INTO newstupiddata (newstupidcolumn, newevenmorestupidstupidcolumn) 
     SELECT stupidvar, evenmorestupidvar 
     FROM dual 

    END; 
END; 

Espero que esto le ahorre algo de tiempo

3

Si desea declarar la fecha y luego usarla en SQL Developer.

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

SELECT * 
FROM proposal 
WHERE prop_start_dt = &PROPp_START_DT 
1

Sólo quiero añadir respuesta Matas '. Quizás es obvio, pero he buscado durante mucho tiempo para descubrir que la variable solo está accesible dentro de la construcción BEGIN-END, por lo que si necesita usarla en algún código posterior, necesita poner esto código dentro del bloque BEGIN-END.

Tenga en cuenta que estos bloques se pueden anidar:

DECLARE x NUMBER; 
    BEGIN 
    SELECT PK INTO x FROM table1 WHERE col1 = 'test'; 

    DECLARE y NUMBER; 
    BEGIN 
    SELECT PK INTO y FROM table2 WHERE col2 = x; 

    INSERT INTO table2 (col1, col2) 
     SELECT y,'text' 
     FROM dual 
     WHERE exists(SELECT * FROM table2); 
    COMMIT; 
    END; 
END; 
1

La cuestión está a punto de utilizar una variable en un script significa para mí se va a utilizar en SQL * Plus.

El problema es que ha omitido las comillas y Oracle no puede analizar el valor del número.

SQL> DEFINE num = 2018 
SQL> SELECT &num AS your_num FROM dual; 
old 1: SELECT &num AS your_num FROM dual 
new 1: SELECT 2018 AS your_num FROM dual 

    YOUR_NUM 
---------- 
     2018 

Elapsed: 00:00:00.01 

Este ejemplo funciona bien debido a la conversión de tipo automática (o como se llame).

Si marca escribiendo DEFINE en SQL * Plus, se mostrará que la variable num es CHAR.

SQL>define 
DEFINE NUM    = "2018" (CHAR) 

no es un problema en este caso, ya que Oracle puede tratar con una cuerda de análisis para numerar si sería un número válido.

Cuando la cadena no puede analizar el número, Oracle no puede manejarlo.

SQL> DEFINE num = 'Doh' 
SQL> SELECT &num AS your_num FROM dual; 
old 1: SELECT &num AS your_num FROM dual 
new 1: SELECT Doh AS your_num FROM dual 
SELECT Doh AS your_num FROM dual 
     * 
ERROR at line 1: 
ORA-00904: "DOH": invalid identifier 

Con una cita, por lo que no obliga a Oracle para analizar a número, va a estar bien:

17:31:00 SQL> SELECT '&num' AS your_num FROM dual; 
old 1: SELECT '&num' AS your_num FROM dual 
new 1: SELECT 'Doh' AS your_num FROM dual 

YOU 
--- 
Doh 

Por lo tanto, para responder a la pregunta original, debe ser hacer como este ejemplo:

SQL> DEFINE stupidvar = 'X' 
SQL> 
SQL> SELECT 'print stupidvar:' || '&stupidvar' 
    2 FROM dual 
    3 WHERE dummy = '&stupidvar'; 
old 1: SELECT 'print stupidvar:' || '&stupidvar' 
new 1: SELECT 'print stupidvar:' || 'X' 
old 3: WHERE dummy = '&stupidvar' 
new 3: WHERE dummy = 'X' 

'PRINTSTUPIDVAR:' 
----------------- 
print stupidvar:X 

Elapsed: 00:00:00.00 

Hay otra forma de almacenar variables en SQL * Plus utilizando Columna de consulta Valor.

El COL [UMN] tiene opción nuevo_valor para almacenar el valor de la consulta por el nombre del campo.

SQL> COLUMN stupid_column_name new_value stupid_var noprint 
SQL> SELECT dummy || '.log' AS stupid_column_name 
    2 FROM dual; 

Elapsed: 00:00:00.00 
SQL> SPOOL &stupid_var. 
SQL> SELECT '&stupid_var' FROM DUAL; 
old 1: SELECT '&stupid_var' FROM DUAL 
new 1: SELECT 'X.log' FROM DUAL 

X.LOG 
----- 
X.log 

Elapsed: 00:00:00.00 
SQL>SPOOL OFF; 

Como se puede ver, el valor X.log fue establecido en el variables stupid_var, por lo que podemos encontrar un archivo X.log en el directorio actual tiene algo de registro en el mismo.

Cuestiones relacionadas