2011-04-13 211 views
80

下面是在SQL Server 2000中如何在Oracle SQL Developer中使用变量?

DECLARE @EmpIDVar INT 

SET @EmpIDVar = 1234 

SELECT * 
FROM Employees 
WHERE EmployeeID = @EmpIDVar 

我想用SQL开发人员无需额外的复杂性做同样的事情在Oracle中使用变量的一个例子。这似乎是一件非常简单的事情,但我找不到一个简单的解决方案。我该怎么做?

+0

作为存储过程还是作为脚本?如果您对EmpIDVar的值进行硬编码,为什么要使用变量? – kurosch 2011-04-13 18:03:14

回答

11

简单的回答没有。

但是可以实现通过使用绑定变量运行以下版本类似的东西:一旦你上面运行在SQL Developer中,你会被提示绑定变量雇员输入值查询

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

45

在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; 
+13

如果您'运行脚本'(F5)而不是'运行语句',那么它不会提示输入绑定变量。但它似乎不喜欢'select ... into'(ORA-01006),因此您需要执行'exec:v_emp_id:= 1234;'而不是。 – 2011-04-13 18:37:20

+0

@亚历克斯 - 尼斯!我只是放弃了,并假定SQL Developer总是提示绑定变量值。我将你的建议纳入我的答案。 – 2011-04-13 19:00:30

+1

@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

60

我正在使用版本3.2中的SQL Developer。其他的东西不为我工作,但这并:

define value1 = 'sysdate' 

SELECT &&value1 from dual; 

而且它在这里提出的灵巧方式,但。

(如果省略了“定义” -part会提示你该值)

+12

也适用于只有一个& – 2013-04-09 15:01:00

+8

如果将&& value1与字符串值进行比较,如:&& value1 ='某个字符串',则&& value1需要用单引号括起来,如'&& value1'='某个字符串' – 2014-03-05 21:29:32

+1

在SQL Developer中,替代变量定义通过DEFINE似乎在查询执行之间持续存在。如果我更改变量值,但在执行时没有明确突出显示DEFINE行,则前一个值将保留。 (这是因为double &&?) – Baodad 2014-05-13 23:00:04

49

有在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 
+2

我尝试过SQL Developer中的绑定(4.1.1.19),它也在工作。我的意思是'var x'和'exec:x'的情况,没有提示。 – Betlista 2016-05-12 06:59:08

4

你可以在其他地方阅读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中的结果集。

5

好吧我该知道一个黑客位,但是这在一个简单的查询不脚本中使用变量的方式:

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

你到任何地方运行它。

+0

有没有办法使用UPDATE而不是select? – 2016-08-26 22:16:40

0

使用一个查询:

DECLARE 
    EmpIDVar INT; 

BEGIN 
    EmpIDVar := 1234; 

    SELECT * 
    FROM Employees 
    WHERE EmployeeID = EmpIDVar; 
END; 
0

试试这个它会工作,最好创建一个程序,如果程序是不可能的,你可以使用这个脚本。

with param AS(
SELECT 1234 empid 
FROM dual) 
SELECT * 
    FROM Employees, param 
    WHERE EmployeeID = param.empid; 
END; 
相关问题