ORACLE存储过程返回XML的处理.docx
- 文档编号:13073833
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:8
- 大小:16.65KB
ORACLE存储过程返回XML的处理.docx
《ORACLE存储过程返回XML的处理.docx》由会员分享,可在线阅读,更多相关《ORACLE存储过程返回XML的处理.docx(8页珍藏版)》请在冰点文库上搜索。
ORACLE存储过程返回XML的处理
目前公司的报表显示方式是:
oracle返回数据集--JAVA组XML--Delphi展现
由于JAVA组XML会耗费相当多的时间和性能,从而影响客户体验
考虑由oracle直接返回一个前台Delphi可解析的XML格式,从而减少JAVA组XML所带来的带宽和性能的耗费
显示样式:
0
VARCHAR2: 20: 0: 商品服务属性: 18: 1: 0C2: VARCHAR2: 20: 0: 销售服务属性: 18: 1: 0C3: VARCHAR2: 30: 0: 商品编号: 12: 1: 0C4: VARCHAR2: 30: 0: 商品名称: 30: 1: 0C5: VARCHAR2: 30: 0: 单位: 12: 1: 0dimensionality1: VARCHAR2: 40: 0: 维度1名称: 18: 0: 0dimensionality2: VARCHAR2: 10: 0: 维度2名称: 18: 0: 0dimensionality3: VARCHAR2: 10: 0: 维度3名称: 18: 0: 0dimensionality4: VARCHAR2: 10: 0: 维度4名称: 18: 0: 0dimensionality5: VARCHAR2: 10: 0: 维度5名称: 18: 0: 0C6: VARCHAR2: 20: 0: 规格型号: 18: 1: 0C7: VARCHAR2: 64: 0: 仓库: 18: 1: 0C8: NUMBER: 18: 2: 库存总量|数量: 12: 1: 0C9: NUMBER: 18: 2: 库存总量|金额: 12: 1: 0C21: NUMBER: 18: 2: 7天|数量: 12: 1: 0C22: NUMBER: 18: 2: 7天|金额: 12: 1: 0C23: NUMBER: 18: 2: 15天|数量: 12: 1: 0C24: NUMBER: 18: 2: 15天|金额: 12: 1: 0C10: NUMBER: 18: 2: 30天|数量: 12: 1: 0C11: NUMBER: 18: 2: 30天|金额: 12: 1: 0C12: NUMBER: 18: 2: 60天|数量: 12: 1: 0C13: NUMBER: 18: 2: 60天|金额: 12: 1: 0C14: NUMBER: 18: 2: 90天|数量: 12: 1: 0C15: NUMBER: 18: 2: 90天|金额: 12: 1: 0C16: NUMBER: 18: 2: 120天|数量: 12: 1: 0C17: NUMBER: 18: 2: 120天|金额: 12: 1: 0C18: NUMBER: 18: 2: 120天以上|数量: 12: 1: 0C19: NUMBER: 18: 2: 120天以上|金额: 12: 1: 0C20: VARCHAR2: 255: 0: 备注: 18: 1: 0"> 操作步骤: 1.设置UTL_FILE参数 SQL>showparameterUTL_FILE; NAME TYPE VALUE ----------------------------------------------------------------------------- utl_file_dir string 2.查看系统是以何种参数文件启动 SQL>showparameterspfile; NAME TYPE VALUE ----------------------------------------------------------------------------- spfile string E: \ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\SPFILEORCL.ORA 3.设置UTL_FILE值(注意如果气动方式是ORA altersystemsetutl_file_dir='d: \log'scope=spfile 4.重启服务查看是否设置成功 SQL>showparameterUTL_FILE NAME TYPE VALUE ----------------------------------------------------------------------------- utl_file_dir string d: \log 5.授权给其他用户 GRANT EXECUTE ON utl_file TO nick; 6.写存储过程 CREATEORREPLACEPROCEDUREOUTPUTPEOPLE1(sqlStr VARCHAR2, file_pathVARCHAR2, files varchar2)AS personRowTB_TMPXML%ROWTYPE;--获取游标的行变量 TYPEperson_curISREFCURSOR;--自定义REF游标 cur person_cur; tempSql varchar2(500): ='SELECT*FROMdept ';--初始的查询语句 doc xmlDom.DOMDocument: =xmldom.newDOMDocument;--创建文档对象 main_node xmlDom.DOMNode: =xmldom.makeNode(doc);--获得文档节点 root_elmt xmlDom.DOMElement: =xmldom.createElement(doc, 'Information');--创建根元素 i number;--动态获取当前第几列 V_COLUMN_NAMEvarchar2(100);--动态获取当前列名字 --================================================== --以下定义元素 code_elmt xmlDom.DOMElement;--CODE节点 descript_elmtxmlDom.DOMElement;--descript_elmt UNKNOWN_elmt xmlDom.DOMElement;--UNKNOWN_elmt resultst_elmtxmlDom.DOMElement; rs_elmt xmlDom.DOMElement; --================================================== --以下定义节点 root_node xmlDom.DOMNode;--根 code_node xmlDom.DOMNode;--定义CODE节点 descript_nodexmlDom.DOMNode;--定义CODE节点 UNKNOWN_node xmlDom.DOMNode;--UNKNOWN_node results_node xmlDom.DOMNode; rs_node xmlDom.DOMNode; BEGIN --附加查询条件 tempSql: = sqlStr; selectcount (1) intoi fromall_tablesd whered.TABLE_NAME='TB_TMPXML'; ifi>0then executeimmediate'droptableTB_TMPXML'; endif; --手动创建标识列 tempSql: ='selectrownumid,d.*from('||tempSql||')d'; --保存到临时表 executeimmediate'createtableTB_TMPXMLas '||tempSql; --动态创建索引 executeimmediate'createindexindex_TB_TMPXML_id onTB_TMPXML(id) '; --把Information作为根节点 root_node: =xmldom.appendChild(main_node,xmldom.makeNode(root_elmt)); --创建CODE code_elmt: =xmldom.createElement(doc,'CODE');--添加到把Information作为根节点节点下 code_node: =xmldom.appendChild(root_node,xmldom.makeNode(code_elmt)); code_node: =xmldom.appendChild(code_node, xmlDom.makeNode(xmldom.createTextNode(doc, 0))); --===========================================================================-- -- descript_elmt: =xmldom.createElement(doc,'description');--添加到把Information作为根节点节点下 descript_node: =xmldom.appendChild(root_node, xmldom.makeNode(descript_elmt)); descript_node: =xmldom.appendChild(descript_node, xmlDom.makeNode(xmldom.createTextNode(doc, 0))); --results resultst_elmt: =xmldom.createElement(doc,'results'); results_node : =xmldom.appendChild(root_node, xmldom.makeNode(resultst_elmt)); results_node : =xmldom.appendChild(results_node, xmlDom.makeNode(xmldom.createTextNode(doc, 0))); rs_elmt: =xmldom.createElement(doc,'rs'); rs_node: =xmldom.appendChild(root_node,xmldom.makeNode(rs_elmt)); --加一个属性 --向PERSON节点加入属性PERSONID xmlDom.SETATTRIBUTE(rs_elmt,'PERSONID','recordset'); xmlDom.SETATTRIBUTE(rs_elmt,'tbname','UNKNOWN'); xmlDom.SETATTRIBUTE(rs_elmt,'fields',''||files||''); --打开游标 OPENcurFOR select*fromTB_TMPXML; --遍历游标 LOOP FETCHcur INTOpersonRow; EXITWHENcur%NOTFOUND; --添加UNKNOWN_node UNKNOWN_elmt: =xmldom.createElement(doc,'UNKNOWN'); UNKNOWN_node: =xmldom.appendChild(rs_node, xmldom.makeNode(UNKNOWN_elmt)); --xmlDom.SETATTRIBUTE(UNKNOWN_elmt,'PERSONID',personRow.D_ID); --循环添加属性 i: =2; forcurin(SELECTREGEXP_SUBSTR(files,'[^]+',1,l_count)ASnodename FROMdual, (SELECTLEVELl_count FROMDUAL CONNECTBYLEVEL<=100) WHEREl_count<= LENGTH(files)-LENGTH(REPLACE(files,''))+1)loop --获取当前行的列名 executeimmediate' selectCOLUMN_NAMEfromuser_tab_colsdwhered.TABLE_NAME=''TB_TMPXML''andd.COLUMN_ID='||i||'' intoV_COLUMN_NAME; tempSql: ='select'||V_COLUMN_NAME||'fromtb_tmpxmlwhereid='||personRow.id; executeimmediatetempSql into V_COLUMN_NAME; xmlDom.SETATTRIBUTE(UNKNOWN_elmt, (substr(cur.nodename, 0, instr(cur.nodename,': ')-1)), V_COLUMN_NAME); i: =i+1; endloop; ENDLOOP; CLOSEcur; --写入硬盘 --xmlDom.writeToFile(doc,file_path,'GBK'); xmlDom.writeToFile(doc,'d: \log'||'/'||'qudjdian.xml','GBK'); EXCEPTION WHENOTHERSTHEN DBMS_output.PUT_LINE(SQLERRM); ENDOUTPUTPEOPLE1; /
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLE 存储 过程 返回 XML 处理