在 DATE 列上使用“MERGE INTO”和“SELECT FROM Dual”时出现 ORA-00904“无效标识符”错误

Neo*_*Neo 2 oracle merge date ora-00904 dual-table

我在 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;
Run Code Online (Sandbox Code Playgroud)

MY_TABLE表定义如下:

CREATE TABLE "MY_DBO"."MY_TABLE" 
   (
     "MYTABLEID" NUMBER(38,0),
     "MYID" NUMBER(38,0),
     "MYDATE" DATE,
     "MYNUM" NUMBER(25,4)
   )
Run Code Online (Sandbox Code Playgroud)

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

ORA-00904: "TEMP"."P_DATE": 无效标识符

ORA-06512: 在“MY_DBO.MY_PKG”,第 54 行

ORA-06512: 在第 18 行

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

我在这里发现了类似的问题,但将“dual”更改为“MY_TABLE”的解决方案似乎对我不起作用。

PS:我对 Oracle 很陌生:)

Jue*_*elt 5

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

USING (SELECT
        p_id col_id,
        p_date col_date,
        p_num col_num
      FROM dual) temp
Run Code Online (Sandbox Code Playgroud)

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