¿Cómo utilizo variables en Oracle SQL Developer?

116

A continuación se muestra un ejemplo del uso de variables en SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Quiero hacer exactamente lo mismo en Oracle usando SQL Developer sin complejidad adicional. Parece una cosa muy simple de hacer, pero no puedo encontrar una solución simple. ¿Cómo puedo hacerlo?

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

Respuestas:

95

Estoy usando SQL-Developer en la versión 3.2. Las otras cosas no me funcionaron, pero esto sí:

define value1 = 'sysdate'

SELECT &&value1 from dual;

También es la forma más hábil presentada aquí, hasta ahora.

(Si omite la parte "definir", se le pedirá ese valor)

Omphaloskopie
fuente
12
Si se compara && value1 con un valor de cadena como: && value1 = 'Some string', entonces && value1 debe estar entre comillas simples como: '&& value1' = 'Some string'
Ryan E
1
En SQL Developer, las variables de sustitución definidas por DEFINE parecen ser persistentes entre las ejecuciones de consultas. Si cambio el valor de la variable, pero no resalto explícitamente la línea DEFINE al ejecutar, el valor anterior permanece. (¿Esto es por el doble &&?)
Baodad
9
Esta página en la sección 2.4 habla sobre la diferencia entre el simple y comercial (&) y el doble y comercial (&&)
Baodad
1
Para aquellos de nosotros acostumbrados a trabajar con consultas con variables en Microsoft SQL Server Management Studio, esta es la mejor respuesta. Sin embargo, es posible que debamos acostumbrarnos a resaltar toda la consulta antes de ejecutarla.
Baodad
Esta respuesta fue la solución que funcionó para mí en SQL-Developer 2.1. Definitivamente es el método más sencillo para implementar una forma para que el usuario cambie un valor por encima de la consulta y no tenga que editar la consulta en sí.
YonkeyDonk64
74

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

Esto es sustitución (las variables de sustitución pueden reemplazar las opciones de comando SQL * Plus u otro texto codificado):

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

Esto es bind (las variables de enlace almacenan valores de datos para declaraciones SQL y PL / SQL ejecutadas en el RDBMS; pueden contener valores únicos 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 admite variables de sustitución, pero cuando ejecuta una consulta con :varsintaxis de enlace , se le solicita el enlace (en un cuadro de diálogo).

Referencia:

ACTUALIZAR las variables de sustitución son un poco complicadas de usar, mira:

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string
Gavenkoa
fuente
2
Probé el enlace en SQL Developer (4.1.1.19) y también está funcionando. Me refiero al caso con var xy exec :x, sin aviso.
Betlista
50

En SQL * Plus, puede 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 declaración que tiene cualquier número de variables de vinculación (con dos puntos como prefijo), se le pedirá que ingrese valores. Como señala Alex, también puede hacer algo similar usando la función "Ejecutar script" (F5) con la sintaxis EXEC alternativa 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;
Justin Cave
fuente
14
si 'ejecuta script' (F5) en lugar de 'ejecutar declaración', entonces no solicitará las variables de enlace. Pero no parece gustarle el select...into(ORA-01006), por lo que debería hacerlo en su exec :v_emp_id := 1234;lugar.
Alex Poole
@Alex - ¡Bien! Me rendí y asumí que SQL Developer siempre solicitaba valores de variables de enlace. Incorporé tus sugerencias a mi respuesta.
Justin Cave
1
@Nathan, si está buscando ejecutar un paquete con: v_emp_id, también puede usar variables de enlace para los cursores ref. Vea la parte inferior de la respuesta de Alex a una pregunta similar que tuve
Conrad Frix
2
@AlexPoole ¿hay alguna forma de enviar la salida a la ventana de resultados de la consulta? En mi trabajo, ejecuto consultas para exportar a archivos de Excel.
tp9
13

Ok, sé que esto es un truco, pero esta es una forma de usar 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;

Puedes ejecutarlo en todas partes.

zpontikas
fuente
¿Hay alguna forma de usar esto con ACTUALIZAR en lugar de seleccionar?
Ron Jensen - Todos somos Monica
12

Respuesta simple NO.

Sin embargo, puede lograr algo similar ejecutando la siguiente versión usando variables de enlace:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Una vez que ejecute la consulta anterior en SQL Developer, se le pedirá que ingrese un valor para la variable de vinculación EmployeeID.

Chandu
fuente
8

Puede leer en otra parte sobre las variables de sustitución; son bastante útiles en SQL Developer. Pero tengo problemas al intentar usar variables de enlace 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 hace que el texto se pueda imprimir 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 lo de SELECTarriba? En PL / SQL siempre tiene que SELECT ... INTOser variable o un refcursor. No puede simplemente SELECTdevolver un conjunto de resultados en PL / SQL.

Baodad
fuente
2

Creo que la forma más fácil en tu caso es:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Para los valores de la cadena será como:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Pedro
fuente
1

Utilice la siguiente consulta:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
Ivan Gerasimenko
fuente
el error devolvió "PLS-00428 se espera una cláusula INTO en esta instrucción SELECT"
Thundter
0

Pruebe esto, funcionará, es mejor crear un procedimiento, si el procedimiento no es posible, puede usar este script.

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
Jeen José Akkanath
fuente
0

En el desarrollador de sql, defina las propiedades por defecto "ON". Si está "APAGADO" en cualquier caso, siga los pasos a continuación.

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

Md. Kamruzzaman
fuente