下面是在SQL Server 2000中如何在Oracle SQL Developer中使用变量?
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
我想用SQL开发人员无需额外的复杂性做同样的事情在Oracle中使用变量的一个例子。这似乎是一件非常简单的事情,但我找不到一个简单的解决方案。我该怎么做?
下面是在SQL Server 2000中如何在Oracle SQL Developer中使用变量?
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
我想用SQL开发人员无需额外的复杂性做同样的事情在Oracle中使用变量的一个例子。这似乎是一件非常简单的事情,但我找不到一个简单的解决方案。我该怎么做?
简单的回答没有。
但是可以实现通过使用绑定变量运行以下版本类似的东西:一旦你上面运行在SQL Developer中,你会被提示绑定变量雇员输入值查询
SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar
。
在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中的东西,如果你运行具有任意数量的绑定变量(用冒号前缀)的声明中,系统会提示您输入值。正如Alex指出的那样,你也可以使用“运行脚本”功能(F5)和Alex建议的替代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;
如果您'运行脚本'(F5)而不是'运行语句',那么它不会提示输入绑定变量。但它似乎不喜欢'select ... into'(ORA-01006),因此您需要执行'exec:v_emp_id:= 1234;'而不是。 – 2011-04-13 18:37:20
@亚历克斯 - 尼斯!我只是放弃了,并假定SQL Developer总是提示绑定变量值。我将你的建议纳入我的答案。 – 2011-04-13 19:00:30
@Nathan如果你想用v_emp_id执行一个包,你也可以使用绑定变量作为refcursors。见亚历克斯的底部[答案](http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from-an-oracle-package-procedure/3527037#3527037)至我有一个类似的问题 – 2011-04-13 19:11:43
我正在使用版本3.2中的SQL Developer。其他的东西不为我工作,但这并:
define value1 = 'sysdate'
SELECT &&value1 from dual;
而且它在这里提出的灵巧方式,但。
(如果省略了“定义” -part会提示你该值)
也适用于只有一个& – 2013-04-09 15:01:00
如果将&& value1与字符串值进行比较,如:&& value1 ='某个字符串',则&& value1需要用单引号括起来,如'&& value1'='某个字符串' – 2014-03-05 21:29:32
在SQL Developer中,替代变量定义通过DEFINE似乎在查询执行之间持续存在。如果我更改变量值,但在执行时没有明确突出显示DEFINE行,则前一个值将保留。 (这是因为double &&?) – Baodad 2014-05-13 23:00:04
有在SQL加两种类型的变量:替代和绑定。
这是取代(替换变量可代替SQL * Plus命令选项或其它硬编码文本):
define a = 1;
select &a from dual;
undefine a;
这是SQL和PL 绑定(绑定变量存储数据值/ SQL语句的执行RDBMS,它们可以容纳单值或完整的结果集):
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 striped as it is number))
select '&phone' from dual; -- plus is preserved as it is string
我尝试过SQL Developer中的绑定(4.1.1.19),它也在工作。我的意思是'var x'和'exec:x'的情况,没有提示。 – Betlista 2016-05-12 06:59:08
你可以在其他地方阅读substi变量;他们在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
变量或refcursor。您不能仅仅使用SELECT
并返回PL/SQL中的结果集。
好吧我该知道一个黑客位,但是这在一个简单的查询不脚本中使用变量的方式:
WITH
emplVar AS
(SELECT 1234 AS id FROM dual)
SELECT
*
FROM
employees,
emplVar
WHERE
EmployId=emplVar.id;
你到任何地方运行它。
有没有办法使用UPDATE而不是select? – 2016-08-26 22:16:40
使用一个查询:
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;
试试这个它会工作,最好创建一个程序,如果程序是不可能的,你可以使用这个脚本。
with param AS(
SELECT 1234 empid
FROM dual)
SELECT *
FROM Employees, param
WHERE EmployeeID = param.empid;
END;
作为存储过程还是作为脚本?如果您对EmpIDVar的值进行硬编码,为什么要使用变量? – kurosch 2011-04-13 18:03:14