【问题标题】:View a SYS.XMLTYPE returned from an Oracle function, using PL/SQL使用 PL/SQL 查看从 Oracle 函数返回的 SYS.XMLTYPE
【发布时间】:2011-02-03 07:55:50
【问题描述】:

我有一个 Oracle 函数可以动态创建 XML 文档,并以 SYS.XMLTYPE 值返回它。

我想从 SQL Developer 运行一个调用该函数并打印文档的查询(通过选择或 dbms_output - 我不在乎)。

但所有示例/文档似乎都涉及查询表中的 XML 列,而且我似乎无法获得适合我特定用途的语法。我想要这样的东西:

declare
   x SYS.XMLTYPE;
begin
   x := my_package.my_function();
   select x.getclobval() from x;  -- doesn't work!
end;

如何打印出上述代码中 XML 类型变量 'x' 的值?

【问题讨论】:

    标签: xml oracle plsql


    【解决方案1】:

    试试这个(不保证,我还没有真正使用过 XML 的东西)

    declare
       x SYS.XMLTYPE;
    begin
       x := my_package.my_function();
       dbms_output.put_line ( x.getCLOBVal() );
    end;
    

    【讨论】:

    • 我使用 x := XMLType( '<Test></Test>' ); 尝试过,您的尝试似乎有效 (+1)
    • 奇怪的是,简单的情况可以正常工作(在代码中定义变量,如上面的示例)。但是当我对我的数据库尝试它时它失败了 - 我只是收到错误 ORA-06502: PL/SQL: numeric or value error。从 DUAL(下面的答案)中选择似乎可以正常工作。
    【解决方案2】:

    这是一个返回 XMLType 的函数...

    SQL> create or replace function get_emp_xml
      2      (p_eno in emp.empno%type)
      3      return xmltype
      4  is
      5      return_value xmltype;
      6  begin
      7      select value(emprec) as "EMP_REC"
      8      into return_value
      9      from table (xmlsequence
     10                  (cursor
     11                      ( select * from emp e
     12                        where e.empno = p_eno
     13                       )
     14                   )
     15                  ) emprec
     16      ;
     17
     18      return return_value;
     19  end;
     20  /
    
    Function created.
    
    SQL>
    

    从 SELECT 语句中查询它就像您希望的那样简单:

    SQL> set long 5000
    SQL>
    SQL> select get_emp_xml(8060) from dual
      2  /
    
    GET_EMP_XML(8060)
    --------------------------------------------------------------------------
     <ROW>
      <EMPNO>8060</EMPNO>
      <ENAME>VERREYNNE</ENAME>
      <JOB>PLUMBER</JOB>
      <MGR>7839</MGR>
      <HIREDATE>08-APR-08</HIREDATE>
      <SAL>4500</SAL>
      <DEPTNO>50</DEPTNO>
     </ROW>
    
    
    SQL>
    

    这也适用于 SQL Developer。

    【讨论】:

      【解决方案3】:

      根据您的 XML 的长度,以及您的 Oracle 版本中 dbms_output.put_line 的限制,您可能需要像这样使用一点智能来包装它:

      PROCEDURE put_string
      (
          p_text IN CLOB
      )
      IS
          v_index INTEGER;
      BEGIN
      
          IF p_text IS NULL THEN
              RETURN;
          END IF;
      
          v_index := instr(p_text, chr(10));
      
          IF v_index > 0 AND v_index < 256 THEN
              dbms_output.put_line(substr(p_text, 1, v_index-1));
              put_string(substr(p_text, v_index+1));
          ELSE
              IF length(p_text) <= 255 THEN
                  dbms_output.put_line(p_text);
              ELSE
                  dbms_output.put_line(substr(p_text, 1, 255));
                  put_string(substr(p_text, 256));
              END IF;
          END IF;
      
      END;
      

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 2018-08-21
        • 2013-11-20
        相关资源
        最近更新 更多