oracle嵌套xml解析

1hdlvixo  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(371)

我有一个excel,当我用应用程序导入excel时,我将其转换为xml字符串,然后将其发送到oracle中的过程。下面的代码是我的程序。

  1. PROCEDURE SP_UPLOAD_KALEMS(P_REFCURSOR OUT SYS_REFCURSOR,P_YEAR IN NUMBER,P_MONTH IN NUMBER,P_KALEMS IN CLOB) IS personelId NUMBER; BEGIN
  2. SAVEPOINT start_tran;
  3. DELETE FROM HRANALY.WAGE_ACTUAL WA WHERE WA.A_MONTH=P_MONTH AND WA.A_YEAR=P_YEAR;
  4. FOR r IN (
  5. select * FROM XMLTABLE('/ArrayOfBaseUpload/BaseUpload'PASSING xmltype(P_KALEMS)
  6. COLUMNS
  7. SICIL NUMBER PATH './SICIL',
  8. SAP_ORG_KOD NUMBER PATH './SAP_ORG_KOD' ,
  9. POSITION VARCHAR2(100) PATH './POSITION',
  10. IS_INFO VARCHAR2(10) PATH './IS',
  11. FABRIC VARCHAR2(10) PATH './FABRIC',
  12. COST_CENTER NUMBER PATH './COST_CENTER' ,
  13. PERSONE_TYPE VARCHAR2(10) PATH './PERSONE_TYPE',
  14. UCRET_TIP VARCHAR2(10) PATH './UCRET_TIP' ,
  15. BELGE_KOD VARCHAR2(200) PATH './BELGE_KOD',
  16. TUTAR NUMBER PATH './TUTAR' ,
  17. SGK_GUN NUMBER PATH './SGK_GUN' ,
  18. SSK_MATRAH NUMBER PATH './SSK_MATRAH' ,
  19. SS_MATRAH NUMBER PATH './SS_MATRAH' ,
  20. YASAL_NET NUMBER PATH './YASAL_NET' ,
  21. ODEME_TUTARI NUMBER PATH './ODEME_TUTARI'
  22. ) PERSONELS
  23. )LOOP
  24. personelId:=HRANALY.SEQ_WAGE_MAIN.nextval;
  25. INSERT INTO HRANALY.WAGE_ACTUAL(ID,SICIL,SAP_ORG_KOD, POSITION,IS_INFO,FABRIC,COST_CENTER,PERSONE_TYPE,A_MONTH,A_YEAR,UCRET_TIP,BELGE_KOD,
  26. TUTAR,SGK_GUN,SSK_MATRAH,SS_MATRAH,YASAL_NET,ODEME_TUTARI)
  27. VALUES(personelId,r.SICIL,r.SAP_ORG_KOD,r.POSITION,r.IS_INFO,r.FABRIC,r.COST_CENTER,r.PERSONE_TYPE,P_MONTH,P_YEAR,R.UCRET_TIP,r.BELGE_KOD,
  28. r.TUTAR,r.SGK_GUN,r.SSK_MATRAH,r.SS_MATRAH,r.YASAL_NET,r.ODEME_TUTARI);
  29. FOR p IN (
  30. select * FROM XMLTABLE('/ArrayOfBaseUpload/BaseUpload/DETAILS/DetayUpload'PASSING xmltype(P_KALEMS)
  31. COLUMNS CODE varchar2(100) PATH './CODE',
  32. SICIL NUMBER PATH './../../SICIL',
  33. AMOUNT NUMBER PATH './AMOUNT') kalems
  34. )
  35. LOOP
  36. IF r.SICIL=p.SICIL THEN
  37. INSERT INTO HRANALY.WAGE_ACTUAL_DETAIL(ID,REF_WAGE,AMOUNT,KALEM_KOD,A_MONTH,A_YEAR)
  38. VALUES(HRANALY.SEQ_WAGE_DETAIL.nextval,personelId,p.AMOUNT,p.CODE,P_MONTH,P_YEAR);
  39. END IF;
  40. END LOOP;
  41. END LOOP;
  42. COMMIT;
  43. OPEN P_REFCURSOR FOR
  44. SELECT 'SUCCESS' AS RESULT FROM DUAL;
  45. EXCEPTION
  46. WHEN OTHERS THEN
  47. ROLLBACK TO start_tran;
  48. OPEN P_REFCURSOR FOR
  49. SELECT 'ERROR' AS RESULT FROM DUAL;
  50. RAISE;
  51. END ;

