【问题标题】:Constants in Oracle SQL queryOracle SQL 查询中的常量
【发布时间】:2009-08-18 10:12:46
【问题描述】:

我是 Oracle 的新手(虽然熟悉 SQL)并且必须编写一个相当复杂的查询,其中从当前日期派生的值被多次使用。与其每次都计算值,不如为此声明一个常数。

但是,当我尝试在随后的 SELECT 语句中使用我的 DateIndex 常量(我希望根据“DateIndex”返回值)时,解析器告诉我它正在执行 SELECT INTO。

我所拥有的(简化为最低形式)是......

 DECLARE DateIndex CONSTANT NUMBER(10,0) := 24;

 BEGIN
      SELECT DateIndex
      FROM DUAL;
END;

是否只能在选择表格而不返回结果时使用常量?看起来很奇怪。

请注意,我确实没有对数据库具有写入权限。

非常感谢您的帮助。

【问题讨论】:

  • 你用的是什么工具? SQL*Plus?

标签: sql database oracle constants


【解决方案1】:

我更喜欢WITH 和 DUAL 表的以下用法:

WITH 
const AS ( SELECT 
    3.14 AS pi,
    1    AS one 
    FROM DUAL
)
SELECT * FROM sometable t,  const
 WHERE t.value = const.pi;

这使您可以在语句中使用之前定义常量,并且实际语句不会被子选择弄乱。

【讨论】:

    【解决方案2】:

    您的代码不是 Oracle SQL,而是 PL/SQL。在 PL/SQL 中,查询的结果必须分配给一个变量。因此,如果您期望只有一个结果,则必须使用“select into 子句”,或者使用游标。

    另一方面,在 SQL 中,您不能声明常量。您有时可以通过使用这样的内联视图来解决此限制

    select something-complex-here, x.pi 
    from sometable, (
        select 3.1415 as pi, 1234 other_constant 
        from dual
    )
    

    【讨论】:

    • 这可能引起了我的一些困惑。正如您从我上面的评论中看到的那样,我习惯于在我的 SQL 中创建局部变量和常量(更不用说临时表了!)。
    • 啊!我赶上你的漂移。效果不错,我试试。谢谢。
    【解决方案3】:
    DECLARE 
    DateIndex CONSTANT NUMBER(10,0) := 24;
    TargetVariable NUMBER;
    BEGIN
          SELECT DateIndex
          INTO TargetVariable
          FROM DUAL;
    END;
    

    【讨论】:

    • 嗨,感谢您的及时回复,但也许我过于简化了这个例子。我需要做的是根据 DateIndex 的值返回查询的结果。例如。 (稍微不那么简单的例子!)... SELECT * FROM SomeTable WHERE SomeColumn = DateIndex;
    【解决方案4】:

    该错误与您的常量无关,该错误是因为您使用的是没有 INTO 的 SELECT 语句。例如,匿名块中的 SELECT 与从 SQL*Plus 运行 SELECT 语句不同。选择一些东西然后什么也不做是没有意义的,这就是为什么它会提示你进入:

    SELECT colA, colB
    INTO variable_a, variable_b
    WHERE something = DateIndex;
    

    这当然假设您的查询将只返回一行。我有一种感觉,您真正想要的是编写一个包含您的逻辑并返回您可以从中选择的嵌套表类型的函数。

    编辑:没关系,我看到无法创建类型

    【讨论】:

    • 是的,我正在尝试将结果表返回给运行查询以在网页上显示的 VB。这在我更熟悉的领域太简单了... DECLARE @DateIndex int SET @DateIndex = MONTH(GETDATE()) + 12 * YEAR(GETDATE()) SELECT * FROM Log WHERE MonthIndex = @DateIndex
    【解决方案5】:

    当您想要返回结果集时,您需要一个引用光标

    create or replace procedure getlogs(p_sys_refcursor out sys_refcursor)
    is
    begin
      open p_sys_refcursor for
        select *
        from   log
        where  monthindex = 12 * to_char(sysdate,'yyyy') + to_char(sysdate,'mm');
    end;
    /
    

    sysdate 的值只会在查询开始时确定一次,因此不需要在 sql 或 pl/sql 中声明某种常量。

    编辑1

    当您不想调用存储过程时,请执行以下操作:

    select *
    from   log
    where  monthindex = 12 * to_char(sysdate,'yyyy') + to_char(sysdate,'mm');
    

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      相关资源
      最近更新 更多