【问题标题】:PLS-000428 error Oracle stored procedure with CTEPLS-000428 错误 Oracle 存储过程与 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”语法。

标签: oracle stored-procedures plsql


【解决方案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;
/

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2013-04-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多