Ниже приведен пример использования переменных в SQL Server 2000.
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
Я хочу сделать то же самое в Oracle с помощью SQL Developer без дополнительной сложности. Это кажется очень простой задачей, но я не могу найти простого решения. Как я могу это сделать?
Я использую SQL-Developer в Версии 3.2. Другой материал не работал у меня, но это произошло:
define value1 = 'sysdate'
SELECT &&value1 from dual;
Кроме того, это еще и самый гладкий способ.
(Если вы опустите "define" -part, вам будет предложено указать это значение)
В 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
var x
и exec :x
, без подсказки.
В 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;
select...into
(ORA-01006), поэтому вам нужно выполнить exec :v_emp_id := 1234;
вместо.
Простой ответ №.
Однако вы можете добиться чего-то подобного, выполнив следующую версию с использованием переменных привязки:
SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar
После запуска запроса выше в SQL Developer вам будет предложено ввести значение для переменной bind EmployeeID.
Хорошо, я знаю это немного взломанный, но это способ использовать переменную в простом запросе, а не script:
WITH
emplVar AS
(SELECT 1234 AS id FROM dual)
SELECT
*
FROM
employees,
emplVar
WHERE
EmployId=emplVar.id;
Вы можете запускать его везде.
Вы можете читать в другом месте по переменным замещения; они довольно удобны в 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.
Попробуйте, это сработает, лучше создать процедуру, если процедура невозможна, вы можете использовать этот script.
с параметром AS (
SELECT 1234 empid
FROM dual)
ВЫБРАТЬ * FROM Сотрудники, param WHERE EmployeeID = param.empid;
КОНЕЦ;
Код>
Используйте следующий запрос:
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;