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

uoifb46i  于 2022-12-03  发布在  Oracle
关注(0)|答案(2)|浏览(287)

我想写一个由多个SQL语句组成的字符串,通过ODBC发送,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的对等项是什么?
干杯!干杯!

zlhcx6iw

zlhcx6iw1#

你得到这个错误是因为你选择了数据但是没有将它分配给声明的变量(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;
vlju58qv

vlju58qv2#

这里有很多混乱。八年前描述的问题是cte定义显然不能在BEGIN-END块中完成。这看起来确实是一个实际的约束/限制。我已经在某处搜索了一个声明,但没有找到一个,但这就是我所观察到的。我已经重新格式化了代码,并将其放在这个脚本中两次。一次在BE块内,一次不在BE块内。如果只运行前7行,它工作正常;如果您尝试运行整个过程或仅运行底部部分,则不会运行。我运行的是OraclePL/SQL企业版19。

相关问题