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

Nat*_*han 109 sql oracle variables declare

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
Run Code Online (Sandbox Code Playgroud)

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

Omp*_*pie 86

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

define value1 = 'sysdate'

SELECT &&value1 from dual;
Run Code Online (Sandbox Code Playgroud)

它也是这里最简洁的方式.

(如果省略"define"-part,系统会提示您输入该值)

  • 如果将&& value1与字符串值进行比较,例如:&& value1 ='某些字符串',那么&& value1需要用单引号括起来,如:'&& value1'='Some string' (9认同)
  • [本页](http://www.oracle.com/technetwork/testcontent/sub-var2-099853.html)第2.4节讨论了单&符号(&)和双符号(&&)之间的区别 (9认同)

gav*_*koa 69

SQL-plus中有两种类型的变量:substitution和bind.

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

define a = 1;
select &a from dual;
undefine a;
Run Code Online (Sandbox Code Playgroud)

这是绑定(绑定变量存储在RDBMS中执行的SQL和PL/SQL语句的数据值;它们可以包含单个值或完整的结果集):

var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;
Run Code Online (Sandbox Code Playgroud)

SQL Developer支持替换变量,但是当您使用bind :var语法执行查询时,系统会提示您进行绑定(在对话框中).

参考:

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

define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is number
select '&phone' from dual; -- plus is preserved as it is string
Run Code Online (Sandbox Code Playgroud)

  • 我在SQL Developer(4.1.1.19)中尝试了绑定,它也在运行.我的意思是`var x`和`exec:x`的情况,没有提示. (2认同)

Jus*_*ave 49

在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
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)

  • 如果你'运行脚本'(F5)而不是'运行语句'那么它将不会提示绑定变量.但它似乎不喜欢`select ... into`(ORA-01006),所以你需要做`exec:v_emp_id:= 1234;`而不是. (13认同)
  • @AlexPoole有没有办法将输出发送到查询结果窗口?在我的工作中,我运行查询以导出到Excel文件. (2认同)

Cha*_*ndu 12

简单回答NO.

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 
Run Code Online (Sandbox Code Playgroud)

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


zpo*_*kas 9

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

WITH
    emplVar AS
    (SELECT 1234 AS id FROM dual)
SELECT
    *
FROM
    employees,
    emplVar
WHERE
    EmployId=emplVar.id;
Run Code Online (Sandbox Code Playgroud)

你可以到处运行它.


Bao*_*dad 7

你可以在其他地方读取替代变量; 它们在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;
Run Code Online (Sandbox Code Playgroud)

SET SERVEROUTPUT ON 使它可以将文本打印到脚本输出控制台.

我相信我们在这里所做的是官方称为PL/SQL.我们离开了纯粹的SQL土地,并在Oracle中使用了不同的引擎.你看到SELECT上面的?在PL/SQL中,您始终需要SELECT ... INTO变量或refcursor.您不能只SELECT在PL/SQL中返回结果集.


小智 5

我认为最简单的方法是:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar
Run Code Online (Sandbox Code Playgroud)

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

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
Run Code Online (Sandbox Code Playgroud)