BEGIN 和 END 中的 Oracle 公用表表达式 (WITH)

Posted

技术标签:

【中文标题】BEGIN 和 END 中的 Oracle 公用表表达式 (WITH)【英文标题】:Oracle Common Table Expressions (WITH) within BEGIN and END 【发布时间】:2014-11-13 15:56:00 【问题描述】:

我想编写一个包含多个 SQL 语句的字符串,通过 ODBC 发送,其中的常量表示为“变量”以提高易读性/维护性。我相信我需要使用 DECLARE 块。我不想编写过程或函数,这是一个临时查询。

以下测试 CTE 可以单独工作(没有开始/结束块):

WITH X AS ( SELECT 'HELLO' from DUAL ) SELECT * FROM X;

但是当我运行它时

declare
badgerId CHAR(32); /*todo, use me later, a few times within multiple CTEs*/
begin
WITH X AS ( SELECT 'HELLO' from DUAL ) SELECT * FROM X;
end;

我得到错误:

Error starting at line 2 in command:
declare
badgerId CHAR(32); /*todo, use me later*/
begin
WITH X AS ( SELECT 'HELLO' from DUAL ) SELECT * FROM X;
end;
Error report:
ORA-06550: line 4, column 1:
PLS-00428: an INTO clause is expected in this SELECT statement
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

这是什么乱七八糟的东西?在 SQL Server 中,我只需键入即可。

DECLARE @badgerId CHAR(32); 

随时在SQL语句中,这太棒了。什么是 Oracle 等价物?

干杯!

【问题讨论】:

你不是我,很明显!下次尝试回答问题,而不是光顾提问的人。 This might be helpful。取决于您是否真的要返回单个值或多行,在这种情况下您可能需要一个 ref 游标。 【参考方案1】:

您收到此错误是因为您选择了数据但未将其分配给声明的变量 (badgerId)。以下应该可以工作,

declare
badgerId CHAR(32); /*todo, use me later, a few times within multiple CTEs*/
begin
WITH X AS ( SELECT 'HELLO' from DUAL ) SELECT * into badgerId FROM X;
end;

【讨论】:

以上是关于BEGIN 和 END 中的 Oracle 公用表表达式 (WITH)的主要内容,如果未能解决你的问题,请参考以下文章

oracle中declare begin end 这样的用法叫啥语句?它和直接写select那种语句有啥联系?

SQL中begin end 啥意思?怎么用着条语句?

如何查询oracle中的所有表和视图

oracle分析表,解决索引失效

oracle带参(传入,传出)的存储过程怎么执行

Oracle 与 MySQL 批量添加