2

我想创建一些将 XML 作为 CLOB 参数返回的 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;

我想知道第一种方法是否会给我带来任何问题。这样做可以吗?第二种方法有什么优势(如果有的话)?谢谢!

4

5 回答 5

1

我运行了以下程序来比较执行时间:

版本 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;

差异可以忽略不计。两者都始终以大约 0.2 秒的速度出现。

如果我将程序更改为循环到 999999 而不是 10000,则版本 1 的性能开始有所下降(大约 39 秒,而版本 2 为 32 秒)。

于 2009-10-26T14:55:30.260 回答
0

我认为您应该通过在循环中多次运行这两种方法来衡量它们的性能。我认为性能是唯一的区别。您的 xml 块很短,但是当您连接一个大的 xml 块时,使用 dbms_low.writeappend 连接比使用 || 更快。

(至少在 Oracle 9 中是这样,我相信 Oracle 10 中的性能差异更小。)

于 2009-10-23T17:43:27.947 回答
0

我看不出你为什么要使用第二个。

如果 lv_xml 是 VARCHAR2 而不是 CLOB,那么我看到了一个很好的理由(字符串文字的最大长度与 CLOB 的最大长度)。

于 2009-10-23T18:03:01.760 回答
0

感谢您的回答。根据我在下面列出的站点上阅读的内容,我将假设使用 dbms_lob.writeappend 实际上是一件好事。如果我不这样做,我还不如使用 VARCHAR2s(在某些情况下它不够大)。

如果您有一个名为“l_clob”的 CLOB 变量,并且您执行“l_clob := l_clob || l_some_string_to_concatenate;”之类的操作,它将在进行连接之前将等式右侧的 l_clob 值转换为 VARCHAR2,可能给出你无效的结果或错误。

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

于 2009-10-24T11:15:05.720 回答
0

还有一个您没有提到的选项:使用 Oracle 的内置 XML 功能(假设您拥有 9i 或更高版本的数据库)。例如,从查询生成 XML 文档是使用DBMS_XMLGEN.getXML()或的片段DBMS_XMLGEN.getXMLType()

于 2009-10-25T07:46:08.667 回答