【问题标题】:Can I declare a variable AFTER select in Oracle SQL?我可以在 Oracle SQL 中选择后声明一个变量吗?
【发布时间】:2018-12-28 16:20:44
【问题描述】:

我正在使用专有的 ASPX 查询编辑器,它强迫我使用 SELECT 开始每个查询。它不允许我向第一个单词不是 SELECT 的数据库发送任何代码。

所以我很好奇,有没有一种方法可以在 SELECT 语句之后在选择查询中声明和设置变量?

declare @var datetime
set @var = (select sysdate from dual)
select @var from dual

应用程序错误:“SQLQuery 应以 'SELECT' 关键字开头。”

需要明确的是,这是来自应用程序界面的错误,而不是 Oracle 错误。

编辑:上面的代码 sn-p 不是 PL/SQL(我不认为),但我用它来显示错误。

【问题讨论】:

  • 在我看来这不像 PL/SQL。这个编辑器有自己的语言并以某种方式翻译吗?
  • 你的变量将用于什么?您实际上是在尝试在查询中运行 PL/SQL 块,还是只是避免重复固定值或其他什么?根据您之前的评论;如果它只允许以“select”开头的文本,它如何接受本机 PL/SQL - 这两个语句似乎矛盾?
  • 如果编辑器要求你使用SELECT作为第一个词,那么它不接受PL/SQL代码,纯粹的和简单的。而且它甚至不允许您使用 SQL 标准(以及因此在许多数据库产品中)中存在的旧功能编写标准 SQL 查询 - 例如 WITH 子句。删除该编辑器并选择其他内容;例如,SQL Developer 非常棒,而且是免费的。
  • 如果它不以declarebegin 开头,那么它就不是一个PL/SQL 块......它听起来并不像它允许除了简单查询之外的任何东西。也许如果你包括一个你想做的例子,它可能会有所帮助。 (如果可以的话,切换到不同的客户端听起来是个好主意……)
  • 把所有你想使用的“变量”放到一个交叉连接的子查询中

标签: sql-server sybase


【解决方案1】:

您可以在嵌套 CTE 中定义变量:

select * from (
  -- CTE to define variables (sort of)
  with cte (some_date) as (
    select date '2018-12-31' from dual
  )
  -- your real query that joins to the CTE and used cte.some_date
  select d.*
  from cte
  cross join dual d
  where sysdate < cte.some_date
);

或更简单的内联视图:

select d.*
from (
  select date '2018-12-31' as some_date from dual
) t
cross join dual d
where sysdate < t.some_date;

无论哪种方式,ctet 都是单行表,因此交叉连接使其列可见,但不会乘以最终结果集中的行数(或者更确切地说,仅乘以1,这是同一件事)。

您的“客户”是否接受这两种形式是另一回事...

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2022-01-09
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2010-10-01
    相关资源
    最近更新 更多