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)的主要内容,如果未能解决你的问题,请参考以下文章