| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Getting well-formed XML using SQL
John Haskins wrote:
> Vicchu,
>
> I appreciate your response. Unfortunately, the example you sent doesn't
> work. Output is cut off in output table: the Employees and Emp branches are
> not completed; there's only 1 employee record, and that 1 record is itself
> truncated.
>
>
> RESULT
>
> ------------------------
>
> <?xml version="1.0"?>
>
> <Employees>
>
> <Emp>
>
> <ENAME>SMITH</ENAME>
>
> <EMPNO>7369</E
>
>
>
>
>
> As an experiment, I changed the first Emp record so the employee name is 2
> characters longer, the output in TEMP_CLOB_TAB is truncated 2 characters
> sooner.
>
>
>
>
> 1* update scott.emp set ename='SMT' where ename = 'SMITH'
>
> SQL> /
>
>
>
> 1 row updated.
>
>
>
> SQL> DECLARE
>
> 2 qryCtx DBMS_XMLGEN.ctxHandle;
>
> 3 result CLOB;
>
> 4 BEGIN
>
> 5 qryCtx := dbms_xmlgen.newContext('SELECT ENAME,
>
> 6 EMPNO
>
> 7 FROM scott.emp');
>
> 8 DBMS_XMLGEN.setRowSetTag(qryCtx, 'Employees');
>
> 9 DBMS_XMLGEN.setRowTag(qryCtx, 'Emp');
>
> 10 result := DBMS_XMLGEN.getXML(qryCtx);
>
> 11 INSERT INTO temp_clob_tab VALUES(result);
>
> 12 DBMS_XMLGEN.closeContext(qryCtx);
>
> 13 END;
>
> 14 /
>
>
>
> PL/SQL procedure successfully completed.
>
>
>
> SQL> select * from temp_clob_tab
>
> 2 /
>
>
>
> RESULT
>
> --------------------------------------------------------------
>
> <?xml version="1.0"?>
>
> <Employees>
>
> <Emp>
>
> <ENAME>SMITH</ENAME>
>
> <EMPNO>7369</E
>
>
>
> <?xml version="1.0"?>
>
> <Employees>
>
> <Emp>
>
> <ENAME>SMT</ENAME>
>
> <EMPNO>7369</EMP
>
>
> Any thoughts on how to make the procedure reflect the complete dataset
> available in the source?
>
> Thanks.
>
>
>
>
> "Vicchu" <vicchu22_at_yahoo.com> wrote in message
> news:40C568B9.7070809_at_yahoo.com...
>
>>I presume that you are testing this on Oracle 9204 or later as I believe
>>the same code on 9202
>>would give you the nested output. This change in behaviour was
>>deliberately introduced at 9202
>>for some performance reasons.
>>
>>If a formatted document is required, use DBMS_XMLGEN.getXML instead as
>>the following
>>code sample illustrates :
>>
>>CREATE TABLE temp_clob_tab(result CLOB);
>>
>>DECLARE
>> qryCtx DBMS_XMLGEN.ctxHandle;
>> result CLOB;
>>BEGIN
>> qryCtx := dbms_xmlgen.newContext('SELECT ENAME as "Name", EMPNO as "ID"
>>scott.emp'); >> >>-- set the rowset header to be Employees >> DBMS_XMLGEN.setRowSetTag(qryCtx, 'Employees'); >> >>-- set the row header to be Emp >> DBMS_XMLGEN.setRowTag(qryCtx, 'Emp'); >> >> -- now get the result >> result := DBMS_XMLGEN.getXML(qryCtx); >> >> INSERT INTO temp_clob_tab VALUES(result); >> >> --close context >> DBMS_XMLGEN.closeContext(qryCtx); >>END; >>/ >>set pages 100 >>select * from temp_clob_tab >>/ >> >>Vicchu >> >>John Haskins wrote: >> >> >>>I'm writing to ask for help on Oracle's XML capabilities. The output I'm >>>getting does not have CrLf sequences between values, so instead of the >>>nicely formatted lists shown in Oracle's documentation, I'm getting
>>>that while technically correct, is difficult to read and not really what
>>>have come to expect.
>>>
>>>For example, this bit of code is from the Oracle docs, which show output
>>>that is nicely formatted with indents that reflect the data hierarchy.
>>>However, what I get is one long, continuous line of output per record.
>>>
>>>SQL> CREATE OR REPLACE TYPE emp_t AS OBJECT ("@EMPNO" NUMBER(4),
>>> 2 ENAME VARCHAR2(10));
>>> 3 /
>>>
>>>Type created.
>>>
>>>SQL>
>>>SQL> CREATE OR REPLACE TYPE emplist_t AS TABLE OF emp_t;
>>> 2 /
>>>
>>>Type created.
>>>
>>>SQL>
>>>SQL> CREATE OR REPLACE TYPE dept_t AS OBJECT ("@DEPTNO" NUMBER(2),
>>> 2 DNAME VARCHAR2(14),
>>> 3 EMP_LIST emplist_t);
>>> 4 /
>>>
>>>Type created.
>>>
>>>SQL>
>>>SQL> SELECT XMLElement("Department",
>>> 2 dept_t(deptno,
>>> 3 dname,
>>> 4 CAST(MULTISET(select empno,
>>> 5 ename
>>> 6 from scott.emp e
>>> 7 where e.deptno = d.deptno
>>> 8 )
>>> 9 AS emplist_t
>>>10 )
>>>11 )
>>>12 ) AS deptxml
>>>13 FROM scott.dept d
>>>14 WHERE d.deptno = 10;
>>>
>>>DEPTXML
>>
>>---------------------------------------------------------------------------
>>>---- >>><Department><DEPT_T DEPTNO="10"><DNAME>ACCOUNTING</DNAME><EMP_LIST><EMP_T >>>EMPNO= >>> >>> >>> >>>If you have any thoughts on how to produce more readable output using
>>>SQL, I'd sure appreciate hearing them. >>> >>> >>> >>> >>> >>> >>
set long = [a rather large number]?
-- Regards, Frank van BortelReceived on Mon Jun 21 2004 - 02:36:42 CDT
![]() |
![]() |