Как использовать переменные в Oracle SQL Developer?

116

Ниже приведен пример использования переменных в SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Я хочу сделать то же самое в Oracle с помощью SQL Developer без дополнительных сложностей. Это кажется очень простым делом, но я не могу найти простого решения. Как мне это сделать?

Натан
источник
Как хранимая процедура или как сценарий? Если вы жестко кодируете значение для EmpIDVar, зачем вообще использовать переменную?
kurosch

Ответы:

95

Я использую SQL-Developer версии 3.2. Другие вещи у меня не работали, но вот это:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Кроме того, это самый изящный способ, представленный здесь.

(Если вы опустите часть «определить», вам будет предложено ввести это значение)

Omphaloskopie
источник
12
При сравнении && значение1 со строковым значением, например: && value1 = 'Some string', тогда && value1 необходимо заключить в одинарные кавычки, например: '&& value1' = 'Some string'
Ryan E
1
В SQL Developer переменные подстановки, определенные в DEFINE, кажутся постоянными между выполнениями запросов. Если я изменяю значение переменной, но не выделяю явно строку DEFINE при выполнении, предыдущее значение остается. (Это из-за двойного &&?)
Баодад
9
На этой странице в разделе 2.4 рассказывается о разнице между одиночным амперсандом (&) и двойным амперсандом (&&)
Баодад
1
Для тех из нас, кто привык работать с запросами с переменными в Microsoft SQL Server Management Studio, это лучший ответ. Однако нам, возможно, придется привыкнуть выделять весь запрос перед выполнением.
Баодад
Этот ответ был решением, которое сработало для меня в SQL-Developer 2.1. Это определенно самый простой метод, позволяющий пользователю изменить значение над запросом и не редактировать сам запрос.
YonkeyDonk64
74

В SQL-plus есть два типа переменных: подстановка и привязка.

Это подстановка (переменные подстановки могут заменять параметры команды SQL * Plus или другой жестко заданный текст):

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

Это привязка (переменные привязки хранят значения данных для операторов SQL и PL / SQL, выполняемых в СУБД; они могут содержать отдельные значения или полные наборы результатов):

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

SQL Developer поддерживает подстановочные переменные, но когда вы выполняете запрос с :varсинтаксисом привязки, вам будет предложено привязать (в диалоговом окне).

Ссылка:

Переменные подстановки UPDATE немного сложно использовать, посмотрите:

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
источник
2
Я попробовал привязку в SQL Developer (4.1.1.19), и она тоже работает. Я имею в виду случай с var xи exec :x, без подсказки.
Betlista
50

В SQL * Plus вы можете делать что-то очень похожее

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

В SQL Developer, если вы запустите оператор, который имеет любое количество переменных связывания (с префиксом двоеточие), вам будет предложено ввести значения. Как отмечает Алекс, вы также можете сделать нечто подобное, используя функцию «Выполнить сценарий» (F5) с альтернативным синтаксисом EXEC, который предлагает Алекс.

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;
Джастин Кейв
источник
14
если вы запустите сценарий (F5) вместо оператора запуска, он не будет запрашивать переменные привязки. Но, похоже, ему не нравится select...into(ORA-01006), поэтому вам нужно сделать это exec :v_emp_id := 1234;вместо него.
Alex Poole
@Alex - Отлично! Я просто сдался и предположил, что SQL Developer всегда запрашивал значения переменных привязки. Я включил ваши предложения в свой ответ.
Джастин Кейв,
1
@Nathan, если вы хотите выполнить пакет с: v_emp_id, вы также можете использовать переменные связывания для рефкурсоров. См. Нижнюю часть ответа Алекса на аналогичный у меня вопрос
Конрад Фрикс
2
@AlexPoole есть ли способ отправить вывод в окно результатов запроса? В своей работе я выполняю запросы для экспорта в файлы Excel.
tp9 09
13

Хорошо, я знаю, что это что-то вроде хака, но это способ использовать переменную в простом запросе, а не скрипт:

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

Вы можете запускать его везде.

zpontikas
источник
Есть ли способ использовать это с UPDATE вместо select?
Рон Дженсен - Мы все Моника
12

Простой ответ НЕТ.

Однако вы можете добиться чего-то подобного, запустив следующую версию с использованием переменных связывания:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

После выполнения указанного выше запроса в SQL Developer вам будет предложено ввести значение переменной привязки EmployeeID.

Chandu
источник
8

Вы можете прочитать в другом месте о переменных подстановки; они очень удобны в SQL Developer. Но у меня есть припадки, пытающиеся использовать переменные связывания в SQL Developer. Вот что я делаю:

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 позволяет выводить текст на консоль вывода скрипта.

Я считаю, что то, что мы здесь делаем, официально называется PL / SQL. Мы покинули страну чистого SQL и используем другой движок в Oracle. Вы видите SELECTвыше? В PL / SQL всегда требуется SELECT ... INTOлибо переменная, либо рефкурсор. Вы не можете просто SELECTи вернуть набор результатов в PL / SQL.

Baodad
источник
2

Я думаю, что самый простой способ в вашем случае:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Для строковых значений это будет примерно так:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Питер
источник
1

Используйте следующий запрос:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
Иван Герасименко
источник
вернулась ошибка «PLS-00428, в этом операторе SELECT ожидается предложение INTO»
Thundter
0

Попробуйте, это сработает, лучше создать процедуру, если процедура невозможна, вы можете использовать этот сценарий.

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
Джин Хосе Акканатх
источник
0

В sql-разработчике свойства по умолчанию определяют "ON". Если в любом случае он выключен, выполните следующие действия.

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

Мкр. Камруззаман
источник