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

时间:2011-04-13 17:52:16

标签: sql oracle variables declare

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

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

10 个答案:

答案 0 :(得分:82)

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

这也是这里提出的最简洁的方式。

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

答案 1 :(得分:61)

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

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

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

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

参考:

更新 替换变量使用起来有点棘手,请看:

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

答案 2 :(得分:48)

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

答案 3 :(得分:12)

简单回答NO。

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

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

答案 4 :(得分:8)

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

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

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

答案 5 :(得分: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;

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

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

答案 6 :(得分:0)

使用下一个查询:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

我认为您情况下最简单的方法是:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

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

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'