<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>OraQA</title>
	
	<link>http://oraqa.com</link>
	<description>Oracle Question and Answer</description>
	<lastBuildDate>Mon, 23 Apr 2012 14:00:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/OraQA" /><feedburner:info uri="oraqa" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><item>
		<title>How to do XML based data manipulation in SQL and XSLT</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/lPatObFPxSY/</link>
		<comments>http://oraqa.com/2012/04/23/how-to-do-xml-based-data-manipulation-in-sql-and-xslt/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 14:00:31 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=839</guid>
		<description><![CDATA[The following SQL pattern can be used to do XML based data manipulation and transformation by utilizing XSLT functionality. This query will do the following data manipulation and transformation: 1) Rename the xml tag &#60;FirstName&#62; to &#60;FN&#62; when the position of the element node is either the last one or the id attribute is 3. [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to do XML based data manipulation and transformation by utilizing XSLT functionality.</p>
<p>This query will do the following data manipulation and transformation:</p>
<p>1) Rename the xml tag &lt;FirstName&gt; to &lt;FN&gt; when the position of the element node is<br />
   either the last one or the id attribute is 3.</p>
<p>2) Remove the &lt;MiddleName&gt; tag if this is empty.</p>
<p>3) Transform all the xml attributes to elements.</p>
<pre>
CREATE TABLE PERSON
(ID            NUMBER,
 FIRSTNAME     VARCHAR2(20 BYTE),
 MIDDLENAME    VARCHAR2(20 BYTE),
 LASTNAME      VARCHAR2(20 BYTE),
 LOCATION_ID   NUMBER);

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (1, 'Frank', null, 'Zhou', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (2, 'Peter', 'B',  'Lee', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (3, 'John' , 'C',   'Adam', 2);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (4, 'Dave' , null, 'Washington', 2);

CREATE TABLE LOCATION
(LOCATION_ID       NUMBER,
 LOCATION_NAME     VARCHAR2(20 BYTE)
 );

INSERT INTO LOCATION (LOCATION_ID, LOCATION_NAME)
VALUES (1, 'BOSTON');
INSERT INTO LOCATION (LOCATION_ID, LOCATION_NAME)
VALUES (2, 'NEW YORK');
COMMIT;

---------------Input XML Data is generated by the top part of the query (WITH DATA AS)-----------------

&lt;ROWSET&gt;
  &lt;ROW ID="1" Location_name="BOSTON"&gt;
    &lt;FirstName&gt;Frank&lt;/FirstName&gt;
    &lt;MiddleName/&gt;
    &lt;LastName&gt;Zhou&lt;/LastName&gt;
  &lt;/ROW&gt;
  &lt;ROW ID="2" Location_name="BOSTON"&gt;
    &lt;FirstName&gt;Peter&lt;/FirstName&gt;
    &lt;MiddleName&gt;B&lt;/MiddleName&gt;
    &lt;LastName&gt;Lee&lt;/LastName&gt;
  &lt;/ROW&gt;
  &lt;ROW ID="3" Location_name="NEW YORK"&gt;
    &lt;FirstName&gt;John&lt;/FirstName&gt;
    &lt;MiddleName&gt;C&lt;/MiddleName&gt;
    &lt;LastName&gt;Adam&lt;/LastName&gt;
  &lt;/ROW&gt;
  &lt;ROW ID="4" Location_name="NEW YORK"&gt;
    &lt;FirstName&gt;Dave&lt;/FirstName&gt;
    &lt;MiddleName/&gt;
    &lt;LastName&gt;Washington&lt;/LastName&gt;
  &lt;/ROW&gt;
&lt;/ROWSET&gt;

---------------------------------------------------SQL Query------------------------------------

WITH DATA AS
(SELECT XMLPARSE(DOCUMENT XMLSERIALIZE(CONTENT
           XMLELEMENT(ROWSET,
               XMLAGG(XMLELEMENT("ROW",
                      XMLATTRIBUTES(ID AS "ID",  LOCATION_NAME AS "Location_name"),
                      XMLELEMENT("FirstName",    FIRSTNAME),
                      XMLELEMENT("MiddleName",   MIDDLENAME),
                      XMLELEMENT( "LastName",    LASTNAME  )
                      )  ORDER BY ID)
                 )  )  ) AS XML
 FROM  person p, location l
 WHERE p.location_id = L.LOCATION_ID
)
SELECT  XMLSERIALIZE(DOCUMENT XMLTRANSFORM(
        (SELECT XML FROM DATA) ,
 XMLTYPE('&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
 &lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
 &lt;xsl:strip-space elements="*"/&gt;
 &lt;xsl:output indent="yes"/&gt;
 &lt;xsl:template match="node()|@*"&gt;
        &lt;xsl:copy&gt;&lt;xsl:apply-templates select="node()|@*"/&gt;&lt;/xsl:copy&gt;
 &lt;/xsl:template&gt;
 &lt;xsl:template match="ROW[position() = last() or @ID=3 ]/FirstName "&gt;
        &lt;FN&gt;&lt;xsl:apply-templates select="node()|@*"/&gt;&lt;/FN&gt;
 &lt;/xsl:template&gt;
 &lt;xsl:template match="ROW[not(MiddleName/text())]/MiddleName"/&gt;
  &lt;xsl:template match="@*"&gt;
        &lt;xsl:element name="{name(.)}"&gt;&lt;xsl:value-of select="."/&gt;&lt;/xsl:element&gt;
  &lt;/xsl:template&gt;
  &lt;/xsl:stylesheet&gt;')))  AS XML_DATA
 FROM DUAL;

---------------------------------Output XML Data ---------------------------------------

&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;ROWSET&gt;
 &lt;ROW&gt;
  &lt;ID&gt;1&lt;/ID&gt;
  &lt;Location_name&gt;BOSTON&lt;/Location_name&gt;
  &lt;FirstName&gt;Frank&lt;/FirstName&gt;
  &lt;LastName&gt;Zhou&lt;/LastName&gt;
 &lt;/ROW&gt;
 &lt;ROW&gt;
  &lt;ID&gt;2&lt;/ID&gt;
  &lt;Location_name&gt;BOSTON&lt;/Location_name&gt;
  &lt;FirstName&gt;Peter&lt;/FirstName&gt;
  &lt;MiddleName&gt;B&lt;/MiddleName&gt;
  &lt;LastName&gt;Lee&lt;/LastName&gt;
 &lt;/ROW&gt;
 &lt;ROW&gt;
  &lt;ID&gt;3&lt;/ID&gt;
  &lt;Location_name&gt;NEW YORK&lt;/Location_name&gt;
  &lt;FN&gt;John&lt;/FN&gt;
  &lt;MiddleName&gt;C&lt;/MiddleName&gt;
  &lt;LastName&gt;Adam&lt;/LastName&gt;
 &lt;/ROW&gt;
 &lt;ROW&gt;
  &lt;ID&gt;4&lt;/ID&gt;
  &lt;Location_name&gt;NEW YORK&lt;/Location_name&gt;
  &lt;FN&gt;Dave&lt;/FN&gt;
  &lt;LastName&gt;Washington&lt;/LastName&gt;
 &lt;/ROW&gt;
&lt;/ROWSET&gt;
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=lPatObFPxSY:ldP-7wTryx4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=lPatObFPxSY:ldP-7wTryx4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=lPatObFPxSY:ldP-7wTryx4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=lPatObFPxSY:ldP-7wTryx4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=lPatObFPxSY:ldP-7wTryx4:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=lPatObFPxSY:ldP-7wTryx4:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=lPatObFPxSY:ldP-7wTryx4:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=lPatObFPxSY:ldP-7wTryx4:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/lPatObFPxSY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/04/23/how-to-do-xml-based-data-manipulation-in-sql-and-xslt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/04/23/how-to-do-xml-based-data-manipulation-in-sql-and-xslt/</feedburner:origLink></item>
		<item>
		<title>How to do table column based data manipulation in SQL and XQuery</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/SqINNKnpvh4/</link>
		<comments>http://oraqa.com/2012/04/03/how-to-do-table-column-based-data-manipulation-in-sql-and-xquery/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 14:00:20 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=811</guid>
		<description><![CDATA[The following SQL pattern can be used to stragg all the table column data together The STRAGG(column data) is grouped together based on the table column names. This SQL also manipulates comma-delimited strings using XQuery functionalities. CREATE TABLE PERSON (ID NUMBER, FIRSTNAME VARCHAR2(20 BYTE), MIDDLENAME VARCHAR2(20 BYTE), LASTNAME VARCHAR2(20 BYTE), LOCATION_ID NUMBER); INSERT INTO PERSON [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to stragg all the table column data together<br />
The STRAGG(column data) is grouped together based on the table column names.<br />
This SQL also manipulates comma-delimited strings using XQuery functionalities.</p>
<pre>

CREATE TABLE PERSON
(ID            NUMBER,
 FIRSTNAME     VARCHAR2(20 BYTE),
 MIDDLENAME    VARCHAR2(20 BYTE),
 LASTNAME      VARCHAR2(20 BYTE),
 LOCATION_ID   NUMBER);

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (1, 'Frank', null, 'Zhou', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (2, 'Peter', 'B',  'Lee', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (3, 'John' , 'C',   'Adam', 2);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (4, 'Dave' , null, 'Washington', 2);

commit;

set long 10000;
variable tableName varchar2(30)
exec :tableName:='PERSON'

COLUMN col_name FORMAT  A12
COLUMN sort_no_dup_str FORMAT A25
COLUMN distinct_cnt FORMAT  A5
COLUMN reverse_order FORMAT A25

---------------------------SQL QUERY-------------------------

WITH DATA AS
(SELECT DBMS_XMLGEN.getxmltype(
        (SELECT 'SELECT COLUMN_NAME, COLUMN_VALUES FROM (SELECT '||LISTAGG(
                'XMLAGG(XMLFOREST('||COLUMN_NAME||' AS '||COLUMN_NAME
                ||') ORDER BY ROWNUM) AS '||COLUMN_NAME,' , ') WITHIN GROUP(ORDER BY NULL)
                ||' FROM '||MAX(TABLE_NAME)
                ||') UNPIVOT INCLUDE NULLS(COLUMN_VALUES for COLUMN_NAME in ('
                ||LISTAGG (COLUMN_NAME, ',') WITHIN GROUP (ORDER BY COLUMN_ID)
                ||'))' AS SQL_STR
          FROM USER_TAB_COLUMNS
          WHERE TABLE_NAME = UPPER(:TableName))) AS XML
FROM DUAL),
ROW_DATA AS
(SELECT COLUMN_VALUE AS ROW_XML
 FROM DATA D, XMLTABLE('for $i in $str/ROWSET/ROW return $i'
                        PASSING D.XML AS "str")
),
SORT_REMOVE_DUPLICATE AS
(SELECT XMLQUERY('$str/ROW/COLUMN_NAME/text()'
                  PASSING RD.ROW_XML AS "str"
                  RETURNING CONTENT) AS col_name,
        XMLQUERY('string-join(for $i in  fn:distinct-values($str/ROW/COLUMN_VALUES/*[text()])
                  order by $i descending empty least return $i, ",")'
                  PASSING RD.ROW_XML AS "str"
                  RETURNING CONTENT) AS sort_no_dup_str
FROM ROW_DATA RD),
COLUM_DATA_INFO AS
(SELECT col_name, sort_no_dup_str,
  XMLQUERY('fn:count(fn:distinct-values(ora:tokenize($str, ",")))-1'
            PASSING CONCAT(s.sort_no_dup_str, ',') AS "str"
            RETURNING CONTENT) AS distinct_cnt,
 XMLQUERY ('string-join(remove(fn:reverse(ora:tokenize($str, ",") ), 1), ",")'
            PASSING CONCAT(s.sort_no_dup_str, ',') AS "str"
            RETURNING CONTENT) AS reverse_order
FROM SORT_REMOVE_DUPLICATE S
)
SELECT col_name, sort_no_dup_str, distinct_cnt, reverse_order
FROM COLUM_DATA_INFO;

COL_NAME     SORT_NO_DUP_STR           DISTI REVERSE_ORDER
------------ ------------------------- ----- -------------------------
ID           4,3,2,1                   4     1,2,3,4
FIRSTNAME    Peter,John,Frank,Dave     4     Dave,Frank,John,Peter
MIDDLENAME   C,B                       2     B,C
LASTNAME     Zhou,Washington,Lee,Adam  4     Adam,Lee,Washington,Zhou
LOCATION_ID  2,1                       2     1,2
</pre>
<p>SQL&gt;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=SqINNKnpvh4:tpsL8BRoeys:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=SqINNKnpvh4:tpsL8BRoeys:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=SqINNKnpvh4:tpsL8BRoeys:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=SqINNKnpvh4:tpsL8BRoeys:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=SqINNKnpvh4:tpsL8BRoeys:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=SqINNKnpvh4:tpsL8BRoeys:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=SqINNKnpvh4:tpsL8BRoeys:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=SqINNKnpvh4:tpsL8BRoeys:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/SqINNKnpvh4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/04/03/how-to-do-table-column-based-data-manipulation-in-sql-and-xquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/04/03/how-to-do-table-column-based-data-manipulation-in-sql-and-xquery/</feedburner:origLink></item>
		<item>
		<title>How to do character based data manipulation in SQL and XQuery</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/a8CR0sFuw0I/</link>
		<comments>http://oraqa.com/2012/04/02/how-to-do-character-based-data-manipulation-in-sql-and-xquery/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 14:00:41 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=820</guid>
		<description><![CDATA[The following SQL pattern can be used to do character based data manipulation by utilizing the XQuery functionalities. COLUMN old_str FORMAT A28 COLUMN ordered_no_dup_chars FORMAT A23 COLUMN Reversed_chars FORMAT A23 --------------------SQL Query------------------- WITH data AS (SELECT '3332221118888' AS old_str FROM dual UNION ALL SELECT 'CCCBBBAAA' FROM dual UNION ALL SELECT 'XXXYYY33332222' FROM dual ) SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to do character based data manipulation<br />
by utilizing the XQuery functionalities.</p>
<pre>

COLUMN old_str  FORMAT  A28
COLUMN ordered_no_dup_chars FORMAT A23
COLUMN Reversed_chars FORMAT  A23

--------------------SQL Query-------------------

WITH data AS
(SELECT '3332221118888'   AS  old_str  FROM dual
  UNION ALL
  SELECT 'CCCBBBAAA'          FROM dual
   UNION ALL
  SELECT 'XXXYYY33332222'     FROM dual
)
SELECT old_str, ordered_no_dup_chars,
       XMLQUERY('fn:codepoints-to-string(fn:reverse(fn:string-to-codepoints($str)))'
                 PASSING XML.ordered_no_dup_chars AS "str"
                 RETURNING CONTENT) AS Reversed_chars
FROM data d,
XMLTable('fn:codepoints-to-string(for $i in fn:distinct-values(fn:string-to-codepoints($str))
           order by $i ascending empty least return $i)'
           PASSING d.old_str  AS "str"
           COLUMNS  ordered_no_dup_chars varchar2(4000) PATH '.'
) XML;

OLD_STR                      ORDERED_NO_DUP_CHARS    REVERSED_CHARS
---------------------------- ----------------------- -----------------------
3332221118888                1238                    8321
CCCBBBAAA                    ABC                     CBA
XXXYYY33332222               23XY                    YX32
</pre>
<p>SQL&gt;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=a8CR0sFuw0I:_z0DHIVWoBQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=a8CR0sFuw0I:_z0DHIVWoBQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=a8CR0sFuw0I:_z0DHIVWoBQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=a8CR0sFuw0I:_z0DHIVWoBQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=a8CR0sFuw0I:_z0DHIVWoBQ:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=a8CR0sFuw0I:_z0DHIVWoBQ:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=a8CR0sFuw0I:_z0DHIVWoBQ:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=a8CR0sFuw0I:_z0DHIVWoBQ:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/a8CR0sFuw0I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/04/02/how-to-do-character-based-data-manipulation-in-sql-and-xquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/04/02/how-to-do-character-based-data-manipulation-in-sql-and-xquery/</feedburner:origLink></item>
		<item>
		<title>How to convert an Internet HTML Table to CSV format in SQL</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/OULlTJdEdNo/</link>
		<comments>http://oraqa.com/2012/03/19/how-to-convert-an-internet-html-table-to-csv-format-in-sql/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 14:00:01 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=795</guid>
		<description><![CDATA[The following SQL pattern can be used to transform an HTML Table on the web to CSV format. set long 10000; variable url_input varchar2(500) exec :url_input:='http://oraqa.com/2012/02/27/how-to-transform-a-csv-file-into-html-table-in-sql/' -------------------------------------------------------------------SQL QUERY--------------------------------------------------------------------- WITH HTML_TAB AS (SELECT CAST(REGEXP_REPLACE(SUBSTR(STR, 0, REGEXP_INSTR(str,'&#60;/table&#62;', 1,1,1, 'i') ), '( ){2,}', ' ') AS VARCHAR2(4000)) AS html_str FROM (SELECT SUBSTR(str, REGEXP_INSTR(str,'&#60;table', 1,1,0,'i')) as str FROM (SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to transform an HTML Table on the web to CSV format.</p>
<pre>

set long 10000;
variable url_input varchar2(500)
exec :url_input:='http://oraqa.com/2012/02/27/how-to-transform-a-csv-file-into-html-table-in-sql/'

-------------------------------------------------------------------SQL QUERY---------------------------------------------------------------------

WITH HTML_TAB AS
(SELECT CAST(REGEXP_REPLACE(SUBSTR(STR, 0, REGEXP_INSTR(str,'&lt;/table&gt;', 1,1,1, 'i') ), '( ){2,}', ' ')
         AS VARCHAR2(4000)) AS html_str
 FROM
 (SELECT SUBSTR(str, REGEXP_INSTR(str,'&lt;table', 1,1,0,'i')) as str
  FROM
 (SELECT HTTPURITYPE(:url_input).GETCLOB( ) AS str
  FROM DUAL )
 )
),
HEADER AS
(SELECT col_name, num,
        XMLCAST(XMLQUERY('fn:count(/table/tr/th)'
                        PASSING XMLPARSE(DOCUMENT html_str)
                        RETURNING CONTENT) AS NUMBER) AS Col_NUM
 FROM HTML_TAB, XMLTABLE('/table/tr/th'
                         PASSING XMLPARSE(DOCUMENT html_str)
                         COLUMNS col_name VARCHAR2 (30) PATH '.' ,
                         num FOR ORDINALITY)
),
H_DATA AS
(SELECT LISTAGG(col_name, ',') WITHIN GROUP(ORDER BY num) AS COL_NAMES,
        MAX(Col_NUM) AS Col_NUM
  FROM HEADER
),
COLUM_DATA AS
(SELECT rn, col_data||',' AS col_data
 FROM HTML_TAB, XMLTABLE('/table/tr/td'
                         PASSING XMLPARSE(DOCUMENT html_str)
                         COLUMNS  col_data VARCHAR2 (30) PATH '.' ,
                         rn FOR ORDINALITY )
 ),
CSV AS
(SELECT LISTAGG(col_data, '') WITHIN GROUP (ORDER BY rn) AS str, MAX(rn) AS RANK
 FROM COLUM_DATA D, H_DATA H
 GROUP BY CEIL(D.rn/H.Col_NUM)
)
SELECT CSV_STR
FROM (SELECT COL_NAMES AS CSV_STR, 0 AS pos, TO_NUMBER(NULL) AS RANK
      FROM H_DATA
      UNION ALL
      SELECT SUBSTR(str, 0, LENGTH (str) - 1), 1, RANK FROM CSV)
ORDER BY pos, RANK;
</pre>
<p>CSV_STR<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>ID,FIRSTNAME,MIDDLENAME,LASTNAME<br />
1,Frank,,Zhou<br />
2,Peter,B,Lee<br />
3,John,C,Adam<br />
4,Dave,,Washington</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=OULlTJdEdNo:eZwutyCm1Xw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=OULlTJdEdNo:eZwutyCm1Xw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=OULlTJdEdNo:eZwutyCm1Xw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=OULlTJdEdNo:eZwutyCm1Xw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=OULlTJdEdNo:eZwutyCm1Xw:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=OULlTJdEdNo:eZwutyCm1Xw:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=OULlTJdEdNo:eZwutyCm1Xw:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=OULlTJdEdNo:eZwutyCm1Xw:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/OULlTJdEdNo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/03/19/how-to-convert-an-internet-html-table-to-csv-format-in-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/03/19/how-to-convert-an-internet-html-table-to-csv-format-in-sql/</feedburner:origLink></item>
		<item>
		<title>How to transform a RefCursor query resultset into HTML table in SQL</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/gcrD6BYsaZM/</link>
		<comments>http://oraqa.com/2012/03/06/how-to-transform-a-refcursor-query-resultset-into-html-table-in-sql/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 14:00:17 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=744</guid>
		<description><![CDATA[The following SQL pattern can be used to tranform a RefCursor query resultset into data in HTML table format by utilizing the XSLT functionality. The query can handle NULL in the data columns. The SQL input string should be based on the following format: SELECT Col AS name_x, Function() AS name_y, Analytical_function( ) AS name_z [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to tranform a RefCursor  query resultset into data in HTML table format by utilizing the XSLT functionality. The query can handle NULL in the data columns. The SQL input string should be based on the following format: </p>
<p>SELECT  Col   AS  name_x,  Function()   AS  name_y,  Analytical_function( )  AS  name_z  FROM ( ***ANYTHING*** )  </p>
<p>You can change your query into this required format by wrapping your sql inside an inline view if needed. The &#8220;AS&#8221; keyword and column_name &#8220;alias&#8221; are required for building the XML tags.</p>
<pre>

CREATE TABLE PERSON
(ID            NUMBER,
 FIRSTNAME     VARCHAR2(20 BYTE),
 MIDDLENAME    VARCHAR2(20 BYTE),
 LASTNAME      VARCHAR2(20 BYTE),
 LOCATION_ID   NUMBER);

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (1, 'Frank', null, 'Zhou', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (2, 'Peter', 'B',  'Lee', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (3, 'John' , 'C',   'Adam', 2);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (4, 'Dave' , null, 'Washington', 2);

CREATE TABLE LOCATION
(LOCATION_ID       NUMBER,
 LOCATION_NAME     VARCHAR2(20 BYTE)
 );

INSERT INTO LOCATION (LOCATION_ID, LOCATION_NAME)
VALUES (1, 'BOSTON');
INSERT INTO LOCATION (LOCATION_ID, LOCATION_NAME)
VALUES (2, 'NEW YORK');
COMMIT;

set long 10000;
variable sql_input varchar2(500)
BEGIN
   :sql_input:= q'[
     SELECT b.location_name AS location,
            COUNT (*) AS COUNT,
            LISTAGG (a.lastname, ' , ') WITHIN GROUP (ORDER BY a.id)
               AS lastname_stragg
       FROM person a, location b
      WHERE a.location_id = b.location_id
   GROUP BY ROLLUP (b.location_name)
     HAVING MAX (b.location_id) &gt; 0
   ]';
END;
/
------------------------------------------SQL QUERY------------------------------------------------------------
WITH SQL_QUERY AS
(SELECT UPPER(SUBSTR(sql_str, 0, REGEXP_INSTR(sql_str, ' FROM', 1,1,0, 'i'))) AS SELECT_STR,
              SUBSTR(sql_str, REGEXP_INSTR(sql_str, ' FROM', 1,1,0, 'i')) AS FROM_STR
 FROM
 (SELECT DBMS_XMLGEN.CONVERT( XMLQUERY('fn:substring(fn:normalize-space(str), 8) '
                              PASSING XMLELEMENT("str",  SQL_STR)
                              RETURNING CONTENT).GETSTRINGVAL(), 1) AS sql_str
  FROM (SELECT :sql_input as sql_str FROM dual )
 )
),
COL_NAMES AS
(SELECT SUBSTR(COL_NAME, 0, INSTR(COL_NAME, ' AS ')) AS VAL,
        SUBSTR(COL_NAME, INSTR(COL_NAME, ' AS ') + 4) AS ALIAS, ROWNUM rn
 FROM SQL_QUERY, XMLTABLE('ora:tokenize(.,"#")'
                 PASSING  REGEXP_REPLACE (SELECT_STR, '([[:space:]]AS[[:space:]][^,]+)[[:space:]]?[,]?' , '\1#')
                 COLUMNS COL_NAME VARCHAR2 (100) PATH '.')
),
XML_QUERY AS
(SELECT ' SELECT 1, XMLELEMENT(ROW_DATA, '||LISTAGG(REPLACE(VAL, VAL, 'XMLELEMENT('||ALIAS||' , '||VAL||')') , ' , ')
                                            WITHIN GROUP (ORDER BY rn)||')' AS SELECT_STR,
          MAX((SELECT FROM_STR FROM SQL_QUERY)) AS FROM_AND_CONDITIONS_STR
  FROM  COL_NAMES
),
XML_DATA AS
(SELECT DBMS_XMLGEN.GETXMLTYPE(DBMS_XMLGEN.NEWCONTEXTFROMHIERARCHY(
                               SELECT_STR||' '||FROM_AND_CONDITIONS_STR)) AS XML_DOC
 FROM XML_QUERY
)
SELECT XMLSERIALIZE(DOCUMENT XMLTRANSFORM(
(SELECT XMLELEMENT (ROWSET, XML_DOC) FROM XML_DATA),
 XMLTYPE (
'&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
&lt;xsl:output method="html"/&gt;
&lt;xsl:template match="/"&gt;
     &lt;html&gt;&lt;body&gt;&lt;xsl:apply-templates/&gt; &lt;/body&gt;&lt;/html&gt;
&lt;/xsl:template&gt;
&lt;xsl:template match="ROWSET"&gt;
     &lt;table border = "1" cellspacing = "0"&gt; &lt;tr&gt; &lt;xsl:apply-templates select ="ROW_DATA[1]/*" mode ="Col_Name"/&gt; &lt;/tr&gt;
     &lt;xsl:apply-templates/&gt; &lt;/table&gt;
&lt;/xsl:template&gt;
&lt;xsl:template match="ROW_DATA"&gt;
     &lt;tr&gt;&lt;xsl:apply-templates/&gt; &lt;/tr&gt;
&lt;/xsl:template&gt;
&lt;xsl:template match="ROW_DATA/*"&gt;
     &lt;td&gt;&lt;xsl:apply-templates/&gt; &lt;/td&gt;
&lt;/xsl:template&gt;
&lt;xsl:template match="ROW_DATA/*"  mode = "Col_Name"&gt;
      &lt;th&gt;&lt;xsl:value-of select ="name(.)"/&gt; &lt;/th&gt;
&lt;/xsl:template&gt;
      &lt;/xsl:stylesheet&gt;'))) AS HTML_TABL_DATA
FROM DUAL;              
</pre>
<p>HTML_TABL_DATA<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<table border="1" cellspacing="0">
<tr>
<th>LOCATION</th>
<th>COUNT</th>
<th>LASTNAME_STRAGG</th>
</tr>
<tr>
<td>BOSTON</td>
<td>2</td>
<td>Zhou , Lee</td>
</tr>
<tr>
<td>NEW YORK</td>
<td>2</td>
<td>Adam , Washington</td>
</tr>
<tr>
<td></td>
<td>4</td>
<td>Zhou , Lee , Adam , Washington</td>
</tr>
</table>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=gcrD6BYsaZM:u_3WsRnubLI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=gcrD6BYsaZM:u_3WsRnubLI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=gcrD6BYsaZM:u_3WsRnubLI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=gcrD6BYsaZM:u_3WsRnubLI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=gcrD6BYsaZM:u_3WsRnubLI:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=gcrD6BYsaZM:u_3WsRnubLI:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=gcrD6BYsaZM:u_3WsRnubLI:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=gcrD6BYsaZM:u_3WsRnubLI:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/gcrD6BYsaZM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/03/06/how-to-transform-a-refcursor-query-resultset-into-html-table-in-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/03/06/how-to-transform-a-refcursor-query-resultset-into-html-table-in-sql/</feedburner:origLink></item>
		<item>
		<title>How to convert a RefCursor query resultset to CSV format in SQL</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/uGmUfjKIxp8/</link>
		<comments>http://oraqa.com/2012/03/05/how-to-convert-a-refcursor-query-resultset-to-csv-format-in-sql/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 14:00:52 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=757</guid>
		<description><![CDATA[The following SQL pattern can be used to convert a RefCursor query result set into a CSV format. This query can handle NULL in the data columns. The SQL input string should be based on the following format: SELECT Col AS name_x, Function() AS name_y, Analytical_function( ) AS name_z FROM ( ***ANYTHING*** ) You can [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to convert a RefCursor query result set into a CSV format. This query can handle NULL in the data columns. The SQL input string should be based on the following format: </p>
<p>SELECT  Col  AS  name_x,  Function()  AS  name_y,  Analytical_function( )  AS  name_z  FROM ( ***ANYTHING*** )  </p>
<p>You can change your own query into this required format by wrapping your SQL inside an inline view if needed. The &#8220;AS&#8221; keyword and column_name &#8220;alias&#8221; are required for building the XML tags.</p>
<pre>

CREATE TABLE PERSON
(ID            NUMBER,
 FIRSTNAME     VARCHAR2(20 BYTE),
 MIDDLENAME    VARCHAR2(20 BYTE),
 LASTNAME      VARCHAR2(20 BYTE),
 LOCATION_ID   NUMBER);

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (1, 'Frank', null, 'Zhou', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (2, 'Peter', 'B',  'Lee', 1);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (3, 'John' , 'C',   'Adam', 2);
INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME, LOCATION_ID)
VALUES (4, 'Dave' , null, 'Washington', 2);

CREATE TABLE LOCATION
(LOCATION_ID       NUMBER,
 LOCATION_NAME     VARCHAR2(20 BYTE)
 );

INSERT INTO LOCATION (LOCATION_ID, LOCATION_NAME)
VALUES (1, 'BOSTON');
INSERT INTO LOCATION (LOCATION_ID, LOCATION_NAME)
VALUES (2, 'NEW YORK');
COMMIT;

set long 10000;
variable sql_input varchar2(3000)
BEGIN
 :sql_input := q'[
      SELECT b.location_name AS location,
             COUNT (*) AS COUNT,
             LISTAGG (a.lastname, '__') WITHIN GROUP (ORDER BY a.id)
                AS lastname_stragg
        FROM person a, location b
       WHERE a.location_id = b.location_id
    GROUP BY ROLLUP (b.location_name)
      HAVING MAX (b.location_id) > 0
         ]';
END;
/

-----------------------------------------SQL QUERY------------------------------------------------------------

WITH SQL_QUERY AS
(SELECT UPPER(SUBSTR(sql_str, 0, REGEXP_INSTR(sql_str, ' FROM', 1,1,0, 'i'))) AS SELECT_STR,
              SUBSTR(sql_str, REGEXP_INSTR(sql_str, ' FROM', 1,1,0, 'i')) AS FROM_STR
 FROM
 (SELECT DBMS_XMLGEN.CONVERT( XMLQUERY('fn:substring(fn:normalize-space(str), 8) '
                              PASSING XMLELEMENT("str",  SQL_STR)
                              RETURNING CONTENT).GETSTRINGVAL(), 1) AS sql_str
  FROM (SELECT :sql_input as sql_str FROM dual )
 )
),
COL_NAMES AS
(SELECT SUBSTR(COL_NAME, 0, INSTR(COL_NAME, ' AS ')) AS VAL,  ROWNUM rn,
        SUBSTR(COL_NAME, INSTR(COL_NAME, ' AS ') + 4) AS ALIAS,  COUNT (*) OVER ()-1 AS CNT
 FROM SQL_QUERY, XMLTABLE('ora:tokenize(.,"#")'
                 PASSING  REGEXP_REPLACE (SELECT_STR, '([[:space:]]AS[[:space:]][^,]+)[[:space:]]?[,]?' , '\1#')
                 COLUMNS COL_NAME VARCHAR2 (100) PATH '.')
),
XML_QUERY AS
(SELECT 'SELECT 1, XMLELEMENT(ROW_DATA, '||LISTAGG(REPLACE(VAL, VAL, 'XMLELEMENT('||ALIAS||' , '||VAL||')'), ' , ')
                                            WITHIN GROUP (ORDER BY rn)||')' AS SELECT_STR, MAX(CNT) AS CNT,
          MAX((SELECT FROM_STR FROM SQL_QUERY)) AS FROM_AND_CONDITIONS_STR
  FROM  COL_NAMES
),
XML_DATA AS
(SELECT DBMS_XMLGEN.GETXMLTYPE(DBMS_XMLGEN.NEWCONTEXTFROMHIERARCHY(
                               SELECT_STR||' '||FROM_AND_CONDITIONS_STR)) AS XML_DOC, CNT
 FROM XML_QUERY
),
TAB_DATA AS
(SELECT str ||',' AS str, CEIL(ROWNUM/A.CNT) AS grp, ROWNUM AS RANK
 FROM XML_DATA A, XMLTABLE ('ROW_DATA/*'
                             PASSING A.XML_DOC
                             COLUMNS str VARCHAR2 (100) PATH '.')
),
CSV AS
(SELECT LISTAGG(str, '') WITHIN GROUP (ORDER BY RANK) AS str, MAX(RANK) AS RANK
 FROM TAB_DATA
 GROUP BY GRP
)
SELECT CSV_STR
FROM (SELECT LISTAGG(ALIAS, ',') WITHIN GROUP (ORDER BY rn) AS CSV_STR, 0 AS pos, TO_NUMBER (NULL) AS RANK
      FROM COL_NAMES
      UNION ALL
     SELECT SUBSTR (str, 0, LENGTH (str) - 1), 1, RANK FROM CSV)
ORDER BY pos, RANK;

CSV_STR
--------------------------------------------------------------------------------

LOCATION,COUNT,LASTNAME_STRAGG
BOSTON,2,Zhou__Lee
NEW YORK,2,Adam__Washington
,4,Zhou__Lee__Adam__Washington
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=uGmUfjKIxp8:pDKHHmKfVBU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=uGmUfjKIxp8:pDKHHmKfVBU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=uGmUfjKIxp8:pDKHHmKfVBU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=uGmUfjKIxp8:pDKHHmKfVBU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=uGmUfjKIxp8:pDKHHmKfVBU:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=uGmUfjKIxp8:pDKHHmKfVBU:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=uGmUfjKIxp8:pDKHHmKfVBU:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=uGmUfjKIxp8:pDKHHmKfVBU:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/uGmUfjKIxp8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/03/05/how-to-convert-a-refcursor-query-resultset-to-csv-format-in-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/03/05/how-to-convert-a-refcursor-query-resultset-to-csv-format-in-sql/</feedburner:origLink></item>
		<item>
		<title>How to transform a CSV file into HTML table in SQL</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/MZE60Z1fL0g/</link>
		<comments>http://oraqa.com/2012/02/27/how-to-transform-a-csv-file-into-html-table-in-sql/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 14:00:57 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=733</guid>
		<description><![CDATA[The following SQL pattern can be used to tranform the CSV file into a HTML table by utilizing the XQUERY functionality. create or replace directory tmp as '/tmp'; create a word.csv file. C:\tmp&#62;more word.csv ID,FIRSTNAME,MIDDLENAME,LASTNAME 1,Frank,,Zhou 2,Peter,B,Lee 3,John,C,Adam 4,Dave,,Washington CREATE TABLE CSV_FILE (csv_str VARCHAR2(3000)) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY tmp ACCESS PARAMETERS ( [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to tranform the CSV file into a HTML table by utilizing the XQUERY functionality.</p>
<pre>

create or replace directory tmp as '/tmp';

create a word.csv file.

C:\tmp&gt;more word.csv

ID,FIRSTNAME,MIDDLENAME,LASTNAME
1,Frank,,Zhou
2,Peter,B,Lee
3,John,C,Adam
4,Dave,,Washington

CREATE TABLE CSV_FILE (csv_str VARCHAR2(3000))
     ORGANIZATION EXTERNAL
     (
       TYPE ORACLE_LOADER
       DEFAULT DIRECTORY tmp
       ACCESS PARAMETERS
       (
         records delimited by newline
         fields terminated by whitespace
         missing field values are null
         ( csv_str )
       )
       LOCATION ('word.csv')
     )
     REJECT LIMIT UNLIMITED;

set long 10000;
variable col_name_input varchar2(300)
exec :col_name_input:='ID,FIRSTNAME,MIDDLENAME,LASTNAME'

-----------------------------------SQL QUERY-----------------------------------------

WITH TAB AS
(SELECT CSV_STR, ROWNUM AS ROW_RN, REGEXP_COUNT(:col_name_input, ',')+1 AS COL_NUM,
        UPPER(:col_name_input) AS col_name_input
 FROM CSV_FILE
),
COL_NAME AS
(SELECT REPLACE(COL_NAME, COL_NAME, '&lt;'||COL_NAME||'&gt;')  AS OPEN_TAG,
        REPLACE(COL_NAME, COL_NAME, '&lt;/'||COL_NAME||'&gt;') AS CLOSE_TAG,
        MOD(ROWNUM, COL_NUM) col_rn,  ROWNUM rn
 FROM TAB,  XMLTABLE ('ora:tokenize(.,",")'
                       PASSING  CSV_STR
                       COLUMNS "COL_NAME" VARCHAR2 (100) PATH '.')
 WHERE UPPER(CSV_STR) = col_name_input
),
CSV_DATA AS
(SELECT COL_DAT, MOD(ROWNUM, COL_NUM) AS  dat_rn, ROW_RN
 FROM TAB,  XMLTABLE ('ora:tokenize(.,",")'
                       PASSING  CSV_STR
                       COLUMNS COL_DAT VARCHAR2 (100) PATH '.')
 WHERE UPPER(CSV_STR) != col_name_input
),
XML_ROW AS
(SELECT REPLACE(LISTAGG(C.OPEN_TAG||D.COL_DAT||C.CLOSE_TAG,' ')
                WITHIN GROUP(ORDER BY C.rn ),' ') AS XML_DAT
 FROM CSV_DATA D,  COL_NAME  C
 WHERE C.col_rn = D.dat_rn
 GROUP BY D.ROW_RN
),
XML_DOC AS
(SELECT XMLAGG(XMLPARSE(DOCUMENT  '&lt;ROW_DATA&gt;'||XML_DAT||'&lt;/ROW_DATA&gt;') ) XML_STR
 FROM XML_ROW
)
SELECT XMLQuery(
  'for  $i  in   /ROWSET
   return  &lt;html&gt;&lt;body&gt;&lt;table border = "1" cellspacing = "0"&gt; &lt;tr&gt;
  {       for $n  in  $i/ROW_DATA[1]/*
          return &lt;th&gt; { $n/name( ) } &lt;/th&gt;
  } &lt;/tr&gt;
  {       for $j  in  $i/ROW_DATA
          return &lt;tr&gt;
          { for  $k  in  $j/*
              return &lt;td&gt; { data($k) } &lt;/td&gt;
          }
          &lt;/tr&gt;
  }
  &lt;/table&gt;&lt;/body&gt;&lt;/html&gt;'
 PASSING  XMLELEMENT("ROWSET", XML_STR)
 RETURNING  CONTENT).getCLOBVal()   AS HTML_TABLE_OUTPUT
 FROM (SELECT XML_STR FROM XML_DOC);
</pre>
<p>  HTML_TABLE_OUTPUT<br />
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<table border="1" cellspacing="0">
<tr>
<th>ID</th>
<th>FIRSTNAME</th>
<th>MIDDLENAME</th>
<th>LASTNAME</th>
</tr>
<tr>
<td>1</td>
<td>Frank</td>
<td></td>
<td>Zhou</td>
</tr>
<tr>
<td>2</td>
<td>Peter</td>
<td>B</td>
<td>Lee</td>
</tr>
<tr>
<td>3</td>
<td>John</td>
<td>C</td>
<td>Adam</td>
</tr>
<tr>
<td>4</td>
<td>Dave</td>
<td></td>
<td>Washington</td>
</tr>
</table>
<p></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=MZE60Z1fL0g:mulYjVbEZ8g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=MZE60Z1fL0g:mulYjVbEZ8g:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=MZE60Z1fL0g:mulYjVbEZ8g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=MZE60Z1fL0g:mulYjVbEZ8g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=MZE60Z1fL0g:mulYjVbEZ8g:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=MZE60Z1fL0g:mulYjVbEZ8g:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=MZE60Z1fL0g:mulYjVbEZ8g:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=MZE60Z1fL0g:mulYjVbEZ8g:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/MZE60Z1fL0g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/02/27/how-to-transform-a-csv-file-into-html-table-in-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/02/27/how-to-transform-a-csv-file-into-html-table-in-sql/</feedburner:origLink></item>
		<item>
		<title>How to transform a database table dataset into HTML table in SQL</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/Xqi8Pmqser8/</link>
		<comments>http://oraqa.com/2012/02/21/how-to-transform-a-database-table-dataset-into-html-table-in-sql/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:00:22 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=639</guid>
		<description><![CDATA[The following SQL pattern can be used to tranform the database table dataset into data in HTML table format by utilizing the XSLT functionality. The query also handles NULLs in the data columns. CREATE TABLE PERSON (ID NUMBER, FIRSTNAME VARCHAR2(20 BYTE), MIDDLENAME VARCHAR2(20 BYTE), LASTNAME VARCHAR2(20 BYTE) ); INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME) [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to tranform the database table dataset into data in HTML table format by utilizing the XSLT functionality. The query also handles NULLs in the data columns.</p>
<pre>
CREATE TABLE PERSON
(ID            NUMBER,
 FIRSTNAME     VARCHAR2(20 BYTE),
 MIDDLENAME    VARCHAR2(20 BYTE),
 LASTNAME      VARCHAR2(20 BYTE) );

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (1, 'Frank', null, 'Zhou');

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (2, 'Peter', 'B',  'Lee');

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (3, 'John' , 'C',   'Adam');

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (4, 'Dave' , null, 'Washington');
COMMIT; 

set long 10000;
variable tableName varchar2(30)
variable tableColumnName varchar2(300)
exec :tableName:='PERSON'
exec :tableColumnName:='ID,FIRSTNAME,MIDDLENAME,LASTNAME'

 -------------------------------------------SQL Query--------------------------------------------

 WITH Colum AS (SELECT UPPER (:tableColumnName) AS colum_input FROM DUAL),
     ColumnTab
     AS (    SELECT "COL_NAME", ROWNUM rn
               FROM Colum,
                    XMLTABLE ('ora:tokenize(.,",")'
                              PASSING Colum.colum_input
                              COLUMNS "COL_NAME" VARCHAR2 (100) PATH '.')),
     DATA
     AS (SELECT REPLACE (
                   column_name,
                   column_name,
                      'XMLELEMENT('
                   || column_name
                   || ' , '
                   || column_name
                   || ')')
                   column_name,
                table_name,
                rn
           FROM ALL_TAB_COLUMNS, ColumnTab
          WHERE     owner = USER
                AND table_name = UPPER (:tableName)
                AND column_name = COL_NAME),
     XML_QUERY
     AS (SELECT MAX (table_name) table_name,
                   ' SELECT LEVEL, XMLELEMENT (ROW_DATA ,'
                || LISTAGG (column_name, ' , ') WITHIN GROUP (ORDER BY rn)
                || ') FROM '
                   AS SQL_STR
           FROM DATA),
     XML_DATA
     AS (SELECT XMLELEMENT (
                   ROWSET,
                   DBMS_XMLGEN.getxmltype (
                      DBMS_XMLGEN.newcontextfromhierarchy (
                            SQL_STR
                         || ' '
                         || table_name
                         || ' CONNECT BY LEVEL&lt;2&#39;)))
                   AS XML_DOC
           FROM XML_QUERY)
SELECT XMLSERIALIZE (
          DOCUMENT XMLTRANSFORM (
                      (SELECT XML_DOC FROM XML_DATA),
                      XMLTYPE (
                         &#39;&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
 &lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
 &lt;xsl:output method=&quot;html&quot;/&gt;
 &lt;xsl:template match=&quot;/&quot;&gt;
        &lt;html&gt;&lt;body&gt;&lt;xsl:apply-templates/&gt; &lt;/body&gt;&lt;/html&gt;
 &lt;/xsl:template&gt;
 &lt;xsl:template match=&quot;ROWSET&quot;&gt;
 &lt;table border = &quot;1&quot; cellspacing = &quot;0&quot;&gt; &lt;tr&gt; &lt;xsl:apply-templates select =&quot;ROW_DATA[1]/*&quot; mode =&quot;Col_Name&quot;/&gt; &lt;/tr&gt;
 &lt;xsl:apply-templates/&gt; &lt;/table&gt;
 &lt;/xsl:template&gt;
 &lt;xsl:template match=&quot;ROW_DATA&quot;&gt;
         &lt;tr&gt;&lt;xsl:apply-templates/&gt; &lt;/tr&gt;
 &lt;/xsl:template&gt;
 &lt;xsl:template match=&quot;ROW_DATA/*&quot;&gt;
         &lt;td&gt;&lt;xsl:apply-templates/&gt; &lt;/td&gt;
 &lt;/xsl:template&gt;
 &lt;xsl:template match=&quot;ROW_DATA/*&quot;  mode = &quot;Col_Name&quot;&gt;
         &lt;th&gt;&lt;xsl:value-of select =&quot;name(.)&quot;/&gt; &lt;/th&gt;
 &lt;/xsl:template&gt;
 &lt;/xsl:stylesheet&gt;&#39;)))
          AS HTML_TABL_DATA
  FROM DUAL;
</pre>
<p>HTML_TABL_DATA<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<table border="1" cellspacing="0">
<tr>
<th>ID</th>
<th>FIRSTNAME</th>
<th>MIDDLENAME</th>
<th>LASTNAME</th>
</tr>
<tr>
<td>1</td>
<td>Frank</td>
<td></td>
<td>Zhou</td>
</tr>
<tr>
<td>2</td>
<td>Peter</td>
<td>B</td>
<td>Lee</td>
</tr>
<tr>
<td>3</td>
<td>John</td>
<td>C</td>
<td>Adam</td>
</tr>
<tr>
<td>4</td>
<td>Dave</td>
<td></td>
<td>Washington</td>
</tr>
</table>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=Xqi8Pmqser8:y8AFstzlFek:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=Xqi8Pmqser8:y8AFstzlFek:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=Xqi8Pmqser8:y8AFstzlFek:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=Xqi8Pmqser8:y8AFstzlFek:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=Xqi8Pmqser8:y8AFstzlFek:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=Xqi8Pmqser8:y8AFstzlFek:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=Xqi8Pmqser8:y8AFstzlFek:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=Xqi8Pmqser8:y8AFstzlFek:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/Xqi8Pmqser8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/02/21/how-to-transform-a-database-table-dataset-into-html-table-in-sql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/02/21/how-to-transform-a-database-table-dataset-into-html-table-in-sql/</feedburner:origLink></item>
		<item>
		<title>How to convert a table dataset to CSV format in SQL</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/LtdMzIuJ2vs/</link>
		<comments>http://oraqa.com/2012/02/20/how-to-convert-a-table-dataset-to-csv-format-in-sql/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 14:00:56 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=685</guid>
		<description><![CDATA[The following SQL pattern can be used to convert the database dataset into CSV format. The query can also handle NULLs in the data columns. CREATE TABLE PERSON (ID NUMBER, FIRSTNAME VARCHAR2(20 BYTE), MIDDLENAME VARCHAR2(20 BYTE), LASTNAME VARCHAR2(20 BYTE) ); INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME) VALUES (1, 'Frank', null, 'Zhou'); INSERT INTO PERSON [...]]]></description>
			<content:encoded><![CDATA[<p>The following SQL pattern can be used to convert the database dataset into CSV format. The query can also handle NULLs in the data columns.</p>
<pre>
CREATE TABLE PERSON
(ID            NUMBER,
 FIRSTNAME     VARCHAR2(20 BYTE),
 MIDDLENAME    VARCHAR2(20 BYTE),
 LASTNAME      VARCHAR2(20 BYTE)
 );

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (1, 'Frank', null, 'Zhou');

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (2, 'Peter', 'B',  'Lee');

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (3, 'John' , 'C',   'Adam');

INSERT INTO PERSON (ID, FIRSTNAME, MIDDLENAME, LASTNAME)
VALUES (4, 'Dave' , null, 'Washington');

COMMIT; 

set long 10000;
variable tableName varchar2(30)
variable tableColumnName varchar2(300)
exec :tableName:='PERSON'
exec :tableColumnName:='ID,FIRSTNAME,MIDDLENAME,LASTNAME'

------------------------------------------------SQL Query---------------------------------------------  

WITH Colum AS (SELECT UPPER (:tableColumnName) AS colum_input FROM DUAL),
     ColumnTab
     AS (    SELECT "COL_NAME", ROWNUM rn
               FROM Colum,
                    XMLTABLE ('ora:tokenize(.,",")'
                              PASSING Colum.colum_input
                              COLUMNS "COL_NAME" VARCHAR2 (100) PATH '.')),
     DATA
     AS (SELECT table_name,
                rn,
                COUNT (*) OVER () AS CNT,
                REPLACE (
                   column_name,
                   column_name,
                      'XMLELEMENT('
                   || column_name
                   || ' , '
                   || column_name
                   || ')')
                   column_name
           FROM ALL_TAB_COLUMNS, ColumnTab
          WHERE     owner = USER
                AND table_name = UPPER (:tableName)
                AND column_name = COL_NAME),
     XML_QUERY
     AS (SELECT MAX (table_name) AS table_name,
                MAX (CNT) AS CNT,
                   ' SELECT LEVEL, XMLELEMENT(ROW_DATA ,'
                || LISTAGG (column_name, ' , ') WITHIN GROUP (ORDER BY rn)
                || ') FROM '
                   AS SQL_STR
           FROM DATA),
     XML_DATA
     AS (SELECT CNT,
                DBMS_XMLGEN.getxmltype (
                   DBMS_XMLGEN.newcontextfromhierarchy (
                      SQL_STR || ' ' || table_name || '  CONNECT BY LEVEL <2'))
                   AS XML_DOC
           FROM XML_QUERY),
     TAB_DATA
     AS (SELECT str || ',' AS str, CEIL (ROWNUM / A.CNT) grp, ROWNUM AS RANK
           FROM XML_DATA A,
                XMLTABLE ('ROW_DATA/*'
                          PASSING A.XML_DOC
                          COLUMNS str VARCHAR2 (100) PATH '.')),
     CSV
     AS (  SELECT LISTAGG (str, '') WITHIN GROUP (ORDER BY RANK) str,
                  MAX (RANK) AS RANK
             FROM TAB_DATA
         GROUP BY GRP)
  SELECT CSV_STR
    FROM (SELECT colum_input AS CSV_STR, 0 AS pos, TO_NUMBER (NULL) AS RANK
            FROM Colum
          UNION ALL
          SELECT SUBSTR (str, 0, LENGTH (str) - 1), 1, RANK FROM CSV)
ORDER BY pos, RANK;

CSV_STR
--------------------------------------------------------------------------------
ID,FIRSTNAME,MIDDLENAME,LASTNAME
1,Frank,,Zhou
2,Peter,B,Lee
3,John,C,Adam
4,Dave,,Washington
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=LtdMzIuJ2vs:OnvdWSZa4Io:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=LtdMzIuJ2vs:OnvdWSZa4Io:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=LtdMzIuJ2vs:OnvdWSZa4Io:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=LtdMzIuJ2vs:OnvdWSZa4Io:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=LtdMzIuJ2vs:OnvdWSZa4Io:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=LtdMzIuJ2vs:OnvdWSZa4Io:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=LtdMzIuJ2vs:OnvdWSZa4Io:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=LtdMzIuJ2vs:OnvdWSZa4Io:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/LtdMzIuJ2vs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2012/02/20/how-to-convert-a-table-dataset-to-csv-format-in-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2012/02/20/how-to-convert-a-table-dataset-to-csv-format-in-sql/</feedburner:origLink></item>
		<item>
		<title>How to select from an alternative table when the table in the From Clause doesn’t exist in the database</title>
		<link>http://feedproxy.google.com/~r/OraQA/~3/6Gs_tTmVXr0/</link>
		<comments>http://oraqa.com/2010/12/08/how-to-select-from-an-alternative-table-when-the-table-in-the-from-clause-doesnt-exist-in-the-database/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 04:07:45 +0000</pubDate>
		<dc:creator>Frank Zhou</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oraqa.com/?p=630</guid>
		<description><![CDATA[The following is an interesting problem posted on an internet website: select a.id, b.str from TARGET_TAB a, lookup_tab b WHERE a.id = b.id If &#8220;TARGET_TAB&#8221; Table doesn&#8217;t exist in the database, then the alternative table &#8220;ALTERNATIVE_TAB&#8221; should be used instead. select a.id, b.str from ALTERNATIVE_TAB a, lookup_tab b WHERE a.id = b.id Requirement : Solve [...]]]></description>
			<content:encoded><![CDATA[<p>The following is an interesting problem posted on an internet website:</p>
<p>select a.id, b.str<br />
from TARGET_TAB a, lookup_tab b WHERE a.id = b.id</p>
<p>If &#8220;TARGET_TAB&#8221; Table doesn&#8217;t exist in the database, then the alternative table &#8220;ALTERNATIVE_TAB&#8221; should be used instead.</p>
<p>select a.id, b.str<br />
from ALTERNATIVE_TAB a, lookup_tab b WHERE  a.id = b.id</p>
<p>Requirement : Solve this problem by using a single sql query.</p>
<p>create table TARGET_TAB      as select level as id  from dual connect by level &lt;4;<br />
create table ALTERNATIVE_TAB as select level as id  from dual connect by level &lt;6;<br />
create table lookup_tab      as select level as id, chr(64+level) str from dual connect by level &lt;6;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-SQL Solution&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<pre>
WITH XML AS
(SELECT dbms_xmlgen.getxml('SELECT id FROM '||table_name) xml_clob
 FROM user_tables
 WHERE table_name IN
    (SELECT 'TARGET_TAB' FROM dual
      UNION ALL
      SELECT 'ALTERNATIVE_TAB' FROM dual
      WHERE NOT EXISTS (SELECT NULL FROM user_tables WHERE table_name = 'TARGET_TAB')
     )
 ),
 DATA AS
( SELECT ID
  FROM   XML,  XMLTable('ROWSET/ROW'
                         PASSING XMLTYPE(XML.xml_clob)
                         COLUMNS
                         ID NUMBER PATH 'ID')
 )
 SELECT a.ID, str
 FROM DATA a, lookup_tab b
 WHERE a.ID = b.id;

        ID S
---------- -
         1 A
         2 B
         3 C     

drop table target_tab;

Run the same SQL again.

        ID S
---------- -
         1 A
         2 B
         3 C
         4 D
         5 E
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OraQA?a=6Gs_tTmVXr0:Aza6_l90FH0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=6Gs_tTmVXr0:Aza6_l90FH0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/OraQA?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=6Gs_tTmVXr0:Aza6_l90FH0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/OraQA?i=6Gs_tTmVXr0:Aza6_l90FH0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=6Gs_tTmVXr0:Aza6_l90FH0:ACf-c_HutVc"><img src="http://feeds.feedburner.com/~ff/OraQA?d=ACf-c_HutVc" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=6Gs_tTmVXr0:Aza6_l90FH0:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/OraQA?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OraQA?a=6Gs_tTmVXr0:Aza6_l90FH0:guobEISWfyQ"><img src="http://feeds.feedburner.com/~ff/OraQA?i=6Gs_tTmVXr0:Aza6_l90FH0:guobEISWfyQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OraQA/~4/6Gs_tTmVXr0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oraqa.com/2010/12/08/how-to-select-from-an-alternative-table-when-the-table-in-the-from-clause-doesnt-exist-in-the-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oraqa.com/2010/12/08/how-to-select-from-an-alternative-table-when-the-table-in-the-from-clause-doesnt-exist-in-the-database/</feedburner:origLink></item>
	</channel>
</rss>

