128

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

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

4

10 回答 10

104

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

这也是这里展示的最巧妙的方式。

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

于 2013-01-15T08:16:05.663 回答
82

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
于 2014-03-04T12:14:42.657 回答
53

In SQL*Plus, you can do something very similar

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

In SQL Developer, if you run a statement that has any number of bind variables (prefixed with a colon), you'll be prompted to enter values. As Alex points out, you can also do something similar using the "Run Script" function (F5) with the alternate EXEC syntax Alex suggests does.

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;
于 2011-04-13T18:08:15.000 回答
15

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

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

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

于 2016-07-08T10:22:37.240 回答
13

简单的答案 NO。

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

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

于 2011-04-13T18:02:26.197 回答
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使用变量或引用。您不能只SELECT返回 PL/SQL 中的结果集。

于 2015-01-08T21:22:32.517 回答
6

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

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

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

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
于 2019-07-02T09:48:19.960 回答
1

使用下一个查询:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
于 2017-03-14T12:39:57.537 回答
0

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

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
于 2018-03-06T08:05:18.093 回答
0

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

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

于 2018-10-12T08:39:42.130 回答