Como faço para usar variáveis ​​no Oracle SQL Developer?

116

Abaixo está um exemplo de uso de variáveis ​​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?

Nathan
fonte
Como procedimento armazenado ou script? Se você está codificando o valor para EmpIDVar, por que usar uma variável?
kurosch

Respostas:

95

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

Além disso, é a maneira mais inteligente apresentada aqui.

(Se você omitir a parte "definir", esse valor será solicitado)

Omphaloskopie
fonte
12
Se estiver comparando && valor1 a um valor de string como: && value1 = 'Alguma string', então && valor1 precisa ser colocado entre aspas simples como: '&& value1' = 'Alguma string'
Ryan E
1
No SQL Developer, as variáveis ​​de substituição definidas por DEFINE parecem ser persistentes entre as execuções de consulta. Se eu alterar o valor da variável, mas não destacar explicitamente a linha DEFINE ao executar, o valor anterior permanece. (Isso é por causa do duplo &&?)
Baodad
9
Esta página na seção 2.4 fala sobre a diferença entre o "e" comercial único (&) e o "e comercial" duplo (&&)
Baodad
1
Para aqueles de nós acostumados a trabalhar com consultas com variáveis ​​no Microsoft SQL Server Management Studio, esta é a melhor resposta. Podemos precisar nos acostumar a destacar toda a consulta antes de executá-la.
Baodad
Essa resposta foi a solução que funcionou para mim no SQL-Developer 2.1. É definitivamente o método mais direto para implementar uma maneira de o usuário alterar um valor acima da consulta e não ter que editar a própria consulta.
YonkeyDonk64
74

Existem dois tipos de variáveis ​​em SQL-plus: substituição e vinculação.

Isto é substituição (variáveis ​​de substituição podem substituir opções de comando SQL * Plus ou outro texto embutido em código):

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

Isso é vincular (as variáveis ​​de vinculação 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 oferece suporte a variáveis ​​de substituição, mas quando você executa uma consulta com :varsintaxe de vinculação, é solicitada a vinculação (em uma caixa de diálogo).

Referência:

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

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
fonte
2
Tentei o bind no SQL Developer (4.1.1.19) e está funcionando também. Refiro-me ao caso com var xe exec :x, sem prompt.
Betlista
50

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 contenha qualquer número de variáveis ​​de vinculação (prefixadas com dois pontos), será solicitado que você insira valores. Como Alex aponta, você também pode fazer algo semelhante usando a função "Executar Script" (F5) com a sintaxe EXEC alternativa que Alex sugere que faça.

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;
Caverna Justin
fonte
14
se você 'executar script' (F5) em vez de 'executar instrução', ele não solicitará as variáveis ​​de ligação. Mas ele não parece gostar do select...into(ORA-01006), então você precisa fazer exec :v_emp_id := 1234;.
Alex Poole
@Alex - Legal! Eu simplesmente desisti e presumi que o SQL Developer estava sempre solicitando os valores das variáveis ​​de ligação. Eu incorporei suas sugestões em minha resposta.
Caverna Justin
1
@Nathan se você está procurando executar um pacote com: v_emp_id, você pode usar variáveis ​​de ligação para os refcursors também. Veja o final da resposta de Alex a uma pergunta semelhante que eu tinha
Conrad Frix,
2
@AlexPoole existe uma maneira de enviar a saída para a janela Resultado da Consulta? No meu trabalho, eu executo consultas para exportar para arquivos do Excel.
tp9
13

Ok, eu sei que isso é um pouco um 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ê pode executá-lo em todos os lugares.

zpontikas
fonte
Existe uma maneira de usar isso com UPDATE em vez de selecionar?
Ron Jensen - Somos todos Monica em
12

Resposta simples NÃO.

No entanto, você pode conseguir algo semelhante executando a seguinte versão usando variáveis ​​de ligação:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

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

Chandu
fonte
8

Você pode ler em outro lugar sobre variáveis ​​de substituição; eles são muito úteis no SQL Developer. Mas eu tentei usar variáveis ​​de ligação 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 do script.

Acredito que o que estamos fazendo aqui se chama oficialmente PL / SQL. Saímos da terra do SQL puro e estamos usando um mecanismo diferente no Oracle. Você vê o SELECTacima? Em PL / SQL você sempre tem SELECT ... INTOuma variável ou um refcursor. Você não pode simplesmente SELECTretornar um conjunto de resultados em PL / SQL.

Baodad
fonte
2

Acho que a maneira mais fácil no seu caso é:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Para os valores da string será como:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Peter
fonte
1

Use a próxima consulta:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
Ivan Gerasimenko
fonte
erro retornado "PLS-00428, uma cláusula INTO é esperada nesta instrução SELECT"
Thundter
0

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

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

No sql developer, defina propriedades por padrão "ON". Se estiver "DESLIGADO" em qualquer caso, use os passos abaixo.

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

Md. Kamruzzaman
fonte