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