开始和结束中的Oracle公用表表达式(带)

开始和结束中的Oracle公用表表达式(带),oracle,common-table-expression,Oracle,Common Table Expression,我想编写一个由多个SQL语句组成的字符串,通过ODBC发送,ODBC将常量表示为“变量”,以提高可读性/维护性。我认为我需要使用DECLARE块。我不想编写过程或函数,这是一个临时查询 以下测试CTE在隔离状态下工作良好(无开始/结束块): 但是当我运行这个 declare badgerId CHAR(32); /*todo, use me later, a few times within multiple CTEs*/ begin WITH X AS ( SELECT 'HELLO' fro

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

以下测试CTE在隔离状态下工作良好(无开始/结束块):

但是当我运行这个

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语句中的任何时候,这都是非常棒的。甲骨文的等价物是什么


干杯

出现此错误是因为您正在选择数据,但没有将其分配给声明的变量(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;

你显然不是我!下次试着回答这个问题,不要光顾提问的人。。取决于您是真正返回单个值还是多行,在这种情况下,您可能需要一个ref游标。
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;