PLS-000428 错误 Oracle 存储过程与 CTE

Posted

技术标签:

【中文标题】PLS-000428 错误 Oracle 存储过程与 CTE【英文标题】:PLS-000428 error Oracle stored procedure with CTE 【发布时间】:2021-01-27 08:35:34 【问题描述】:

我在尝试创建 Oracle 存储过程时遇到问题。我在下面提供代码的骨架。

Create or replace procedure "SP_UPDATE_DATA" AS
BEGIN
WITH CTE1 AS
(
SELECT A.F1, A.F2 ,B.F3 FROM A, B WHERE A.X1=B.X1
),
CTE2 AS
(
SELECT A.F1,A.F2,C.F5
FROM
CTE1 A,C
WHERE A.F1=C.F1
)
UPDATE TABLE MAIN
SET XYZ=CTE2.F2
FROM
CTE2
WHERE
MAIN.F1.CTE2.F2

当我尝试编译程序时出现错误

SELECT 中预期有 INTO 子句

虽然我实际上没有使用任何变量,也没有返回任何内容,也没有选择任何内容,但仍然面临错误。不确定它是否与 CTE 有关。

需要您的意见才能达成解决方案。

提前致谢。

【问题讨论】:

Update .. from 在 oracle 中的语法不正确。 您可能需要merge 而不是update 谢谢,您可以假设 UPDATE ..FROM 语法是正确的,但仍然显示上述错误。 因为需要将select语句的结果返回到变量中,或者PL/SQL代码中的游标中。 "您可以假设 UPDATE ..FROM 语法是正确的"。是的,我们可以做到,问题是(与许多假设一样)这是一个完全错误的假设。 Oracle 不支持“Update...From”语法。 【参考方案1】:

应该是这样的:

CREATE OR REPLACE PROCEDURE sp_update_data
AS
BEGIN
   
   UPDATE MAIN
      SET XYZ = ( WITH
                     CTE1 AS
                     ( SELECT A.F1, A.F2, B.F3
                         FROM A, B
                        WHERE A.X1=B.X1
                     ),
                     CTE2 AS
                     ( SELECT A.F1, A.F2, C.F5
                         FROM CTE1 A, C
                        WHERE A.F1=C.F1
                     )
                  SELECT CTE2.F2
                    FROM CTE2
                   WHERE MAIN.F1=CTE2.F2
                );

END sp_update_data;
/

【讨论】:

以上是关于PLS-000428 错误 Oracle 存储过程与 CTE的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程提示编译完成但存在错误,如何查看错误

oracle存储过程,如何获得详细的错误信息

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

oracle存储过程调用老出现错误,没数据

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

oracle sql developer oracle-00904 存储过程执行错误