2011-04-13 51 views
80

A continuación se muestra un ejemplo del uso de variables en SQL Server 2000.¿Cómo uso las variables en Oracle SQL Developer?

DECLARE @EmpIDVar INT 

SET @EmpIDVar = 1234 

SELECT * 
FROM Employees 
WHERE EmployeeID = @EmpIDVar 

que quiero hacer exactamente lo mismo en Oracle utilizando SQL Developer y sin complejidad adicional. Parece algo muy simple de hacer, pero no puedo encontrar una solución simple. ¿Cómo puedo hacerlo?

+0

¿Como un procedimiento almacenado o como un script? Si está codificando el valor de EmpIDVar, ¿por qué usar una variable? – kurosch

Respuesta

11

Respuesta simple NO.

Sin embargo se puede lograr algo similar ejecutando la siguiente versión que utiliza variables de enlace:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Una vez que ejecute la consulta anterior en SQL desarrollador se le pide que introduzca el valor de la variable de vinculación de empleado.

45

En SQL * Plus, podrá hacer algo muy similar

SQL> variable v_emp_id number; 
SQL> select 1234 into :v_emp_id from dual; 

     1234 
---------- 
     1234 

SQL> select * 
    2 from emp 
    3 where empno = :v_emp_id; 

no rows selected 

En SQL Developer, si ejecuta una instrucción que tiene cualquier número de variables de enlace (con el prefijo de dos puntos), se le pedirá para ingresar valores Como señala Alex, también puede hacer algo similar con la función "Ejecutar script" (F5) con la sintaxis alternativa de EXEC que Alex sugiere.

variable v_count number; 
variable v_emp_id number; 
exec :v_emp_id := 1234; 
exec select count(1) into :v_count from emp; 
select * 
    from emp 
where empno = :v_emp_id 
exec print :v_count; 
+13

si 'ejecuta script' (F5) en lugar de 'ejecutar instrucción', entonces no solicitará las variables de vinculación. Pero parece que no le gusta el 'select ... into' (ORA-01006), por lo que necesitaría hacer' exec: v_emp_id: = 1234; 'en su lugar. –

+0

@Alex - ¡Agradable! Me rendí y asumí que SQL Developer siempre me pedía valores de variable de vinculación. Incorporé tus sugerencias en mi respuesta. –

+1

@ Nathan si está buscando ejecutar un paquete con: v_emp_id, también puede usar variables de vinculación para los refcuentores. Vea la parte inferior de [respuesta] de Alex (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from-an-oracle-package-procedure/3527037#3527037) para una pregunta similar que tuve –

60

Estoy usando SQL-Developer en la Versión 3.2. Las otras cosas no funcionó para mí, pero esto hizo:

define value1 = 'sysdate' 

SELECT &&value1 from dual; 

También es la forma más ingeniosa que aquí se presenta, sin embargo.

(Si se omite el "definir" -parte se le pedirá para ese valor)

+12

también funciona con solo uno & –

+8

Si se compara && value1 con un valor de cadena como: && value1 = 'Some string', && value1 debe completarse con comillas simples como: '&& value1' = 'Some string' –

+1

En SQL Developer, variables de sustitución definidas por DEFINE parecen ser persistentes entre las ejecuciones de consultas. Si cambio el valor de la variable, pero no destaco explícitamente la línea DEFINE al ejecutar, el valor anterior permanece. (¿Esto se debe a la doble &&?) – Baodad

49

Hay dos tipos de variables en SQL-plus: sustitución y se unen.

Ésta es (variables de sustitución pueden sustituir a las opciones de comando SQL * Plus u otro texto codificado) sustitución:

define a = 1; 
select &a from dual; 
undefine a; 

Esta es unen (variables se unen valores de los datos del almacén de SQL y PL/sentencias SQL ejecutadas en el RDBMS, ya que pueden contener valores individuales o conjuntos de resultados completos):

var x number; 
exec :x := 10; 
select :x from dual; 
exec select count(*) into :x from dual; 
exec print x; 

SQL Developer soporta variables de sustitución, pero cuando ejecutar una consulta con la sintaxis de vincular :var se le solicita el enlace (en un cuadro de diálogo).

Referencia:

ACTUALIZACIÓNsustitución variables son un poco difícil de usar, mira:

define phone = '+38097666666'; 
select &phone from dual; -- plus is striped as it is number)) 
select '&phone' from dual; -- plus is preserved as it is string 
+2

Intenté el enlace en SQL Developer (4.1.1.19) y está funcionando también. Me refiero al caso con 'var x' y' exec: x', sin prompt. – Betlista

4

Puede leer en otro lugar en substi variables de matrícula; son bastante útiles en SQL Developer. Pero tengo ajustes tratando de usar variables de vinculación en SQL Developer. Esto es lo que hago:

SET SERVEROUTPUT ON 
declare 
    v_testnum number; 
    v_teststring varchar2(1000); 

begin 
    v_testnum := 2; 
    DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum); 

    SELECT 36,'hello world' 
    INTO v_testnum, v_teststring 
    from dual; 

    DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum); 
    DBMS_OUTPUT.put_line('v_teststring is ' || v_teststring); 
end; 

SET SERVEROUTPUT ON lo hace tan texto puede ser impreso en la consola de salida del script.

Creo que lo que estamos haciendo aquí se llama oficialmente PL/SQL. Hemos dejado la tierra pura de SQL y estamos usando un motor diferente en Oracle. ¿Ves el SELECT arriba? En PL/SQL siempre tiene que SELECT ... INTO variable o un refcursor. No puede simplemente SELECT y devolver un conjunto de resultados en PL/SQL.

5

Ok Sé que esto un poco de un truco pero esto una manera de utilizar una variable en una consulta simple no un script:

WITH 
    emplVar AS 
    (SELECT 1234 AS id FROM dual) 
SELECT 
    * 
FROM 
    employees, 
    emplVar 
WHERE 
    EmployId=emplVar.id; 

se llega a ejecutar en todas partes.

+0

¿Hay alguna forma de usar esto con ACTUALIZAR en lugar de seleccionar? –

0

utilizar la consulta siguiente:

DECLARE 
    EmpIDVar INT; 

BEGIN 
    EmpIDVar := 1234; 

    SELECT * 
    FROM Employees 
    WHERE EmployeeID = EmpIDVar; 
END; 
0

Prueba esto va a funcionar, es mejor crear un procedimiento, si el procedimiento no es posible que usted puede utilizar este script.

with param AS(
SELECT 1234 empid 
FROM dual) 
SELECT * 
    FROM Employees, param 
    WHERE EmployeeID = param.empid; 
END; 
Cuestiones relacionadas