파일에서 PostgreSQL 데이터베이스로 XML을 읽는 SQL


12

PostgreSQL XML값 으로 XML 파일을 읽기 위해 SQL을 작성하려면 어떻게 해야합니까?

PostgreSQL에는 텍스트 문자열을 해당 유형으로 구문 분석하는 기능 이있는 기본 XML 데이터 유형XMLPARSE있습니다. 파일 시스템에서 데이터를 읽는 방법도 있습니다. 그 COPY중에서도 성명서.

그러나 파일 시스템 항목에서 내용을 읽고 XML값 을 채우는 데 사용하는 기본 PostgreSQL SQL 문을 작성하는 방법은 없습니다 . 어떻게해야합니까?

답변:


10

이전 질문에 대한 답변과 비슷 하며 제한을pg_read_file() 원하지 않는 경우 (짧게 : pg_read_file데이터베이스 디렉토리 외부의 파일을 읽을 수 없으며 현재 세션의 문자 인코딩으로 텍스트를 읽습니다).

이 기능은 모든 경로에서 작동하지만 수퍼 유저로 작성해야합니다.

create or replace function stack.bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
begin
  select lo_import(p_path) into l_oid;
  select lo_get(l_oid) INTO p_result;
  perform lo_unlink(l_oid);
end;$$;

lo_get 9.4에 도입되었으므로 이전 버전의 경우 다음이 필요합니다.

create or replace function stack.bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
  r record;
begin
  p_result := '';
  select lo_import(p_path) into l_oid;
  for r in ( select data 
             from pg_largeobject 
             where loid = l_oid 
             order by pageno ) loop
    p_result = p_result || r.data;
  end loop;
  perform lo_unlink(l_oid);
end;$$;

그때:

select convert_from(stack.bytea_import('/tmp/test.xml'), 'utf8')::xml;

1
+1, 파일 읽기 기능에 한계가 있음을 지적 해 주셔서 감사합니다.
bignose

1
우회하는 +1 좋은 트릭 pg_read_file(). 임시 테이블에서도 동일하게 달성 할 수 있으며 COPY1 행의 1 열만 채 웁니다.
Erwin Brandstetter

4

pg_read_binary_file기능은 이 작업을 수행 할 수 있습니다.

제한 사항이 있습니다 : PostgreSQL 9.1 이상에서 새로 추가; 데이터베이스 수퍼 유저가 소유 한 세션이어야합니다. 데이터베이스 디렉토리 내에서 또는 아래에서 파일을 읽어야합니다. 그것들은 나의 유스 케이스에서 허용됩니다.

따라서 다음은 XML파일에서 기본 값 을 만드는 데 효과적입니다 .

-- PostgreSQL 9.1 or later.
SELECT
    XMLPARSE(DOCUMENT convert_from(
        pg_read_binary_file('foo.xml'), 'UTF8'));

PostgreSQL 8.3 – 9.0에서는 pg_read_file파일 별 인코딩을 지정할 수 없다는 추가 제한이 있는 기능을 사용할 수 있습니다 (현재 세션의 인코딩에서 파일을 텍스트로 읽습니다).

-- PostgreSQL earlier than 9.1.
SELECT
    XMLPARSE(DOCUMENT pg_read_file('foo.xml'));

3

나는 당신이 SO 에 대한 최근 답변 에서 요구하는 것을 완벽하게 구현했습니다 .

주요 기능은 xpath()함수 pg_read_file(), 배열 처리, plpgsql 함수, ..


이 경우에 필요한 것과 다른 (그리고 더 무거운) 것입니다. 그러나 좋은 방향으로 +1하십시오. 감사합니다.
bignose

그것은 아니다 나의 예를 단지 변형 구문을 보여주기 위해 중복 요소가 매우 완료, 헤비급.
Erwin Brandstetter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.