ORCL 遊標 CLOB應用 拼接JSON

遊標的初步應用:遍歷數據,根據數據中的某個字段,然後再做查詢並循環拼接JSON數據並返回,用戶後續數據的插入。

DECLARE
v_num number:=0; --
 var_advice_json clob;
 var_json clob;
 var_flow_log clob;
 var_docbody clob;
 var_attachment clob;
 var_attachment_json clob;
 num_body  number:=0;
 num_attachment  number:=0;
CURSOR  emp_cursor  is select cd.*,case when cd.doc_code = 'wdwlw' then 'tywdwlw' when  cd.doc_code ='fjzfw' then 'tycbj' when cd.doc_code = 'jbj' then 'tyjbj' when  cd.doc_code ='jfw' then 'tyjfw'end odoc_code
,substr(cd.doc_body,instr(cd.doc_body,'"refId":"')+9,(instr(cd.doc_body,'"name":')-2)-(instr(cd.doc_body,'"refId":"')+9)) as c_textces,--正文信息<利用文件的固定格式,將refID獲取到>
substr(cd.doc_body,instr(cd.doc_body,'"name":"')+8,(instr(cd.doc_body,'"template":')-2)-(instr(cd.doc_body,'"name":"')+8)) as c_textces_Name,--正文名稱
substr(cd.attachment,instr(cd.attachment,'"detailList":')+13,(instr(cd.attachment,'}]'))+2-(instr(cd.attachment,'"detailList":')+13)) as c_attachtment,--附件json信息<獲取對象下的detailList屬性中存放的批量附件>
LENGTH(REGEXP_REPLACE(REPLACE(cd.attachment, '"refId":', '@'), '[^@]+', '')) attach_counts --附件的個數<計算refId出現了多少次,一遍知曉需要遍歷多少次才能拿到所有的附件信息>
from COS_ODOC_OLD_DOCUMENT cd;
BEGIN  
    for ec  IN emp_cursor loop
      var_advice_json:='';--初始化
      var_json:='';
      var_flow_log:='';
      var_docbody:='';
      var_attachment:='';
      var_attachment_json:='';  
      --遊標查詢該公文的正文,並封裝成cos2支持的格式
      DECLARE
      CURSOR  emp_cur  is select f.c_reference_id,m.c_size,f.c_app_id,f.c_file_name from dev_wz.tbl_file_reference f left join dev_wz.tbl_file_metadata m on f.c_file_code = m.c_code where f.c_reference_id = ec.c_textces;
      BEGIN
        for es  IN emp_cur loop
             var_docbody:='[{\"id\":\"ntkoFrame-C_DOCBODY-'||num_body||'\",\"index\":'||num_body||',\"appId\":\"'||es.c_app_id||'\",\"name\":\"'||ec.c_textces_Name||'\",\"refId\":\"'||es.c_reference_id||'\",\"referenceId\":\"'||es.c_reference_id||'\",\"size\":'||es.c_size||'}]';
          end loop;
         END;
      --遊標查詢該公文的附件,並封裝成cos2支持的格式
         num_attachment:=ec.attach_counts;--初始化附件需要循環的次數

       DECLARE
              cv_num number:=0;
              sv_num number:=num_attachment;--執行次數
              var_str clob:=ec.c_attachtment;--附件json
              file_size clob;
              file_refId clob;       
              file_name clob;
              BEGIN
                while cv_num<sv_num loop
                  file_refId:=substr(var_str,instr(var_str,'"refId":"')+9,(instr(var_str,'"oldRefId":')-2)-(instr(var_str,'"refId":"')+9));
                  file_name:=substr(var_str,instr(var_str,'"name":"')+8,(instr(var_str,'"size":')-2)-(instr(var_str,'"name":"')+8));
                  file_size:=substr(var_str,instr(var_str,'"size":')+7,(instr(var_str,'"refId":')-1)-(instr(var_str,'"size":')+7));
                   var_attachment:=var_attachment || ',' ||file_refId;
                   var_str:=substr(var_str,1,instr(var_str,'"name":"')) || substr(var_str,instr(var_str,'"codeName":')+15);--重新賦值,以便獲取後面的refId
                   var_attachment_json:=var_attachment_json||','||'{\"id\":\"ntkoFrame-C_ATTACHMENT-'||cv_num||'\",\"index\":'||cv_num||',\"appId\":\"'||'cos-wuyf'||'\",\"name\":\"'||file_name||'\",\"refId\":\"'||file_refId||'\",\"referenceId\":\"'||file_refId||'\",\"size\":'||file_size||'}';
                   cv_num:=cv_num+1;
                  end loop;
                END;       
       var_attachment_json:=substr(var_attachment_json,2) ;
      --封裝公文信息
      var_json:= '{"C_ID":'||ec.id ||',"FLOW_INS_ID":"' || ec.FLOW_INS_ID || '","URGENT_LEVEL":"'||ec.URGENT_LEVEL || '","SECRET_LEVEL":"'|| ec.SECRET_LEVEL||'",'
      || '"C_CREATEBY":"root","C_DELETED":"0","C_UPDATEBY":null,"C_UPDATETIME":null,"C_UUID":null,"ARCHIVE_TIME": null,"ARCHIVER": null,"BIZ_BACK_DATE": null,'
      || '"C_CONTENT":null,"CREATOR":"'||ec.creator ||'","C_DO_STATUS":"系統遷移歸檔!",'||'"DOC_CODE":"' || ec.odoc_code || '","DOC_HEAD":"'||ec.DOC_HEAD || '","DOC_HEAD_TYPE":null,'
      || '"DOC_REC_NO":"'||ec.DOC_REC_NO ||'","DOC_SEND_NO":"' || ec.DOC_SEND_NO || '","C_DOCTIME": null,"DOC_TYPE":"'||ec.DOC_TYPE || '","FINISH":"'|| ec.FINISH||'",'
      || '"C_STATUS": "2","INNER_PUB": null,"MAIN_DEPT":"'||ec.MAIN_DEPT ||'","MAIN_DEPT_ID": null,"OLD_DOC_ID":' || ec.id || ',  "OLD_FLOW_INS_ID":"'||ec.FLOW_INS_ID || '",'     
      || '"OPERATE_TIME":null,"OUTER_PUB":null,"C_PRINTTIME":null,"C_PRINTUNIT":null,"REC_CUR_NO":null,"REC_YEAR":null,"REMARK":"'||ec.REMARK||'","REMINDER": "'||ec.REMINDER||'", "REMINDER_ID": null,"REMOTE_SEND": null,"REV_SYMBOL_ID": null,"SEND_CUR_NO": null,"SEND_SYMBOL_ID": null,"SEND_YEAR": null,"SHOWFLAG": null,"TELEPHONE_NUM": null,"C_VERSION_ID": null,"C_ENGINE_VERSION": "V3","C_PROC_CODE": null,"C_PROC_VER_ID": "","C_INST_ID": null,"SPEC_FILE": "",'
      || '"TITLE":"'||ec.TITLE ||'","DOC_FROM_NO":"' || ec.DOC_FROM_NO || '","C_CREATOR_ID": "1","DOC_FROM_ORG":"'|| ec.DOC_FROM_ORG||'","ACCOUNT_ID": null,"DO_ADVICE": null,"KEEP_DAYS": null,"DO_STATUS": null,"PASS_READER": null,"FUNDS_FILE": null,"BIZ_TYPE": null,"C_BUSSINESSTYPE": null,'
      || '"DOC_REC_TIME":'||NVL(TO_CHAR((to_date(to_char(ec.DOC_REC_TIME,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd HH24:mi:ss')-to_date('1970-01-01 08:00:00','yyyy-mm-dd hh24:mi:ss'))*86400000), '""') ||',"ORG_BACK_DATE":'||NVL(TO_CHAR((to_date(to_char(ec.ORG_BACK_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd HH24:mi:ss')-to_date('1970-01-01 08:00:00','yyyy-mm-dd hh24:mi:ss'))*86400000), '""')|| ',"TYPE": null,"HQ_ADVICE": null,"FAIR": null,"C_PAPER_RECID": null,"C_REVISION_RECID": null,"C_ENCODE_FILE": null,"APPLY_FOR_REPORT": null,"DEAD_TIME": null,"OVERDUE_STANDARD": null,"PUBLISH": "",'
      || '"C_DOCBODY": "'||ec.c_textces||'","C_DOCBODY_JSON":"'||var_docbody||'","C_ATTACHMENT":"'||substr(var_attachment,2)||'","C_ATTACHMENT_JSON":"['||var_attachment_json||']"}' ;
 
      --查詢流轉側邊意見內容
      DECLARE
        CURSOR  emp_cur  is select dbms_lob.substr(cf.do_advice) as C_ADVICE, (to_date(to_char(cf.c_Operate_Time,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd HH24:mi:ss')-to_date('1970-01-01 08:00:00','yyyy-mm-dd hh24:mi:ss'))*86400000 as C_SUBMITOR_TIME, cf.c_operator_name as C_SUBMITOR,cf.c_operator_own_dept as C_SUBMITOR_DEPT from COS_ODOC_FLOW_ADVICE cf where cf.c_deleted = 0 and cf.c_advice_type = 0 and cf.c_do_flag = 1 and cf.do_advice is not null and cf.c_docid in (ec.id);
        var_str_advice clob;
        BEGIN
          for es  IN emp_cur loop
            var_str_advice:=var_str_advice || ',{"C_ADVICE":"'|| es.C_ADVICE ||'","C_SUBMITOR_TIME":'|| es.C_SUBMITOR_TIME||',"C_SUBMITOR":"'|| es.C_SUBMITOR ||'","C_SUBMITOR_DEPT":"'|| es.C_SUBMITOR_DEPT ||'","C_OPINIONFILE_JSON":null}';
              var_advice_json:=var_str_advice;      
                end loop;
          END;
     --查詢流轉日誌

dbms_lob.createtemporary(var_flow_log,true);

      DECLARE
        CURSOR  emp_cur  is select f.c_id,f.FLOW_INS_ID,to_char(REPLACE(f.do_status, f.OPERATOR_NAME||'【'||f.OPERATOR_OWN_DEPT||'】', '')) ||''as content,f.OPERATOR,f.OPERATOR_NAME,f.OPERATOR_OWN_DEPT,(to_date(to_char(f.operate_time,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd HH24:mi:ss')-to_date('1970-01-01 08:00:00','yyyy-mm-dd hh24:mi:ss'))*86400000 as C_SUBMITOR_TIME FROM COS_ODOC_FLOW_LOG f WHERE f.FLOW_INS_ID=ec.FLOW_INS_ID ORDER BY f.OPERATE_TIME asc;
        var_str_log clob;
        BEGIN
          for es  IN emp_cur loop
           -- if es.content!='完成瀏覽' then
            var_str_log:=var_str_log |||| |||| |||| |||| ||'","submitorDept":"'||es.OPERATOR_OWN_DEPT||'","submitTime":'|| es.C_SUBMITOR_TIME|||| ||;
            var_flow_log:=var_str_log;

DBMS_LOB.Append(var_flow_log, ',{"id":"');

DBMS_LOB.Append(var_flow_log, es.C_ID);

DBMS_LOB.Append(var_flow_log,'","instId":');

DBMS_LOB.Append(var_flow_log,es.FLOW_INS_ID);

DBMS_LOB.Append(var_flow_log,',"submitorId":"');

DBMS_LOB.Append(var_flow_log, es.OPERATOR);

DBMS_LOB.Append(var_flow_log,'","submitor":"');

DBMS_LOB.Append(var_flow_log, es.OPERATOR_NAME);

DBMS_LOB.Append(var_flow_log,',"content":"');

DBMS_LOB.Append(var_flow_log, es.content);

DBMS_LOB.Append(var_flow_log, '","mobileLog":false}');

            end loop;
          END;
      insert into dev_wz.COS_ODOC_ARCHIVES_DETAILS(C_ID,c_temp_version,c_createby,c_createtime,c_deleted,c_updateby,c_updatetime,c_uuid,c_docdetails,c_flowlog,c_flowadvice,c_doc_id)
      SELECT ec.id,ec.odoc_code||'-v2-1','gsoft-2018',sysdate,'0','gsoft-2018',sysdate,'',var_json ,'['||substr(var_flow_log,2)||']','['||substr(var_advice_json,2)||']',ec.id FROM DUAL
      WHERE NOT EXISTS(SELECT tf.C_ID FROM dev_wz.COS_ODOC_ARCHIVES_DETAILS tf  WHERE tf.c_id=ec.id);
      update wzococ.COS_ODOC_ARCHIVES_INFO s set s.c_uuid = 1000 where s.source = ec.id;
    end loop;
END;

 

以上爲本次分享的內容,其中clob存儲字符串的append方法爲參考了

https://blog.csdn.net/dianmie4090/article/details/101903097

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章