【发布时间】:2025-12-02 18:40:03
【问题描述】:
我需要使用 Oracle 表单 (11.1.2.2) 程序解析 xml 文件,并且我想使用 XMLType 包。
首先,这个示例程序在 PL/SQL Developer 中运行良好:
declare
table0 XMLType :=XMLType('<?xml version="1.0"?>
<table>
<name>PARAM_TEST1</name>
<columns>
<column>
<name>CODE_PARAM</name>
<type>VARCHAR2</type>
<size>3</size>
<pk>Y</pk>
<visible>Y</visible>
</column>
<column>
<name>DESC_PARAM</name>
<type>VARCHAR2</type>
<size>25</size>
<pk>N</pk>
<visible>Y</visible>
</column>
</columns>
</table>');
v_count NUMBER(38) := 1;
begin
WHILE table0.existsNode('//column[' || v_count || ']') = 1 LOOP
dbms_output.put_line(table0.extract('//column[' || v_count || ']/name/text()').getStringVal());
v_count := v_count + 1;
END LOOP;
end;
在 Oracle Forms 中,我创建了这个示例包:
PACKAGE pkg_sample IS
table0 XMLType := XMLType('<?xml version="1.0"?>
<columns>
<column>
<name>CODE_PARAM</name>
<type>VARCHAR2</type>
<size>3</size>
<pk>Y</pk>
<visible>Y</visible>
</column>
<column>
<name>DESC_PARAM</name>
<type>VARCHAR2</type>
<size>25</size>
<pk>N</pk>
<visible>Y</visible>
</column>
</columns>');
在我创建一个程序单元来搜索 XML 文件中的列名之后
PROCEDURE pr_load_column_info IS
l_count NUMBER(38) := 1;
result varchar2(1000);
begin
WHILE pkg_sample.table0.existsNode('//column[' || l_count || ']') = 1 LOOP
result := pkg_sample.table0.extract('//column[' || l_count || ']/name/text()').getStringVal();
message('loop '||l_count||' - '|| result);
l_count := l_count + 1;
END LOOP;
end;
使用上面的代码,我的表单应用程序崩溃了!
现在,如果我创建以下数据库函数:
create or replace function fn_get_xml_value(p_xml_data XMLType, p_XPath varchar2) return varchar2 is
Result varchar2(1000);
begin
Result := p_xml_data.extract(p_XPath).getStringVal();
return(Result);
end fn_get_xml_value;
如果我用表格来称呼它:
PACKAGE BODY Generic_data IS
PROCEDURE pr_load_column_info IS
l_count NUMBER(38) := 1;
result varchar2(1000);
begin
WHILE pkg_sample.table0.existsNode('//column[' || l_count || ']') = 1 LOOP
result := fn_get_xml_value(pkg_sample.table0, '//column[' || l_count || ']/name/text()');
message('loop '||l_count||' - '|| result);
l_count := l_count + 1;
END LOOP;
end;
END
一切正常
唯一的区别是以下行的执行是在数据库端完成的:
result := pkg_sample.table0.extract('//column[' || l_count || ']/name/text()').getStringVal();
有什么想法吗?是因为表单中的 PL/SQL 引擎吗?
谢谢
【问题讨论】:
-
Forms 中的 PLSQL 引擎可能不支持此功能。您通过将此代码添加到数据库中的工作方式是通常的技巧。
-
谢谢。所以我会保持这样。
标签: oracle oracle11g oracleforms xmltype