【问题标题】:Returning id from an Insert into from select from select从插入中返回 id 从选择中选择
【发布时间】:2020-11-11 08:28:43
【问题描述】:

大家好,我需要一些帮助来解决这个问题。我在 plsql 中使用这个查询:

  INSERT INTO HS_CPQ_COSTCHANNELDISCOUNT (CREATED_BY,UPDATED_BY,ORIGIN,PART_ID,CHANNEL_ID,DISCOUNTPERCENTAGE,EFFECTIVEDATE)
                Select M.CREATED_BY,M.UPDATED_BY,M.ORIGIN,P.ID,C.ID,M.DISCOUNTPERCENTAGE,M.EFFECTIVEDATE
                from (
                    select 'APEX_APP' CREATED_BY
                           ,'APEX_APP' UPDATED_BY
                           ,ORIGIN
                           ,part
                           ,channelid
                           ,REPLACE(DISCOUNTPERCENTAGE,'.',',') DISCOUNTPERCENTAGE
                           ,to_date(EFFECTIVEDATE,'YYYY-MM-DD HH24:MI:SS') EFFECTIVEDATE
                    from local_test_table 
                    where id = :tmp_ID
                ) m
                left outer join hs_mib_part p on (m.part = p.part)
                left outer join hs_mib_channel c on (m.channelid = c.CHANNELID)
                RETURNING id INTO new_id;

但我有下一个错误:

Informe de error -
ORA-06550: línea 128, columna 21:
PL/SQL: ORA-00933: comando SQL no terminado correctamente
ORA-06550: línea 113, columna 21:
PL/SQL: SQL Statement ignored

为什么我不能从这个插入返回 id?

我该如何解决这部分问题? - 我需要创建新 ID

最好的问候

【问题讨论】:

    标签: sql plsql oracle-sqldeveloper plsqldeveloper oracle19c


    【解决方案1】:

    returning into 仅支持单行 DML(insert values,不支持 insert select):

    您也许可以将insert 拆分为

    1. select ... bulk collect into collection
    2. forall i in collection.first .. collection.last insert into hs_cpq_costchanneldiscount

    其中collection 是本地声明的关联数组或与您插入的列匹配的嵌套表变量。

    或者对于单行,在插入之前将所需的值检索到 PL/SQL 记录中。

    【讨论】:

    • 但在这种情况下,如果您看到我的查询,我会按 ID 过滤,所以最后我只选择一行
    • 恐怕这是一个语法限制。 returning intoinsert values 有效,对 insert select 无效。
    • @Julio - 我在插入语句中看不到任何 ID。 HS_CPQ_COSTCHANNELDISCOUNT 是否有您希望返回的 ID 列
    【解决方案2】:

    在旧版本的 Oracle 中,您不能直接将 NEXTVAL / CURRVAL 读入 var 并且必须这样做:

    SELECT some_tab_seq.CURRVAL
    INTO your_var
    FROM DUAL;
    

    但在新版本中,您可以通过

    获取序列的当前值
    temp_val := tab_seq.CURRVAL
    

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2020-10-19
      相关资源
      最近更新 更多