- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数可以解析 XMLTYPE 变量,并且对于每条消息,为 XMLTYPE 变量中的每个标记附加一个具有特定结构的 CLOB。像这样:
FUNCTION myFunc (px_Header IN VARCHAR2,
px_Block IN XMLTYPE,
pn_numLines OUT PLS_INTEGER)
RETURN CLOB
IS
lcl_return CLOB := EMPTY_CLOB;
BEGIN
pn_numLines := 0;
FOR item
IN ( SELECT RPAD (NVL (RECEIPTNUMBER, ' '), 20) AS RECEIPTNUMBER,
RPAD (NVL (COMPANYCODE, ' '), 3) AS COMPANYCODE,
RPAD (NVL (BRAND, ' '), 3) AS BRAND,
RPAD (NVL (POLICYNUMBER, ' '), 20) AS POLICYNUMBER,
RPAD (NVL (CLAIMNUMBER, ' '), 20) AS CLAIMNUMBER,
RECEIPTAMOUNT
AS receiptAmount
FROM XMLTABLE (
'INT_DATA/Item'
PASSING px_Block
COLUMNS RECEIPTNUMBER VARCHAR2 (20)
PATH 'RECEIPTNUMBER',
COMPANYCODE VARCHAR2 (3)
PATH 'COMPANYCODE',
BRAND VARCHAR2 (3) PATH 'BRAND',
POLICYNUMBER VARCHAR2 (20)
PATH 'POLICYNUMBER',
CLAIMNUMBER VARCHAR2 (20)
PATH 'CLAIMNUMBER',
RECEIPTAMOUNT VARCHAR2 (15)
PATH 'RECEIPTAMOUNT'))
LOOP
lcl_return:=
lcl_return
|| px_Header
|| 'B2'
|| item.RECEIPTNUMBER
|| item.COMPANYCODE
|| item.BRAND
|| item.POLICYNUMBER
|| item.CLAIMNUMBER
|| item.RECEIPTAMOUNT
|| CHR (13)
|| CHR (10);
pn_numLines := pn_numLines + 1;
END LOOP;
RETURN lcl_return;
END myFunc ;
如果我有一个小的 px_Block
,这很有效。但我有一个情况,我可以有一个大的 XMLTYPE 并且这个函数需要很长时间。我是 XMLType 和 XMLTable 的新手。我可以做些什么来提高绩效吗?也许使用 BULK COLLECT 语句?
提前致谢,菲利普
编辑1:以下是仅适用于两个实例的 XML 示例。
<INT_DATA>
<Item>
<RECEIPTNUMBER>1</RECEIPTNUMBER>
<COMPANYCODE>148</COMPANYCODE>
<BRAND>006</BRAND>
<POLICYNUMBER>72972</POLICYNUMBER>
<CLAIMNUMBER>2015101504</CLAIMNUMBER>
<RECEIPTAMOUNT>-10.00</RECEIPTAMOUNT>
</Item>
<Item>
<RECEIPTNUMBER>1</RECEIPTNUMBER>
<COMPANYCODE>148</COMPANYCODE>
<BRAND>006</BRAND>
<POLICYNUMBER>73785</POLICYNUMBER>
<CLAIMNUMBER>2015101505</CLAIMNUMBER>
<RECEIPTAMOUNT>-22.50</RECEIPTAMOUNT>
</Item>
</INT_DATA>
编辑2:我对我的函数进行了一些更改,改进了 20%。我更改了使用临时 CLOB 附加 CLOB 的方式。但更好的解决方案将会有所帮助。
FUNCTION myFunc (px_Header IN VARCHAR2,
px_Block IN XMLTYPE,
pn_numLines OUT PLS_INTEGER)
RETURN CLOB
IS
lcl_return CLOB := EMPTY_CLOB;
v_tmp_clob CLOB := EMPTY_CLOB;
BEGIN
pn_numLines := 0;
FOR item
IN ( SELECT RPAD (NVL (RECEIPTNUMBER, ' '), 20) AS RECEIPTNUMBER,
RPAD (NVL (COMPANYCODE, ' '), 3) AS COMPANYCODE,
RPAD (NVL (BRAND, ' '), 3) AS BRAND,
RPAD (NVL (POLICYNUMBER, ' '), 20) AS POLICYNUMBER,
RPAD (NVL (CLAIMNUMBER, ' '), 20) AS CLAIMNUMBER,
RECEIPTAMOUNT
AS receiptAmount
FROM XMLTABLE (
'INT_DATA/Item'
PASSING px_Block
COLUMNS RECEIPTNUMBER VARCHAR2 (20)
PATH 'RECEIPTNUMBER',
COMPANYCODE VARCHAR2 (3)
PATH 'COMPANYCODE',
BRAND VARCHAR2 (3) PATH 'BRAND',
POLICYNUMBER VARCHAR2 (20)
PATH 'POLICYNUMBER',
CLAIMNUMBER VARCHAR2 (20)
PATH 'CLAIMNUMBER',
RECEIPTAMOUNT VARCHAR2 (15)
PATH 'RECEIPTAMOUNT'))
LOOP
v_tmp_clob :=
TO_CLOB (px_Header)
|| TO_CLOB ('B2')
|| TO_CLOB (item.RECEIPTNUMBER)
|| TO_CLOB (item.COMPANYCODE)
|| TO_CLOB (item.BRAND)
|| TO_CLOB (item.POLICYNUMBER)
|| TO_CLOB (item.CLAIMNUMBER)
|| TO_CLOB (item.RECEIPTAMOUNT)
|| CHR (13)
|| CHR (10);
lcl_return := lcl_return || v_tmp_clob;
pn_numLines := pn_numLines + 1;
END LOOP;
RETURN lcl_return;
END myFunc ;
最佳答案
XMLTABLE
的问题是 Oracle 使用 DOM Parser读取 XML。这意味着必须将整个 XML 加载到内存中,这会产生大量开销。看看DBMS_XMLSTORE 。该包使用 SAX Parser这是基于事件的(或基于流的)。
使用 SAX 解析器,您可以用普通 PC 读取大小为几 GB 的 XML 文件。
但是,直到 - 假设 50-100 MByte - DOM 解析器应该可以正常工作。
关于oracle - PL\SQL XMLTable 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33916475/
我试图通过这个脚本从下面的 XML 中获取作为 80621b17-97a8-926d945b602a 的信封_id,但没有任何结果。任何人都可以有任何想法吗? SELECT b.EnvelopeID
我有以下 XML 结构: 1 10000 11 1000
我有这样的 XML: A A1 A2 A3 B C D
什么是 XMLTABLE。 请告诉我创建 XMLTABLE 的语法 从 XMLTABLE 获取记录的示例查询。 创建 XMLTABLE 之前是否需要任何数据库级别的先决条件。 最佳答案 函数XMLTA
我有这样的 XML: A A1 A2 A3 B C D
我想知道是否可以在带有 XPATH 的 Oracle XMLTABLE 结构中使用 if 或条件语句。出于设计原因,我只能在 XMLTABLE 中使用 xpath。我在 XQUERY 中使用了 if
使用此 XML : A B C D 1 2 3
在PL/SQL中有没有办法获取最深深度的所有节点? 示例1: A B A11 示例2: A B D
我有一个函数可以解析 XMLTYPE 变量,并且对于每条消息,为 XMLTYPE 变量中的每个标记附加一个具有特定结构的 CLOB。像这样: FUNCTION myFunc (px_Header
我正在使用 Oracle 11.2.0.4.0并且在 XMLTABLE 时遇到过几次问题被卷入。我的最新问题可以通过以下示例(我设计得尽可能简单)来演示: with data as ( selec
我在 Oracle 的一列中有 XML,存储为 CLOB 类型。我的目的是解析这个 XML 并检索与感兴趣的列对应的数据。这是 XML 结构: G1_val G2_val
我正在尝试运行一个涉及 xmltable 的脚本,但我得到了一个 PLS-00428: an INTO clause is expected in this SELECT statement 如何更正
I want to parse a xml string that is a web service response sent from servier, the xml looks like th
我将以下 XML 文件从名为 ARCHIVDATA 的表中完全导入到一个名为 CLOB_CONTENT 的单元格中: 1 2
我是一名优秀的程序员,十分优秀!