【问题标题】:In PL/SQL, how do I use a varaible in a SELECT *without* using an INTO?在 PL/SQL 中,如何在不使用 INTO 的情况下在 SELECT 中使用变量?
【发布时间】:2014-10-14 06:10:05
【问题描述】:

我正在 Oracle 数据库中试验查询(使用 Oracle SQl Developer 和 PL/SQL Developer)

如果我运行一个简单的查询:(SELECT * FROM myTable WHERE id = 1234),结果会显示在 SQL 工具下方窗格中的漂亮网格中。

现在,我如何使用1234 的变量重写该查询,并且仍然有结果溢出到结果窗格中。我尝试过的所有东西要么无法编译,要么需要我做一个SELECT...INTO 然后手动输出结果。

我只是想按照这个思路做一些事情,并让它发挥作用:

 DECLARE p0 = 1234;
 SELECT * FROM myTable WHERE id = p0;

更新: 在我正在处理的实际查询中,变量将更像:

 DECLARE p0 = to_date('1/15/2014 7:11:05 AM','MM/DD/YYYY HH:MI:SS PM');
         p1 = p0 + .0007; -- one minute later.

所以能够用代码写出来很重要。

【问题讨论】:

  • 使用:p0 而不是p0
  • 使用:p0 会在弹出对话框中询问我要使用的值,而不是使用代码中的值。

标签: oracle plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

在 Toad(或 sqlplus 或 SQL Developer)中,您会这样做:

define x='20140820';
select to_date(&x, 'YYYYMMDD') from dual;

并作为脚本运行(重要)。

在 Toad 中,输出网格为:

old: select to_date(&x, 'YYYYMMDD') from dual
new: select to_date(20140820, 'YYYYMMDD') from dual

TO_DATE(20140820,'YYYYMMDD')
----------------------------
20-AUG-2014                 
1 row selected.

Grid1 只会以表格网格格式显示结果。

请注意,您可以通过以下方式抑制输出中的旧/新:

set verify off

在脚本顶部。

【讨论】:

    【解决方案2】:

    您可以尝试的一件事是创建一个名为cur 的绑定变量,例如REFCURSOR 类型,在PL/SQL 块中使用OPEN :cur FOR SELECT ...,然后将光标移出PRINT。这是一个非常简单的查询示例:

    VARIABLE cur REFCURSOR
    
    BEGIN
      OPEN :cur FOR SELECT * FROM DUAL;
    END;
    /
    
    PRINT cur
    

    这在 SQL*Plus 和 SQL Developer 中有效,尽管在后者中它仅在您使用“运行脚本 (F5)”按钮而不是“运行语句 (Ctrl+Enter)”按钮时才有效。此外,您不会获得包含结果的表格,而只会获得预格式化文本中的查询输出。此外,它不一定适用于其他工具,因为 VARIABLEPRINT 既不是 SQL 也不是 PL/SQL 的一部分 - SQL*Plus 和 SQL Developer 都理解它们并且可以解释它们。

    在 PL/SQL Developer 中,您可以使用测试窗口来处理这类事情。例如,在测试窗口中输入一个 PL/SQL 块,例如

    BEGIN
      OPEN :cur FOR SELECT * FROM DUAL;
    END;
    

    然后,将类型为“Cursor”的变量cur 添加到窗口底部的变量表中,(或从上下文菜单中选择扫描变量。请注意,PL/SQL Developer 不一定会获取类型对;您可能仍然需要更改类型。运行块后,可以通过单击变量表中cur 行中的“...”按钮在单独的窗口中获得光标的结果.

    【讨论】:

      【解决方案3】:

      作为 Luke 出色答案的一个小改动,如果您只想显示变量的值,您甚至不需要引用光标。把它放在一个测试窗口中:

      declare
          p0 date := to_date('1/15/2014 7:11:05 AM', 'MM/DD/YYYY HH:MI:SS PM');
      begin
          :p1 := p0 + .0007;
      end;
      

      然后在下方面板中设置p1 绑定变量。执行它将显示该值。

      【讨论】:

        猜你喜欢
        • 2022-06-23
        • 2016-04-24
        • 2011-12-10
        • 2017-03-29
        • 2017-03-18
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2012-10-05
        相关资源
        最近更新 更多