我的问题是,我在excell中有大约2000行和大约40列(可以多多少少)。其中15个是静态列,保存在 HRANALY.WAGE_ACTUAL 其他表是动态的,并插入到 HRANALY.WAGE_ACTUAL_DETAIL . SICIL 是唯一的,例如用户的标识码。对于一个sicil,可以将多个详细信息插入到 HRANALY.WAGE_ACTUAL_DETAIL 我的代码插入所有变量花费了太多时间。我想更快地优化这个代码。我怎样才能加速呢。
我的xml像

  1. <ArrayOfBaseUpload>
  2. <BaseUpload>
  3. <SICIL>1</SICIL>
  4. <SAP_ORG_KOD>500</SAP_ORG_KOD>
  5. <POSITION>Operator</POSITION>
  6. <IS>TR - Dikim </IS>
  7. <FABRIC>IZ01</FABRIC>
  8. <COST_CENTER>100</COST_CENTER>
  9. <PERSONE_TYPE>T2</PERSONE_TYPE>
  10. <UCRET_TIP>Brüt</UCRET_TIP>
  11. <BELGE_KOD>1</BELGE_KOD>
  12. <TUTAR>10.00</TUTAR>
  13. <SGK_GUN>30</SGK_GUN>
  14. <SSK_MATRAH>100</SSK_MATRAH>
  15. <SS_MATRAH>100</SS_MATRAH>
  16. <YASAL_NET>100</YASAL_NET>
  17. <ODEME_TUTARI>100</ODEME_TUTARI>
  18. <DETAILS>
  19. <DetayUpload><CODE>TEMEL_UCRET</CODE><AMOUNT>100</AMOUNT></DetayUpload>//here there can ve 40 data like that
  20. </DETAILS>
  21. </BaseUpload>
  22. </ArrayOfBaseUpload>

提前谢谢

qrjkbowd

qrjkbowd1#

编写慢sql的最好方法是 insert/update/delete 在一次改变一行的循环中。
如果您想要快速sql,可以使用一条语句来更改所有行。将回路替换为两个 insert-select 声明应该加速:

  1. insert into hranaly.wage_actual(
  2. id,sicil,sap_org_kod, position,is_info,fabric,cost_center,persone_type,a_month,a_year,ucret_tip,belge_kod,
  3. tutar,sgk_gun,ssk_matrah,ss_matrah,yasal_net,odeme_tutari
  4. )
  5. select hranaly.seq_wage_main.nextval, sicil,sap_org_kod,
  6. position,is_info,fabric,cost_center,persone_type,
  7. p_month,p_year,ucret_tip,belge_kod,tutar,sgk_gun,
  8. ssk_matrah,ss_matrah,yasal_net,odeme_tutari
  9. from xmltable('/ArrayOfBaseUpload/BaseUpload' passing xmltype( p_kalems )
  10. columns
  11. sicil number path './SICIL',
  12. sap_org_kod number path './SAP_ORG_KOD' ,
  13. position varchar2(100) path './POSITION',
  14. is_info varchar2(10) path './IS',
  15. fabric varchar2(10) path './FABRIC',
  16. cost_center number path './COST_CENTER' ,
  17. persone_type varchar2(10) path './PERSONE_TYPE',
  18. ucret_tip varchar2(10) path './UCRET_TIP' ,
  19. belge_kod varchar2(200) path './BELGE_KOD',
  20. tutar number path './TUTAR' ,
  21. sgk_gun number path './SGK_GUN' ,
  22. ssk_matrah number path './SSK_MATRAH' ,
  23. ss_matrah number path './SS_MATRAH' ,
  24. yasal_net number path './YASAL_NET' ,
  25. odeme_tutari number path './ODEME_TUTARI'
  26. );
  27. insert into hranaly.wage_actual_detail(id,ref_wage,amount,kalem_kod,a_month,a_year)
  28. select hranaly.seq_wage_detail.nextval,wa.id,
  29. p.amount,p.code,p_month,p_year
  30. from hranaly.wage_actual wa
  31. join xmltable('/ArrayOfBaseUpload/BaseUpload/DETAILS/DetayUpload' passing xmltype ( p_kalems )
  32. columns
  33. code varchar2(100) path './CODE',
  34. sicil number path './../../SICIL',
  35. amount number path './AMOUNT'
  36. ) kalems
  37. on wa.a_month= p_month
  38. and wa.a_year=p_year
  39. and wa.sicil=kalems.sicil;

您甚至可以将其制作成一个多表插入( insert all )可能更快。不过,我只会在上述变化仍然太慢的情况下研究这个问题。

展开查看全部
ibps3vxo

ibps3vxo2#

