gpt4 book ai didi

oracle - ORA-00904 'invalid identifier' 在 DATE 列上使用 'MERGE INTO' 和 'SELECT FROM dual' 时出错

转载 作者:行者123 更新时间:2023-12-02 05:40:37 25 4
gpt4 key购买 nike

我在 Oracle 数据库上有以下 PL/SQL 存储过程:

PROCEDURE MyProcedure (
p_id IN NUMBER
, p_date IN DATE
, p_num IN NUMBER)
AS
BEGIN
MERGE INTO MY_TABLE mytable
USING (SELECT
p_id,
p_date,
p_num
FROM dual) temp
ON (mytable.myid = temp.p_id AND mytable.mydate = temp.p_date)
WHEN MATCHED THEN
UPDATE SET
DIFFERENCE = temp.p_num,
WHEN NOT MATCHED THEN
INSERT VALUES (
MY_TABLEIDSEQ.NEXTVAL,
temp.p_id,
temp.p_date,
temp.p_num);
END MyProcedure;

MY_TABLE 表定义如下:

CREATE TABLE "MY_DBO"."MY_TABLE" 
(
"MYTABLEID" NUMBER(38,0),
"MYID" NUMBER(38,0),
"MYDATE" DATE,
"MYNUM" NUMBER(25,4)
)

但是,当我使用输入字段的有效值运行存储过程时,出现以下错误:

ORA-00904: "TEMP"."P_DATE": invalid identifier

ORA-06512: at "MY_DBO.MY_PKG", line 54

ORA-06512: at line 18

我不知道是什么原因造成的,如有任何帮助,我们将不胜感激。请注意,存储过程从 MY_PKG 的第 45 行开始。

我发现了一个类似的问题 here ,但将“双重”更改为“MY_TABLE”的解决方案似乎对我不起作用。

PS:我是 Oracle 的新手 :)

最佳答案

在“select from dual”语句中,您使用存储过程的输入参数作为值。 Oracle 确实为这些列生成了隐式名称,我目前无法预测。但是您可以在该语句中提供自己的列名/别名:

USING (SELECT
p_id col_id,
p_date col_date,
p_num col_num
FROM dual) temp

这些名称只是示例。我强烈建议您在这种情况下使用唯一的名称,以防止以后出现任何歧义。您需要将合并语句中对 temp.* 的任何使用替换为您提供的别名。

关于oracle - ORA-00904 'invalid identifier' 在 DATE 列上使用 'MERGE INTO' 和 'SELECT FROM dual' 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11019664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com