Я сделал, чтобы 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' в вышеупомянутом коде?
Вот функция, которая возвращает 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.
В зависимости от длины вашего 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;
Попробуйте это (нет гарантии, я на самом деле не использовал XML)
declare
x SYS.XMLTYPE;
begin
x := my_package.my_function();
dbms_output.put_line ( x.getCLOBVal() );
end;