복붙노트

[SQL] 오라클은 : 큰 XML 파일을로드?

SQL

오라클은 : 큰 XML 파일을로드?

그래서 지금은 내가 관심이있는 XML 데이터의 큰 비트를 가지고 :

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

나는 놀 오라클이 점을로드하고 싶습니다.

어떻게 직접 오라클에 직접 큰 XML 파일을로드 할 수 있습니까? (데이터 파일이 서버에서 열 수) 서버 측 솔루션과 클라이언트 측 솔루션을 환영했다.

다음은 구체적인 예를 들어 badges.xml의 비트입니다.

<?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"/>
  ...

해결법

  1. ==============================

    1.당신은 SQL을 통해 서버에 XML 파일에 액세스 할 수 있습니다. /tmp/tmp.xml에서 데이터, 당신은 디렉토리를 먼저 선언합니다 :

    당신은 SQL을 통해 서버에 XML 파일에 액세스 할 수 있습니다. /tmp/tmp.xml에서 데이터, 당신은 디렉토리를 먼저 선언합니다 :

    SQL> create directory d as '/tmp';
    
    Directory created
    

    그런 다음 직접 XML 파일을 조회 할 수있다 :

    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>
      [...]
    

    파일의 필드에 액세스하려면, 당신은 예를 들어 다른 SO에 기술 된 방법을 사용할 수 있습니다 :

    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    
    
  2. ==============================

    2.첫째, 오라클은 그것을 볼 수있는 위치에 XML 문서를 받고 - 당신은이 문제에 대해 얘기하는 것 같다. 그리고 어쩌면 표준 관계형 도구는 데이터에 적용 할 수 있도록 그것을 만들기.

    첫째, 오라클은 그것을 볼 수있는 위치에 XML 문서를 받고 - 당신은이 문제에 대해 얘기하는 것 같다. 그리고 어쩌면 표준 관계형 도구는 데이터에 적용 할 수 있도록 그것을 만들기.

    첫 번째의 경우, 또는 DBA는 BLOB, CLOB, 또는 BFILE 열이있는 테이블을 생성하고 데이터를로드 할 수 있습니다. 데이터베이스가 살고있는 서버에 액세스 할 수있는 경우, 데이터베이스의 디렉토리 오브젝트를 정의 할 수있는 운영 시스템 디렉토리를 가리키는. 그런 다음이 파일을 넣어. 그리고 그 중 하나 BFILE로 설정하거나 그것을 읽고 (CLOB 및 BLOB 저장소를 데이터베이스에서, BFILE 매장 운영 시스템 측의 파일에 대한 지적을)..

    또한, 직접 데이터베이스에 CLOB에 쓰기 수 있도록 몇 가지 도구를 사용합니다. 어쨌든, 그 데이터베이스에 XML 인스턴스 문서를 볼 수있는 지점을 가져옵니다.

    그래서 지금 당신은 인스턴스 문서를 볼 수 있습니다. 1 단계가 수행된다.

    버전에 따라, 오라클은 관계형 테이블로 XML을 분쇄하기위한 꽤 좋은 도구가 있습니다.

    그것은 꽤 선언 할 수 있습니다. 이것이 내가 실제로했던 것 이상으로 얻을 수 있지만, 당신은 이론적으로 데이터베이스로 XML 스키마를로드하고 관계형 테이블과 XML 사이의 횡단 보도로 주석을 달 수 있습니다 (나는 그것을이 가을을 시도 할 것이다 프로젝트가). 그런 다음 CLOB 또는 BFILE을 가지고 정의 된 스키마와 함께 XMLTYPE 열로 변환하면됩니다 - 파쇄는 모든 관계의 데이터가 모두가 자동으로 발생, 그것은 XQUERY 또는 XML없이 모든 표준 SQL을 사용할 수 확장.

    오히려 XQuery를 사용하려는 경우 물론, 다음 단지의 CLOB 또는 BFILE으로 데리고 XMLTYPE로 변환하고, 그것을 위해 이동합니다.

  3. ==============================

    3.나는 간단한을 할 것입니다 :

    나는 간단한을 할 것입니다 :

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

    또는 당신은 SAX 파서를 사용하는 자바 프로그램을 만들 수 있습니다. 핸들러는 새로운 요소 '행'을 발견 할 때마다 속성을 얻고 데이터베이스에 새 레코드를 삽입합니다.

  4. from https://stackoverflow.com/questions/998055/oracle-loading-a-large-xml-file by cc-by-sa and MIT license