如何在Oracle SQL Developer中使用variables?

下面是在SQL Server 2000中使用variables的一个例子。

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

我想在Oracle中使用SQL Developer做同样的事情,而不会增加复杂性。 这似乎是一个非常简单的事情,但我找不到一个简单的解决scheme。 我该怎么做?

我正在使用版本3.2中的SQL开发人员。 其他的东西不适合我,但是这样做:

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

也是这里介绍的最清晰的方式。

(如果您省略“define”部分,则会提示您input该值)

SQL-plus中有两种types的variables:replace和绑定。

这是替代 (replacevariables可以替代SQL * Plus命令选项或其他硬编码文本):

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

这是绑定 (绑定variables存储在RDBMS中执行的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支持replacevariables,但是当您使用bind :var语法执行查询时,会提示您input绑定(在对话框中)。

参考:

更新 replacevariables有点棘手,看看:

 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 

在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中,如果运行一个包含任意数量绑定variables(以冒号前缀)的语句,系统将提示您input值。 正如Alex指出的那样,您也可以使用“运行脚本”function(F5),使用Alexbuild议的备用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; 

简单的回答

但是,您可以通过使用绑定variables运行以下版本来实现类似的function:

 SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

一旦在SQL Developer中运行上面的查询,将会提示您input绑定variablesEmployeeID的值。

好吧,我知道这有点黑客,但这是一个在简单的查询而不是脚本中使用variables的方法:

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

你到处运行它。

你可以在别处读取替代variables; 他们在SQL Developer中非常方便。 但是我已经适合尝试在SQL Developer中使用绑定variables。 这就是我所做的:

 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 ... INTOvariables或refcursor。 你不能在PL / SQL中SELECT并返回结果集。

使用下一个查询:

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