문제

XML을 클로브 매개 변수로 반환하는 PL/SQL 절차를 만들고 싶습니다. 나는 이것을하고 싶습니다 (간단한 테스트로 잘 작동합니다) :

create or replace procedure p_xml_test_1(
  p_xml out nocopy clob
) is
begin
  p_xml := '<?xml version="1.0" encoding="utf8" ?>' ||
    '<test><something>some value</something></test>';
end p_xml_test_1;

그러나 기본적으로 다음을 수행하는 다른 소스 코드에 액세스 할 수 있습니다.

create or replace procedure p_xml_test_2(
  p_xml out nocopy clob
) is
  lv_xml clob;
begin
  dbms_lob.createtemporary(
    lob_loc => p_xml,
    cache   => true
  );

  lv_xml := '<?xml version="1.0" encoding="utf8" ?>' ||
    '<test><something>some value</something></test>';

  dbms_lob.writeappend(
    lob_loc => p_xml,
    amount  => length(lv_xml),
    buffer  => lv_xml
  );
end p_xml_test_2;

첫 번째 방법이 저에게 문제를 일으킬지 궁금합니다. 그렇게해도 괜찮습니까? 두 번째 방법에 대한 장점은 무엇입니까? 감사!

도움이 되었습니까?

해결책

루프에서 여러 번 실행하여 두 방법의 성능을 측정해야한다고 생각합니다. 성능이 유일한 차이라고 생각합니다. XML 블록은 짧지 만 큰 XML 블록을 연결하면 ||를 사용하는 것보다 DBMS_LOW.WriteAppend와 연결하는 것이 더 빠릅니다.

(적어도 그것은 Oracle 9에 있었고, Oracle 10에서는 성능 차이가 더 작다고 생각합니다.)

다른 팁

실행 시간을 비교하기 위해 다음 절차를 실행했습니다.

버전 1

create or replace procedure p_xml_test_1(
  p_xml out nocopy clob
) is
  lv_i number;
begin
  for lv_i in 1 .. 999999 loop
    p_xml := p_xml || 'a';
  end loop;
end p_xml_test_1;

버전 2

create or replace procedure p_xml_test_2(
  p_xml out nocopy clob
) is
  lv_xml clob;
  lv_i   number;
begin
  dbms_lob.createtemporary(
    lob_loc => p_xml,
    cache   => true
  );

  for lv_i in 1 .. 999999 loop
    lv_xml := 'a';

    dbms_lob.writeappend(
      lob_loc => p_xml,
      amount  => length(lv_xml),
      buffer  => lv_xml
    );
  end loop;
end p_xml_test_2;

차이는 무시할 수 있습니다. 둘 다 약 .2 초에 일관되게 들어옵니다.

절차를 10000 대신 999999로 루프하도록 변경하면 버전 1의 성능이 다소 감소하기 시작합니다 (버전 2의 경우 39 초 대 32 초).

두 번째를 사용하고 싶은 이유는 없습니다.

LV_XML이 덩어리가 아닌 varchar2라면 아주 좋은 이유를 알 수 있습니다 (문자열 리터럴의 최대 길이와 클로브의 최대 길이).

답변 주셔서 감사합니다. 아래에 나열된 사이트에서 읽은 내용을 바탕으로 DBMS_LOB.WRITEAPNED를 사용하는 것이 실제로 좋은 것이라고 가정합니다. 그렇지 않으면 varchar2s를 사용하고있을 수도 있습니다 (경우에 따라 충분히 크지 않을 것입니다).

"l_clob"이라는 클로브 변수가 있고 "l_clob : = l_clob : = l_clob || l_some_string_to_concatenate;"와 같은 일을한다면, 방정식 오른쪽의 l_clob 값을 바르 차량으로 변환하기 전에 일치 할 수 있습니다. 결과 또는 오류가 잘못되었습니다.

http://www.maristream.org/srea/huge_strings_using_lobs.htm

언급하지 않은 또 다른 옵션이 있습니다 : Oracle의 내장 XML 기능을 사용합니다 (데이터베이스 버전이 9i 이상인 것으로 가정). 예를 들어, 쿼리에서 XML 문서를 생성하는 것은 DBMS_XMLGEN.getXML() 또는 DBMS_XMLGEN.getXMLType().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top