如何在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绑定(在对话框中)。
参考:
- http://www.oracle.com/technetwork/testcontent/sub-var-087723.html SQL * Plusreplacevariables,Christopher Jones,2004
更新 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 ... INTO
variables或refcursor。 你不能在PL / SQL中SELECT
并返回结果集。
使用下一个查询:
DECLARE EmpIDVar INT; BEGIN EmpIDVar := 1234; SELECT * FROM Employees WHERE EmployeeID = EmpIDVar; END;