11 Şubat 2011 Cuma

ORACLE – XML 2



XML verisini parse ederek  Oracle’da tabloya insert etme

Önceki yazımda  Oracle ‘da tablodan veriyi XML formunda çekmeyi anlatmıştım; bu yazımda ise aynı işlemin tersini yani XML formunda gelen bir stringin içinden veriyi parse ederek tabloya atma işlemini göstereceğim .
Daha anlaşılır olması açısından önceki tablomuzu kullanalım :
CREATE TABLE DBT
(
  NUM     NUMBER,
  ADI     VARCHAR2(14),
  SOYADI  VARCHAR2(22),
  TAR     DATE
);
Table created.
Şöyle bir xml imiz olsun :
<xml_formu>
       <NUM>1</NUM>
       <ADI>Ercan</ADI>
       <SOYADI>Yazgan</SOYADI>
       <TAR>2010-12-21</TAR>
</xml_formu>
Bu XML deki dataları tablomuza insert etmek için iki çeşit yol göstereceğim.
1) XML den her satırı ayrı ayrı parse edip insert yapmak.
DECLARE
 V_XML CLOB(500) := '<xml_formu>
                                                <NUM>1</NUM>
                                                <ADI>Ercan</ADI>
                                                 <SOYADI>Yazgan</SOYADI>
                                                 <TAR>2010-12-21</TAR>
                                        </xml_formu>';
BEGIN
    INSERT INTO DBT(NUM, ADI, SOYADI, TAR) VALUES(
                     XMLTYPE(V_XML).EXTRACT('/xml_formu/NUM/text()').GETNUMBERVAL(),
                     XMLTYPE(V_XML).EXTRACT('/xml_formu/ADI/text()').GETSTRINGVAL(),
                     XMLTYPE(V_XML).EXTRACT('/xml_formu/SOYADI/text()').GETSTRINGVAL(),
                     TO_DATE(XMLTYPE(V_XML).EXTRACT('/xml_formu/TAR/text()').GETSTRINGVAL())
                     );
                     COMMIT;
END;
PL/SQL procedure successfully completed.

Bu PL/SQL bloğunda , XML yapısının içindeki her datayı satır satır insert etme işlemi yapılıyor. Bu işlemi bir de şu şekilde yapabiliriz :
2) XML bloğunundaki datayı cursor’a taşıyarak cursor’dan okumak

DECLARE
 V_XML CLOB := '<xml_formu>
                             <NUM>1</NUM>
                             <ADI>Ercan</ADI>
                             <SOYADI>Yazgan</SOYADI>
                             <TAR>2010-12-21</TAR>
                              </xml_formu>';
CURSOR C1 IS
select extractvalue(column_value,'/xml_formu/NUM')         Numarasi,
         extractvalue(column_value,'/xml_formu/ADI')           Adi,
         extractvalue(column_value,'/xml_formu/SOYADI')     Soyadi,
         extractvalue(column_value,'/xml_formu/TAR')          Tarih
from table (xmlsequence(xmltype(V_XML).extract('/xml_formu')));
BEGIN
    FOR RW IN C1
    LOOP
        INSERT INTO DBT(NUM, ADI, SOYADI, TAR) VALUES(
        RW.NUMARASI,
        RW.ADI,
        RW.SOYADI,
        to_date(RW.TARIH)
        );
        COMMIT;
    END LOOP;
END;
PL/SQL procedure successfully completed.

Bu yol, çoklu veri alırken daha faydalı bir yoldur. Çünkü milyon satırlık bir xml kaydı geldiğinde o XML in içerisindeki milyon tane datayı ancak cursor vasıtasıyla loop kullanarak parse edersiniz, o yüzden  bu iki yolu da göstereyim dedim. “hah işte bunu arıyordum” demeniz dileğiyle J


Hiç yorum yok:

Yorum Gönder