oracle动态游标、动态sql、xml

-- Created on 2018/7/20 by XHL 
declare 
  -- Local variables here
  v_select varchar2(100);
  Type my_cursor is ref cursor;--声明动态游标类型
  v_cursor my_cursor;--定义动态游标变量
  病人id integer;
  总费用 number(9,2);
  totle integer:=0;
  v_xml_data clob;
  v_temp_xml xmltype;  
  out_xml xmltype;
begin
  -- Test statements here
  --使用动态游标执行动态sql语句
  v_select:='select 病人id,sum(总费用) as 总费用 from zl9i_scsm.保险支付记录  group by 病人id order by 病人id';
  v_temp_xml:=xmltype('<OUT><RESULT><RESULT/></OUT>');
  open v_cursor for v_select; --打开自定义REF游标
  loop
    fetch v_cursor into 病人id,总费用; --指定行并into变量或%rowtype类型变量
    exit when v_cursor%notfound or totle>=10;   --退出循环条件
    totle:=totle+1;--记录总数
    v_xml_data:='<病人id>'||病人id||'<总费用>'||总费用||'</总费用></病人id>';--拼接xml数据
    select appendchildxml(v_temp_xml,'/OUT/RESULT',xmltype(v_xml_data)) into v_temp_xml from dual;
   end loop; 
   close v_cursor;--fetch循环游标需要关闭游标         
   out_xml:=v_temp_xml;
   --输出查看结果
   dbms_output.put_line(v_xml_data);
   exception
     when others then
        v_xml_data:='<result><totle>0</totle><data>错误代码:'||sqlcode||',错误消息:'||sqlerrm||'。<data/></result>';
end;

 

posted @ 2018-07-20 16:27  Jonny-Xhl  阅读(172)  评论(0编辑  收藏  举报