无需合并即可重写Oracle PL / SQL过程

问题描述

我需要重写以下过程而不合并。 因此,基本上,插入/更新需要在没有合并的情况下完成,如果可能的话,可以使用任何其他替代方法。 数据库是Oracle12c / 12.1

CREATE OR REPLACE PROCEDURE PUSH_DATA(p_id NUMBER) IS
BEGIN
MERGE INTO push_data_temp tgt
USING(
with rcte (id,data,lvl,result) 
as (
 select id,1,regexp_substr(data,'("[^"]*"|[^,"]+)',null,1) result
   from disp_data where id=p_id
union all
 select id,lvl + 1,1)
   from rcte
where lvl <= regexp_count(data,"]+)')
 )
select *
from (
select id,replace(result,'""','') as result
from rcte
)
pivot (max(result)
FOR   (lvl) IN(1 AS col1,2 AS col2,3 AS col3,4 AS col4,5 AS col5,6 AS col6,7 AS col7,8 AS col8,9 AS col9,10 AS col10,11 AS col11,12 AS col12))
      ) src
  ON (src.id = tgt.id)
WHEN MATCHED THEN UPDATE
 SET col1 = src.col1,col2 = src.col2,col3 = src.col3,col4 = src.col4,col5 = src.col5,col6 = src.col6,col7 = src.col7,col8 = src.col8,col9 = src.col9,col10 = src.col10,col11 = src.col11,col12 = src.col12
WHEN NOT MATCHED THEN 
  INSERT (id,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12)
  VALUES (src.id,src.col1,src.col2,src.col3,src.col4,src.col5,src.col6,src.col7,src.col8,src.col9,src.col10,src.col11,src.col12);
END;
/

@sujitmohanty帮助我完成了该过程。

解决方法

我修改了程序,以在loop上使用普通merge。请记住,稍后再更改为merge,因为与您的情况一样,它是insert/update操作的最佳选择。

我将过程参数设为可选,如果您传递pid,它将对特定的insert/update执行pid,否则只需传递null,它将对所有参数都起作用。

注意:对于海量数据,您可能需要重新考虑使用批量收集操作来进行插入或更新(如果仅需要这样做)

CREATE OR REPLACE PROCEDURE PUSH_DATA(p_id NUMBER) IS
  CURSOR cur_data IS
    WITH rcte (id,data,lvl,result)
    AS (
         SELECT id,1,regexp_substr(data,'("[^"]*"|[^,"]+)',null,1) result
           FROM disp_data where id=coalesce(p_id,id)
        UNION ALL
         SELECT id,lvl + 1,1)
           FROM rcte
        WHERE lvl <= regexp_count(data,"]+)')
       )
    SELECT *
    FROM (SELECT id,replace(result,'""','') as result
            FROM rcte)
    PIVOT (MAX(result)
     FOR (lvl) IN(1 AS col1,2 AS col2,3 AS col3,4 AS col4,5 AS col5,6 AS col6,7 AS col7,8 AS col8,9 AS col9,10 AS col10,11 AS col11,12 AS col12));
   var cur_data%ROWTYPE;
BEGIN
  OPEN cur_data;
  LOOP
    FETCH cur_data INTO var;
    EXIT WHEN cur_data%NOTFOUND;
    UPDATE push_data_temp
    SET col1 = var.col1,col2 = var.col2,col3 = var.col3,col4 = var.col4,col5 = var.col5,col6 = var.col6,col7 = var.col7,col8 = var.col8,col9 = var.col9,col10 = var.col10,col11 = var.col11,col12 = var.col12
    WHERE ID = var.id;
    IF SQL%ROWCOUNT = 0
    THEN
       INSERT INTO push_data_temp(id,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12)
          VALUES (var.id,var.col1,var.col2,var.col3,var.col4,var.col5,var.col6,var.col7,var.col8,var.col9,var.col10,var.col11,var.col12);
    END IF;
  END LOOP;
END;
/

测试:-

BEGIN
   push_data(p_id=>null);
END;
/

最后Dbfiddle

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...