【问题标题】:pl/sql Function XMLType.EXTRACT doesn't work in Oracle Forms 11gpl/sql 函数 XMLType.EXTRACT 在 Oracle Forms 11g 中不起作用
【发布时间】: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


【解决方案1】:

作为TenG的回复,pl/sql引擎缺少forms,需要在DB中添加代码。

【讨论】: