Oracle SQL 查询中的常量

Posted

技术标签:

【中文标题】Oracle SQL 查询中的常量【英文标题】:Constants in Oracle SQL query 【发布时间】: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? 【参考方案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');

【讨论】:

以上是关于Oracle SQL 查询中的常量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?

oracle 中的 sql语句查询

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

Java + Oracle 中的 SQL 查询

ORACLE 中的 SQL 查询 - 选择最近的日期

如何在SQL中获取常量值