xml - 处理 XML 时的异常处理

标签 xml oracle exception-handling plsql

我有如下的 XML 格式。

<ROWSET>
  <ROW NUM="1">
    <pid>1</pid>
    <lon>25.3032016</lon>
    <lat>54.7146368</lat>
    <dt>20/10/2013 08:45:42 PM</dt>
  </ROW>
  <ROW NUM="2">
    <pid>1</pid>
    <lon>25.3032016</lon>
    <lat>54.7146368</lat>
    <dt>20/10/2013 08:45:47 PM</dt>
  </ROW>
  <ROW NUM="3">
    <pid>1</pid>
    <lon>25.3032016</lon>
    <lat>54.7146368</lat>
    <dt>20/10/2013 08:45:52 PM</dt>
  </ROW>
<ROW NUM="4">
    <pid>1</pid>
    <lon>25.3032016</lon>
    <lat>54.7146368</lat>
    <dt>20/10/2013 08:45:57 PM</dt>
  </ROW>
  <ROW NUM="5">
    <pid>1</pid>
    <lon>2512.3032016</lon> --Error part (as the longitude fields only stores NUMBER (13,10))
    <lat>54.7146368</lat>
    <dt>20/10/2013 08:45:57 PM</dt>
  </ROW>  
</ROWSET>

到目前为止,我有以下过程将 XML 加载到表中,

PROCEDURE load_xml(i_xml CLOB) 
AS
     l_sqlerrm VARCHAR2(200);

  BEGIN

       INSERT INTO xml_stage (pid, longitude, latitude, date_time)
            (SELECT  EXTRACTVALUE(VALUE(row_list), '//pid') AS pid
                    ,EXTRACTVALUE(VALUE(row_list), '//lon') AS lon
                    ,EXTRACTVALUE(VALUE(row_list), '//lat') AS lat
                    ,EXTRACTVALUE(VALUE(row_list), '//dt') AS dt
             FROM TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(i_xml), '/ROWSET/ROW'))) row_list
            );
       COMMIT;     
  EXCEPTION WHEN OTHERS THEN

      FOR rec IN
      (SELECT  EXTRACTVALUE(VALUE(row_list), '//pid') AS pid
              ,EXTRACTVALUE(VALUE(row_list), '//lon') AS lon
              ,EXTRACTVALUE(VALUE(row_list), '//lat') AS lat
              ,EXTRACTVALUE(VALUE(row_list), '//dt') AS dt
       FROM TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(i_xml), '/ROWSET/ROW'))) row_list
      )
      LOOP
           BEGIN
                INSERT INTO xml_stage (pid, longitude, latitude, date_time)
                     VALUES (rec.pid, rec.lon, rec.lat, rec.dt);

           EXCEPTION WHEN dup_val_on_index THEN
                NULL;               
           WHEN others THEN
                l_sqlerrm := substr(SQLERRM,1,200);
                INSERT INTO errored_xml (error_id, date_time, error_desc, xmltext)
                     VALUES (load_stage_error_seq.nextval, SYSDATE, l_sqlerrm , i_xml);
                COMMIT;                   
           END;          
      END loop;

  END load_xml;

我的问题是,如果出现任何异常,目前我正在将完整的 xml (i_xml) 记录到表 errored_xml 中。有什么方法可以记录引发错误的特定 XML 行属性吗?

我的表结构如下,

CREATE TABLE xml_stage(
     pid NUMBER(10),
     longitude NUMBER (13,10) , 
     latitude NUMBER (13,10) , 
     date_time VARCHAR2(30),
     CONSTRAINT xml_stage_pk PRIMARY KEY (pid,date_time)
     );

CREATE TABLE errored_xml(
     error_id NUMBER(6),
     date_time DATE,
     error_desc VARCHAR2(200),
     xmltext CLOB,
     CONSTRAINT errored_xml_pk PRIMARY KEY (error_id)
     );

提前致谢。

最佳答案

你可以像这样插入errored_xml

INSERT INTO errored_xml
     (
          error_id,
          date_time,
          error_desc,
          XMLTEXT
     )
     VALUES
     (
          load_stage_error_seq.nextval,
          SYSDATE,
          l_sqlerrm ,
          XMLELEMENT ("ROW", XMLELEMENT("pid", rec.pid) , XMLELEMENT("lon", rec.lon), XMLELEMENT("lat", rec.lat), XMLELEMENT("dt", rec.dt))
     );

(您需要一个用于 varchar2 的更改表来存储此 xml)

关于xml - 处理 XML 时的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19534231/

相关文章:

java - Android 应用程序可在 AVD 上运行但不能在手机上运行?

sql - Oracle JDBC 忽略 CONCUR_UPDATABLE 结果集中的 SET CONSTRAINTS ALL DEFERRED

java - Oracle 驱动程序的内部结构

xml - 如何在 US7ASCII Oracle 数据库的 UTF8 xml 文件中写入非 ascii 字符

exception-handling - 在不中断的情况下显示有关第一次机会异常的详细信息

java - android中表单程序生成的布局到XML布局

android - 我可以在 string.xml 中的字符串资源中使用字符串资源吗?

jquery - 使用 JQuery/Javascript 从简单的 XML 中获取属性值

c++ - 编写死亡测试以验证 std::set_terminate 行为

java - 你如何处理 Java 中的 "impossible"异常?