Oracle存储过程,把数据导出至XML文件

CREATE OR REPLACE PROCEDURE SP_0813_EXPORTTOXML(
    in_chkdate      in VARCHAR2,
    in_hospital     in VARCHAR2,
    in_busilogid    in VARCHAR2,
    isSucc          out VARCHAR2)
AS
    v_file_handle   utl_file.file_type;
    file_name       VARCHAR2(50);
    v_errCode       VARCHAR2(200);
    v_errDesc       VARCHAR2(200);
    v_start_time    date;
    
    personRow       CL_HEALTH_LIST%ROWTYPE;      --获取游标的行变量
    n_zrs           number(4);
    v_cplsh         char(6);
    n_count1        number;
    n_count2        number;
    v_wjm           VARCHAR2(50);
    v_cplsh_out     char(6);
    
    doc xmlDom.DOMDocument := xmldom.newDOMDocument;        -- 创建文档对象
    main_node xmlDom.DOMNode := xmldom.makeNode(doc);       -- 获得文档节点
    
    --==================================================
    --以下定义元素
    root_g_elmt     xmlDom.DOMElement;                  -- 创建批信息根元素
    cplsh_elmt      xmlDom.DOMElement;                  -- 出盘流水号元素
    date_elmt       xmlDom.DOMElement;                  -- 体检日期元素
    hospital_elmt   xmlDom.DOMElement;                  -- 体检医院元素
    zrs_elmt        xmlDom.DOMElement;                  -- 总人数元素
    
    root_p_elmt     xmlDom.DOMElement;                  -- 创建人员信息根元素    
    person_elmt     xmlDom.DOMElement;                  -- 定义PERSON元素
    name_elmt       xmlDom.DOMElement;                  -- 姓名元素
    zjhm_elmt       xmlDom.DOMElement;                  -- 身份证号元素
    xb_elmt         xmlDom.DOMElement;                  -- 性别元素    
    age_elmt        xmlDom.DOMElement;                  -- 年龄元素    
    --==================================================
    --以下定义节点
    root_g_node     xmlDom.DOMNode;   --批信息根节点
    cplsh_node      xmlDom.DOMNode;   --出盘流水号元素
    date_node       xmlDom.DOMNode;   --体检日期节点
    hospital_node   xmlDom.DOMNode;   --体检医院节点
    zrs_node        xmlDom.DOMNode;   --总人数节点
    
    root_p_node     xmlDom.DOMNode;   --人员信息根节点
    person_node     xmlDom.DOMNode;   --定义PERSON节点
    name_node       xmlDom.DOMNode;   --姓名节点
    zjhm_node       xmlDom.DOMNode;   --身份证号节点
    xb_node         xmlDom.DOMNode;   --性别节点
    age_node        xmlDom.DOMNode;   --年龄节点
    temp_node       xmlDom.DOMNode;
    
    cursor person_cur
    is
    Select a.*
    From    CL_HEALTH_LIST a , CL_HEALTH_ACTION b
    Where   a.Action_No = b.Action_No
    And     b.Action_Date = in_chkdate
    And     b.Hospital_Id = in_hospital
    And     b.Status = 'L'
    ;