分别用写循环来解决。

  1. PROCEDURE SP_UPLOAD_KALEMS(P_REFCURSOR OUT SYS_REFCURSOR,P_YEAR IN NUMBER,P_MONTH IN NUMBER,P_KALEMS IN CLOB) IS personelId NUMBER; BEGIN
  2. SAVEPOINT start_tran;
  3. DELETE FROM HRANALY.WAGE_ACTUAL WA WHERE WA.A_MONTH=P_MONTH AND WA.A_YEAR=P_YEAR;
  4. DELETE FROM HRANALY.WAGE_ACTUAL_DETAIL WA WHERE WA.A_MONTH=P_MONTH AND WA.A_YEAR=P_YEAR;
  5. FOR r IN (
  6. select * FROM XMLTABLE('/ArrayOfBaseUpload/BaseUpload'PASSING xmltype(P_KALEMS)
  7. COLUMNS
  8. SICIL NUMBER PATH './SICIL',
  9. SAP_ORG_KOD NUMBER PATH './SAP_ORG_KOD' ,
  10. POSITION VARCHAR2(100) PATH './POSITION',
  11. IS_INFO VARCHAR2(10) PATH './IS',
  12. FABRIC VARCHAR2(10) PATH './FABRIC',
  13. COST_CENTER NUMBER PATH './COST_CENTER' ,
  14. PERSONE_TYPE VARCHAR2(10) PATH './PERSONE_TYPE',
  15. UCRET_TIP VARCHAR2(10) PATH './UCRET_TIP' ,
  16. BELGE_KOD VARCHAR2(200) PATH './BELGE_KOD',
  17. TUTAR NUMBER PATH './TUTAR' ,
  18. SGK_GUN NUMBER PATH './SGK_GUN' ,
  19. SSK_MATRAH NUMBER PATH './SSK_MATRAH' ,
  20. SS_MATRAH NUMBER PATH './SS_MATRAH' ,
  21. YASAL_NET NUMBER PATH './YASAL_NET' ,
  22. ODEME_TUTARI NUMBER PATH './ODEME_TUTARI'
  23. ) PERSONELS
  24. )LOOP
  25. personelId:=HRANALY.SEQ_WAGE_MAIN.nextval;
  26. INSERT INTO HRANALY.WAGE_ACTUAL(ID,SICIL,SAP_ORG_KOD, POSITION,IS_INFO,FABRIC,COST_CENTER,PERSONE_TYPE,A_MONTH,A_YEAR,UCRET_TIP,BELGE_KOD,
  27. TUTAR,SGK_GUN,SSK_MATRAH,SS_MATRAH,YASAL_NET,ODEME_TUTARI)
  28. VALUES(personelId,r.SICIL,r.SAP_ORG_KOD,r.POSITION,r.IS_INFO,r.FABRIC,r.COST_CENTER,r.PERSONE_TYPE,P_MONTH,P_YEAR,R.UCRET_TIP,r.BELGE_KOD,
  29. r.TUTAR,r.SGK_GUN,r.SSK_MATRAH,r.SS_MATRAH,r.YASAL_NET,r.ODEME_TUTARI);
  30. END LOOP;
  31. FOR p IN (
  32. select * FROM XMLTABLE('/ArrayOfBaseUpload/BaseUpload/DETAILS/DetayUpload'PASSING xmltype(P_KALEMS)
  33. COLUMNS CODE varchar2(100) PATH './CODE',
  34. SICIL NUMBER PATH './../../SICIL',
  35. AMOUNT NUMBER PATH './AMOUNT') kalems
  36. )
  37. LOOP
  38. INSERT INTO HRANALY.WAGE_ACTUAL_DETAIL(ID,REF_WAGE,AMOUNT,KALEM_KOD,A_MONTH,A_YEAR)
  39. SELECT HRANALY.SEQ_WAGE_DETAIL.nextval,WA.ID,p.AMOUNT,p.CODE,P_MONTH,P_YEAR
  40. FROM HRANALY.WAGE_ACTUAL WA WHERE WA.A_MONTH= P_MONTH AND WA.A_YEAR=P_YEAR AND WA.SICIL=p.SICIL;
  41. END LOOP;
  42. COMMIT;
  43. OPEN P_REFCURSOR FOR
  44. SELECT 'SUCCESS' AS RESULT FROM DUAL;
  45. EXCEPTION
  46. WHEN OTHERS THEN
  47. ROLLBACK TO start_tran;
  48. OPEN P_REFCURSOR FOR
  49. SELECT 'ERROR' AS RESULT FROM DUAL;
  50. RAISE;
  51. END ;
展开查看全部

相关问题