从插入到选择中返回ID

问题描述

大家好,我需要一些有关此问题的帮助。我在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,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

enter image description here

最诚挚的问候

解决方法

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

documentation

您也许可以将insert拆分为

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

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

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

,

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

SELECT some_tab_seq.CURRVAL
INTO your_var
FROM DUAL;

但是在新版本中,您可以通过以下方式获取序列的当前值

temp_val := tab_seq.CURRVAL