BEGIN
    isSucc :=0 ;
    v_start_time := sysdate;  
     
    Select Lpad(Seq_0813_Cplsh.nextval,6,'0')
    Into    v_cplsh
    From    DUAL;
    
    --文件名
    file_name := 'L'||To_Char(sysdate,'yyyyMMdd')||in_hospital||v_cplsh||'.xml';
    
    -- 1.向文档节点加入批信息根节点:<GROUP></GROUP>
    root_g_elmt := xmldom.createElement(doc, 'GROUP');
    root_g_node := xmldom.appendChild(main_node, xmldom.makeNode(root_g_elmt));
    
    cplsh_elmt   := xmldom.createElement(doc, 'CPLSH'); 
    cplsh_node   := xmldom.appendChild(root_g_node, xmldom.makeNode(cplsh_elmt));
    temp_node    := xmldom.appendChild(cplsh_node , xmlDom.makeNode(xmldom.createTextNode(doc,v_cplsh)));
    
    date_elmt   := xmldom.createElement(doc, 'DATE'); 
    date_node   := xmldom.appendChild(root_g_node, xmldom.makeNode(date_elmt));
    temp_node   := xmldom.appendChild(date_node , xmlDom.makeNode(xmldom.createTextNode(doc,in_chkdate)));
    
    hospital_elmt   := xmldom.createElement(doc, 'HOSPITAL'); 
    hospital_node   := xmldom.appendChild(root_g_node, xmldom.makeNode(hospital_elmt));
    temp_node       := xmldom.appendChild(hospital_node , xmlDom.makeNode(xmldom.createTextNode(doc,in_hospital)));
    
    zrs_elmt    := xmldom.createElement(doc, 'ZRS'); 
    zrs_node    := xmldom.appendChild(root_g_node, xmldom.makeNode(zrs_elmt));
    temp_node   := xmldom.appendChild(zrs_node , xmlDom.makeNode(xmldom.createTextNode(doc,to_char(n_zrs))));
    
    
    -- 2.向文档节点加入人员信息根节点:<PEOPLE></PEOPLE>
    root_p_elmt := xmldom.createElement(doc, 'PEOPLE');
    root_p_node := xmldom.appendChild(main_node, xmldom.makeNode(root_p_elmt));
    
    For personRow In person_cur Loop
      
      person_elmt := xmldom.createElement(doc, 'PERSON'); --创建PERSON元素
      -- 向PEOPLE节点加入PERSON节点<PERSON></PERSON>
      person_node := xmldom.appendChild(root_p_node, xmldom.makeNode(person_elmt));
      --===========================================================================--
      --向PERSON节点加入属性ID
      xmlDom.SETATTRIBUTE( person_elmt, 'ID', personRow.chk_no );
      --===========================================================================--
      name_elmt := xmldom.createElement(doc, 'NAME');      --创建NAME元素
      --向PERSON节点加入子节点NAME
      name_node := xmldom.appendChild(person_node,xmlDom.makeNode(name_elmt));
      --向NAME节点加入文本
      temp_node := xmldom.appendChild(name_node , xmlDom.makeNode(xmldom.createTextNode(doc,personRow.xm)));
      --===========================================================================--
      zjhm_elmt := xmldom.createElement(doc, 'ZJHM');      --创建ZJHM元素
      --向PERSON节点加入子节点ZJHM
      zjhm_node := xmldom.appendChild(person_node,xmlDom.makeNode(zjhm_elmt));
      --向ZJHM节点加入文本
      temp_node := xmldom.appendChild(zjhm_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.zjhm)));
      --===========================================================================--
      xb_elmt := xmldom.createElement(doc, 'XB');      --创建XB元素    
      --向PERSON节点加入子节点XB
      xb_node := xmldom.appendChild(person_node,xmlDom.makeNode(xb_elmt));
      --向XB节点加入文本
      temp_node := xmldom.appendChild(xb_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.xb)));
      --===========================================================================--
      age_elmt := xmldom.createElement(doc, 'AGE');      --创建AGE元素    
      --向PERSON节点加入子节点AGE
      age_node := xmldom.appendChild(person_node,xmlDom.makeNode(age_elmt));
      --向EMAIL节点加入文本
      temp_node := xmldom.appendChild(age_node, xmlDom.makeNode(xmldom.createTextNode(doc,personRow.age)));
      --===========================================================================--
    END LOOP;
    
    --写入硬盘
    xmlDom.writeToFile(doc,'C:/datafile/'||file_name,'GBK');
    --将datafile文件转移到health下面
    utl_file.frename('C:/datafile',file_name,'C:/datafile/health',file_name,false);

    isSucc:=1;            
EXCEPTION
   WHEN OTHERS THEN
        v_errCode:=substr(SQLCODE,0,200);
        v_errDesc:=substr(SQLERRM,0,200);
        isSucc:=0;
END SP_0813_EXPORTTOXML;
/

xmlDom.writeToFile(doc,'C:/datafile/'||file_name,'GBK');

报错参见hi.baidu.com/geniusian/blog/item/953d24c60090561c9c163d3d.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MyBatis的XML文件中,可以使用`<select>`,`<insert>`,`<update>`和`<delete>`标签来执行SQL语句,但是如果需要执行存储过程,则需要使用`<select>`标签,并在其中使用`callable`属性来指定存储过程的名称。 以下是一个示例: ``` <select id="callProcedure" statementType="CALLABLE" parameterType="java.util.Map"> {call my_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=OUT, jdbcType=VARCHAR})} </select> ``` 其中,`id`属性用于指定SQL语句的唯一标识符,`statementType`属性用于指定SQL语句的类型,`parameterType`属性用于指定参数类型。 在存储过程中,使用`{call}`语法来调用存储过程,并使用`#{}`语法来指定参数。例如,`#{param1, mode=IN, jdbcType=VARCHAR}`表示一个输入参数,`#{param2, mode=OUT, jdbcType=VARCHAR}`表示一个输出参数。 注意,需要使用`mode=IN`和`mode=OUT`来指定参数的输入输出类型。 在Java代码中调用该SQL语句时,可以使用以下代码: ``` Map<String, String> paramMap = new HashMap<>(); paramMap.put("param1", "input value"); paramMap.put("param2", null); mapper.callProcedure(paramMap); String outputValue = paramMap.get("param2"); ``` 其中,`paramMap`用于存储输入输出参数,`mapper`是MyBatis的映射器接口,`callProcedure`是映射器接口中定义的方法,调用该方法可以执行SQL语句,`outputValue`用于存储输出参数的值。注意,输出参数必须以`null`值初始化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值