【问题标题】:How do I use variables in Oracle SQL Developer?如何在 Oracle SQL Developer 中使用变量?
【发布时间】:2011-08-04 22:27:45
【问题描述】:

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

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

【问题讨论】:

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

标签: sql oracle variables declare


【解决方案1】:

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

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

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

【讨论】:

  • 如果将 &&value1 与字符串值进行比较,例如:&&value1 = 'Some string',则 &&value1 需要用单引号括起来,例如:'&&value1' = 'Some string'
  • 在 SQL Developer 中,由 DEFINE 定义的替换变量似乎在查询执行之间是持久的。如果我更改变量值,但在执行时未显式突出显示 DEFINE 行,则保留先前的值。 (这是因为双 && 吗?)
  • This page 在第 2.4 节中讲了单 & 和双 & 的区别
  • 对于我们这些习惯在 Microsoft SQL Server Management Studio 中使用变量进行查询的人来说,这是最好的答案。不过,我们可能需要习惯于在执行之前突出显示整个查询。
  • 这个答案是在 SQL-Developer 2.1 中为我工作的解决方案。这绝对是实现用户更改查询上方的值而不必编辑查询本身的最直接的方法。
【解决方案2】:

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

这是替换(替换变量可以替换 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 语法执行查询时,系统会提示您进行绑定(在对话框中)。

参考:

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

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

【讨论】:

  • 我在 SQL Developer (4.1.1.19) 中尝试了绑定,它也可以正常工作。我的意思是var xexec :x的情况,没有提示。
【解决方案3】:

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

【讨论】:

  • 如果你“运行脚本”(F5)而不是“运行语句”,那么它不会提示输入绑定变量。但它似乎不喜欢select...into (ORA-01006),所以你需要改用exec :v_emp_id := 1234;
  • @Alex - 不错!我只是放弃并假设 SQL Developer 总是提示输入绑定变量值。我将您的建议纳入我的回答中。
  • @Nathan 如果您希望使用 :v_emp_id 执行包,您也可以使用绑定变量作为引用。请参阅 Alex 的 answer 底部以了解我遇到的类似问题
  • @AlexPoole 有没有办法将输出发送到查询结果窗口?在我的工作中,我运行查询以导出到 Excel 文件。
【解决方案4】:

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

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

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

【讨论】:

  • 有没有办法将它与 UPDATE 一起使用而不是 select?
【解决方案5】:

简单回答NO。

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

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

【讨论】:

    【解决方案6】:

    您可以在其他地方阅读替代变量;它们在 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 中返回结果集。

    【讨论】:

      【解决方案7】:

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

      DEFINE EmpIDVar = 1234;
      
      SELECT *
      FROM Employees
      WHERE EmployeeID = &EmpIDVar
      

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

      DEFINE EmpIDVar = '1234';
      
      SELECT *
      FROM Employees
      WHERE EmployeeID = '&EmpIDVar'
      

      【讨论】:

      • 已验证,在 ORACLE SQL Developer 20.2.0.175 Build 175.1842 版本中运行。我用我的表对其进行了测试:define usr = 'BT'; select * from department where created_by = '&usr';
      【解决方案8】:

      使用下一个查询:

      DECLARE 
        EmpIDVar INT;
      
      BEGIN
        EmpIDVar := 1234;
      
        SELECT *
        FROM Employees
        WHERE EmployeeID = EmpIDVar;
      END;
      

      【讨论】:

      • 错误返回“PLS-00428 在这个 SELECT 语句中需要一个 INTO 子句”
      【解决方案9】:

      试试这个就行了,最好创建一个程序,如果程序不可行你可以使用这个脚本。

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

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

        • 这是对我有用的最简单的答案。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多