Rastgele Yazılar : ASM Yapısına DatabaseTaşıma
Rastgele Yazılar : Olap Küpü Nedir
Rastgele Yazılar : BIG DATA
Rastgele Yazılar : Oracle Datafile Name ve Path Değiştirme(NOARCHIVELOG ...
Rastgele Yazılar : Datawarehouse Sistemlerinde Test Aşamaları
Rastgele Yazılar : Automatic Workload Repository
Rastgele Yazılar : Maximum Datafile Size Nasıl Hesaplanır
Rastgele Yazılar : Oracle upgrade (from 10gR1 - 10gR2 to 11gR2)
Rastgele Yazılar : SQL Performans İyileştirme
Rastgele Yazılar : Data Warehouse Sistemlerinde Şema Yapıları
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 :
1
Ercan
Yazgan
2010-12-21
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) := '
';
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
V_XML CLOB := '
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')));
FOR RW IN C1
LOOP
RW.NUMARASI,
RW.ADI,
RW.SOYADI,
to_date(RW.TARIH)
END LOOP;
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