如何在Oracle SQL Developer中使用变量?


116

下面是在SQL Server 2000中使用变量的示例。

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

我想使用SQL Developer在Oracle中做完全相同的事情,而不会增加复杂性。这似乎很简单,但是我找不到简单的解决方案。我该怎么做?


作为存储过程还是脚本?如果要对EmpIDVar的值进行硬编码,为什么还要使用变量?
kurosch 2011年

Answers:


95

我正在使用3.2版中的SQL-Developer。其他东西对我不起作用,但是这样做:

define value1 = 'sysdate'

SELECT &&value1 from dual;

这也是这里介绍的最巧妙的方法。

(如果省略“定义”部分,则将提示您输入该值)


12
如果&&值1比较的字符串值,如:&&值1 =“一些字符串”然后&& VALUE1需要被包裹在单引号,如:“&&值1” =“一些字符串”
瑞安è

1
在SQL Developer中,由DEFINE定义的替换变量似乎在查询执行之间是持久的。如果更改变量值,但在执行时未明确突出显示DEFINE行,则保留先前的值。(这是因为双&&吗?)
Baodad

9
2.4节中的此页讨论了单&符和双&符之间的区别
Baodad 2014年

1
对于那些曾经使用Microsoft SQL Server Management Studio中的变量进行查询的人来说,这是最好的答案。不过,在执行之前,我们可能需要习惯于突出显示整个查询。
鲍达德2014年

这个答案是在SQL-Developer 2.1中对我有用的解决方案。这绝对是实现用户更改查询上方的值而不必自己编辑查询的一种最直接的方法。
YonkeyDonk64 2014年

74

SQL-plus中有两种类型的变量:替换和绑定。

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

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

这是绑定(绑定变量存储在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支持替换变量,但是当您使用绑定:var语法执行查询时,系统会提示您进行绑定(在对话框中)。

参考:

使用UPDATE 替换变量有点棘手,请看:

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string

2
我在SQL Developer(4.1.1.19)中尝试了绑定,它也正在工作。我的意思是var xexec :x,没有提示。
Betlista

50

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

14
如果您使用“运行脚本”(F5)而不是“运行语句”,则不会提示您输入绑定变量。但是它似乎不喜欢select...into(ORA-01006),因此您需要这样做exec :v_emp_id := 1234;
亚历克斯·普尔

@Alex-不错!我只是放弃了,并假定SQL Developer总是提示输入绑定变量值。我已将您的建议纳入我的答案。
贾斯汀洞

1
@Nathan如果您要使用:v_emp_id执行包,则也可以将绑定变量用于refcursors。请参阅亚历克斯(Alex)对类似问题的回答的底部
康拉德·弗里克斯

2
@AlexPoole是否可以将输出发送到“查询结果”窗口?在我的工作中,我运行查询以导出到Excel文件。
tp9 2012年

13

好的,我知道这有点hack,但这是在简单查询中而不是脚本中使用变量的一种方式:

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

您可以在任何地方运行它。


有没有办法将它与UPDATE一起使用,而不是select?
罗恩·詹森-我们都是莫妮卡

12

简单的答案

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

在SQL Developer中运行上面的查询后,将提示您输入绑定变量EmployeeID的值。


8

您可以在其他地方阅读有关替代变量的内容。它们在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使用变量或反射器。您不能只是SELECT在PL / SQL中返回结果集。


2

我认为最简单的方法是:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

对于字符串值,它将类似于:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'


0

尝试此操作将起作用,最好创建一个过程,如果无法执行该过程,则可以使用此脚本。

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

0

在sql developer中,默认情况下定义属性“ ON”。如果“关闭”,请使用以下步骤。

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.