3

以下のような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)
     );

前もって感謝します。

4

2 に答える 2

2

XMLFOREST私自身、 likeを使用してこれに対する答えを見つけました。

XMLELEMENT("ROW",
         XMLFOREST( rec.pid as "pid"
                  , rec.lon as "lon"
                  , rec.lat as "lat" 
                  , rec.dt as "dt" ) 
       ).getClobVal()

ここで を使用しました。これは、データ型を含む列getClobVal()に を挿入することです。XMLCLOB

注: 1 つの問題XMLFORESTは、値が null の場合、そのXMLタグが生成されないことです。ここでは、値が null の場合、タグを生成する必要はありません。

于 2013-12-19T05:10:20.373 に答える