2009-06-15 27 views
5

Vì vậy, bây giờ mà tôi có một chút lớn dữ liệu XML Tôi quan tâm đến:Oracle: đang tải một tệp xml lớn?

http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump

Tôi muốn tải này vào Oracle để chơi với.

Tôi có thể trực tiếp tải tệp XML lớn trực tiếp vào Oracle như thế nào? Các giải pháp phía máy chủ (nơi tệp dữ liệu có thể được mở trên máy chủ) và các giải pháp phía máy khách được hoan nghênh.

Đây là một chút của tệp badges.xml cho một ví dụ cụ thể.

<?xml version="1.0" encoding="UTF-8" ?> 
    <badges> 
    <row UserId="3718" Name="Teacher" Date="2008-09-15T08:55:03.923"/> 
    <row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/> 
    ... 

Trả lời

12

Bạn có thể truy cập tệp XML trên máy chủ qua SQL. Với dữ liệu của bạn trong /tmp/tmp.xml, trước tiên bạn sẽ khai báo thư mục:

SQL> create directory d as '/tmp'; 

Directory created 

Sau đó bạn có thể truy vấn XML file của bạn trực tiếp:

SQL> SELECT XMLTYPE(bfilename('D', 'tmp.xml'), nls_charset_id('UTF8')) xml_data 
    2 FROM dual; 

XML_DATA 
-------------------------------------------------------------------------------- 
<?xml version="1.0" encoding="UTF-8"?> 
<badges> 
    [...] 

Để truy cập vào các trường trong tập tin của bạn, bạn có thể sử dụng phương pháp mô tả trong another SO ví dụ:

SQL> SELECT UserId, Name, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt 
    2 FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'), 
          nls_charset_id('UTF8')) xml_data 
    3   FROM dual), 
    4   XMLTable('for $i in /badges/row 
    5        return $i' 
    6     passing xml_data 
    7     columns UserId NUMBER path '@UserId', 
    8       Name VARCHAR2(50) path '@Name', 
    9       dt VARCHAR2(25) path '@Date'); 

    USERID NAME  DT       
---------- ---------- --------------------------- 
     3718 Teacher 2008-09-15 08:55:03.923  
     994 Teacher 2008-09-15 08:55:03.957  
0

tôi sẽ làm một cách đơn giản:

grep '<row' file.xml |\ 
gawk -F '"' '{printf("insert into badges(userid,name,date) values (\"%s\",\"%s\",\"%s\");\n",$2,$4,$6); } > request.sql 

hoặc bạn có thể tạo ra một chương trình Java sử dụng một phân tích cú pháp SAX. Mỗi lần trình xử lý của bạn tìm thấy hàng 'Element' mới, bạn sẽ có được các thuộc tính và chèn một bản ghi mới vào cơ sở dữ liệu của bạn.

3

có vẻ như bạn đang nói về 2 vấn đề - đầu tiên, nhận được tài liệu XML để nơi Oracle có thể nhìn thấy nó. Và sau đó có thể làm cho nó để các công cụ quan hệ tiêu chuẩn có thể được áp dụng cho dữ liệu.

Đầu tiên, bạn hoặc DBA của bạn có thể tạo một bảng có cột BLOB, CLOB hoặc BFILE và tải dữ liệu. Nếu bạn có quyền truy cập vào máy chủ mà trên đó cơ sở dữ liệu tồn tại, bạn có thể định nghĩa đối tượng DIRECTORY trong cơ sở dữ liệu trỏ đến thư mục hệ điều hành. Sau đó đặt tập tin của bạn ở đó. Và sau đó hoặc thiết lập nó như là một BFILE hoặc đọc nó trong. (CLOB và BLOB lưu trữ trong cơ sở dữ liệu; BFILE lưu trữ một chỉ vào một tập tin ở phía hệ điều hành).

Hoặc, sử dụng một số công cụ cho phép bạn ghi trực tiếp CLOB vào cơ sở dữ liệu. Dù sao, điều đó sẽ đưa bạn đến điểm mà bạn có thể thấy tài liệu cá thể XML trong cơ sở dữ liệu.

Vì vậy, bây giờ bạn có tài liệu thể hiện được hiển thị. Bước 1 được thực hiện.

Tùy thuộc vào phiên bản, Oracle có một số công cụ khá tốt để băm nhỏ XML thành các bảng quan hệ.

Nó có thể khá dễ hiểu. Trong khi điều này vượt quá những gì tôi đã thực hiện (tôi có một dự án mà tôi sẽ thử nó vào mùa thu này), bạn có thể tải XML Schema của bạn về cơ sở dữ liệu và chú thích nó bằng lối chéo giữa các bảng quan hệ và XML. Sau đó, lấy CLOB hoặc BFILE của bạn và chuyển đổi nó thành một cột XMLTYPE với lược đồ đã xác định và bạn đã hoàn tất - việc băm nhỏ diễn ra tự động, dữ liệu là tất cả ở đó, tất cả đều quan hệ, tất cả đều có sẵn cho SQL tiêu chuẩn không có XQUERY hoặc XML tiện ích mở rộng.

Tất nhiên, nếu bạn muốn sử dụng XQUERY, thì chỉ cần lấy CLOB hoặc BFILE, chuyển đổi nó thành một XMLTYPE và đi cho nó.

+0

Thực tế đã có một bài viết blog hay của Marco Gralike ngày hôm nay về việc băm nhỏ trong cơ sở dữ liệu, http://www.liberidu.com/blog/?p=1094 –

Các vấn đề liên quan