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

77

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

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

  • 0
    Как хранимая процедура или как скрипт? Если вы жестко программируете значение для EmpIDVar, зачем вообще использовать переменную?
Теги:
variables
declare

8 ответов

64

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

Кроме того, это еще и самый гладкий способ.

(Если вы опустите "define" -part, вам будет предложено указать это значение)

  • 15
    также работает только с одним &
  • 9
    Если сравнение && value1 со строковым значением, таким как: && value1 = 'Some string', тогда && value1 необходимо заключить в одинарные кавычки, например: '&& value1' = 'Some string'
Показать ещё 4 комментария
49

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

Это подстановка (переменные замещения могут заменять параметры командной строки 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 поддерживает переменные замещения, но когда вы выполняете запрос с синтаксисом bind :var, вы запрашиваете привязку (в диалоговом окне).

Ссылка:

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

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

В 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, если вы запустите оператор, который имеет любое количество переменных привязки (с префиксом двоеточия), вам будет предложено ввести значения. Как указывает Алекс, вы также можете сделать что-то подобное, используя функцию "Run Script" (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;
  • 13
    если вместо «выполнить оператор» вы запускаете «скрипт» (F5), он не запрашивает переменные связывания. Но это не похоже на select...into (ORA-01006), поэтому вам нужно выполнить exec :v_emp_id := 1234; вместо.
  • 0
    @ Алекс - Отлично! Я просто сдался и предположил, что SQL Developer всегда запрашивал значения переменных связывания. Я включил ваши предложения в мой ответ.
Показать ещё 2 комментария
11

Простой ответ №.

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

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

5

Хорошо, я знаю это немного взломанный, но это способ использовать переменную в простом запросе, а не script:

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

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

  • 0
    Есть ли способ использовать это с ОБНОВЛЕНИЕ вместо выбора?
5

Вы можете читать в другом месте по переменным замещения; они довольно удобны в 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 делает так, чтобы текст мог быть напечатан на выходной консоли script.

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

0

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

  с параметром AS (
SELECT 1234 empid
FROM dual)
 ВЫБРАТЬ * FROM Сотрудники, param WHERE EmployeeID = param.empid;
КОНЕЦ;
Код>
0

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

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню