Como uso variables ​​no Oracle SQL Developer?

Abaixo está um exemplo de uso de variables ​​no SQL Server 2000.

DECLARE @EmpIDVar INT SET @EmpIDVar = 1234 SELECT * FROM Employees WHERE EmployeeID = @EmpIDVar 

Eu quero fazer exatamente a mesma coisa no Oracle usando o SQL Developer sem complexidade adicional. Parece uma coisa muito simples de fazer, mas não consigo encontrar uma solução simples. Como eu posso fazer isso?

Eu estou usando o SQL-Developer na versão 3.2. As outras coisas não funcionaram para mim, mas isso fez:

 define value1 = 'sysdate' SELECT &&value1 from dual; 

Também é a maneira mais esbelta apresentada aqui, ainda.

(Se você omitir a parte “define”, você será solicitado para esse valor)

Existem dois tipos de variables ​​no SQL-plus: substituição e vinculação.

Isso é substituição (as variables ​​de substituição podem replace as opções de comando do SQL * Plus ou outro texto codificado):

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

Isso é bind (as variables ​​de binding armazenam valores de dados para instruções SQL e PL / SQL executadas no RDBMS; elas podem conter valores únicos ou conjuntos de resultados completos):

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

O SQL Developer suporta variables ​​de substituição, mas quando você executa uma consulta com a syntax bind :var é solicitada a binding (em uma checkbox de diálogo).

Referência:

Variáveis ​​de substituição de UPDATE são um pouco complicadas de usar, olhe:

 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 

No SQL * Plus, você pode fazer algo muito semelhante

 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 

No SQL Developer, se você executar uma instrução que tenha qualquer número de variables ​​de binding (prefixadas com dois pontos), você será solicitado a inserir valores. Como Alex aponta, você também pode fazer algo similar usando a function “Run Script” (F5) com a syntax EXEC alternativa que o Alex sugere.

 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; 

Resposta simples NÃO.

No entanto, você pode conseguir algo semelhante executando a seguinte versão usando variables ​​de binding:

 SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Depois de executar a consulta acima no SQL Developer, você será solicitado a inserir o valor para a variável de vinculação EmployeeID.

Ok, eu sei disso um pouco de hack, mas esta é uma maneira de usar uma variável em uma consulta simples, não um script:

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

Você começa a correr em todos os lugares.

Você pode ler em outro lugar sobre variables ​​de substituição; Eles são muito úteis no SQL Developer. Mas eu tenho ajustes tentando usar variables ​​de binding no SQL Developer. Isto é o que eu faço:

 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 faz com que o texto possa ser impresso no console de saída de script.

Eu acredito que o que estamos fazendo aqui é chamado oficialmente de PL / SQL. Deixamos o terreno puro do SQL e estamos usando um mecanismo diferente no Oracle. Você vê o SELECT acima? Em PL / SQL você sempre tem que SELECT ... INTO ou variável ou um refcursor. Você não pode simplesmente SELECT e retornar um conjunto de resultados em PL / SQL.

Use a próxima consulta:

 DECLARE EmpIDVar INT; BEGIN EmpIDVar := 1234; SELECT * FROM Employees WHERE EmployeeID = EmpIDVar; END; 

Tente isso vai funcionar, é melhor criar um procedimento, se procedimento não for possível você pode usar esse script.

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