Просмотрите SYS.XMLTYPE, возвращенный из функции Oracle, с помощью МН / SQL

Я сделал, чтобы Oracle функционировала, который динамично создает XML-документ и возвращает его в значении SYS.XMLTYPE.

Я хочу выполнить запрос от Разработчика SQL, который вызывает ту функцию и печатает документ (или через выбор или через dbms_output - я не забочусь).

Но все примеры/документация, кажется, относятся к запросам столбцов XML в таблицах, и я, может казаться, не разбираюсь в синтаксисе для своего конкретного использования. Я хотел бы что-то вроде этого:

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

Как я могу распечатать значение переменной типа XML 'x' в вышеупомянутом коде?

5
задан David 1 April 2010 в 11:02
поделиться

3 ответа

Вот функция, которая возвращает 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.

5
ответ дан 18 December 2019 в 14:44
поделиться

В зависимости от длины вашего XML и ограничений dbms_output.put_line в вашей версии Oracle, вам может понадобиться обернуть его небольшим количеством интеллекта, например, так:

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;
0
ответ дан 18 December 2019 в 14:44
поделиться

Попробуйте это (нет гарантии, я на самом деле не использовал XML)

declare
   x SYS.XMLTYPE;
begin
   x := my_package.my_function();
   dbms_output.put_line ( x.getCLOBVal() );
end;
8
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: