Select XML with XMLFOREST into CLOB
Hi,
i am trying to select a XMLFOREST expression into a table with a clob column using oracle 10.2.0.4.0.
The query "select xmlforest(e.last_name) from employees e where e.employee_id = 100" returns <LAST_NAME>King</LAST_NAME>. The result is returned as a clob, but i get an error (ora-06550 inconsistent datatypes) if i try to select the query result into a clob.
So i wrote this code fragment to insert the result:
DECLARE
cl CLOB := NULL;
chCTX DBMS_XMLGEN.CTXHANDLE;
BEGIN
chCTX := dbms_xmlgen.newContext ('SELECT XMLFOREST(e.last_name) FROM employees e WHERE e.employee_id = 100');
dbms_xmlgen.getxml(chCTX,cl );
INSERT INTO TEMP_XML_CLOB(XML_CLOB)VALUES(cl);
COMMIT;
END;The plsql block is executed without an error but and inserts a row in the table, but the clob contains no data. So please give me advice how to store the result set in a clob in a proper way.
Thanks in advance
Matthias
Do you really need to store it as a CLOB? Oracle provides an XMLTYPE for storing XML which is far better.
Try using XMLTYPE and something like:
DECLARE
xml XMLTYPE;
BEGIN
SELECT XMLFOREST(e.last_name)
INTO xml
FROM employees e
WHERE e.employee_id = 100;
INSERT INTO TEMP_XML(XML) VALUES (xml);
COMMIT;
END;(untested)
Obviously you'll want to expand on the SELECT statement to ensure you get all the tags you want and your table will need changing too to cater for XMLTYPE.
I won't ask why you've got a table called "TEMP...", you must know that's just wrong in so many ways.
Similar Messages
-
Can I store RTF file with image into CLOB?
I have created a WORD template document with company logo heading and format. I have to replace the 'user name', 'date' etc. data every time before I insert into my database. Therefore I store the template doc as RTF format.
1. Can I insert this doc (RTF with image) into CLOB or I have to store it in BLOB?
2. I want to store in CLOB because I sometimes have to change to content of the doc with replace statement. Actually, can I replace a string in BLOB too?I understand RTF is a binary format and so needs to be stored as a BLOB.
The DBMS_LOB paackage contains procedures like INSTR() and WRITE() that may do what you what. Take them for a test drive.
Cheers, APC -
Hi all,
I am trying to use UTL_FILE.PUT_LINE to output an XML file. This xml file is the result of a select query. Hence converting the result of the select query into xml format using dbms_xmlgen.getxml and storing it in a variable. But the resultant xml data > 32k . What would be the best way to store it in variable? When using CLOB datatype, getting a numeric value error.
Thanks in advance.As you didn't post the code, nor included a four digit database version, you are asking someone to look in a crystal ball.
Sorry, they are out for repair.
Also the XDB forum would be more appropriate.
Sybrand Bakker
Senior Oracle DBA -
XML into CLOB, corrupt text (Cyrillic charset, utf-8)
Hello, everyone!
We use Oracle ESB 10.1.3.5. We have problem with encoding/decoding(?) Cyrillic charset when putting xml-formatted data into CLOB. Here some details:
The FTP-adapter reads an XML-file (UTF-8) and transfers to RS-service. RS-service invokes the DB-adapter, which calls stored procedure in Oracle DB 10.2.0.4.(NLS_CHARACTERSET:CL8MSWIN1251) Procedure has one input parameter with type CLOB. Procedure does an insert into the table with a column of type CLOB. We wish to receive entire XML from initial file in a corresponding field of the table.
It works, except corrupted Cyrillic characters (mostly replaced with "?" symbols).
From ESB log we can see that db-adapter receive uncorrupted payload. We test to upload xml-file without ESB, using the same stored procedure, and the characters were introduced correctly.
Maybe someone faced with something like that, or have a thoughts, to solve this problem. Please help!Hi,
I've got solution from support:
1)Add parameter -Dfile.encoding=UTF-8 in opmn.xml in the ESB container in JVM options:<process-type id="oc4j_soa" module-id="OC4J" status="enabled"> <module-data> <category id="start-parameters"> <data id="java-options" ... -Dfile.encoding=UTF-8"/> ...{quote}
2)opmnctl stopall;
3)opmnctl startall.
Thank You All. -
Insert XMLTYPE data into CLOB column
Hi,
I am trying to insert XMLTYPE datatype column value into the CLOB datatype column.
I get an error -
ORA - 00932: Inconsistent datatypes: expected CLOB got -
How do I insert xml type data into clob?
Thanks!Here is my sql code:
I have a view :
create or replace view test_view
(id,
code,
desc)
as select
id,
code,
xmlroot(xmlelement("empname", ename), version '1.0') as desc
from employee;
I have a table emp_details_table. The columns in the emp_details_table are
ID number,
CODE varchar2,
EMP_DETAILS CLOB
I am tring to insert the 'test_view' data into the 'emp_details_table' and I get an error cannot insert xmltype data into clob.
insert into emp_details_table
(ID , CODE, EMP_DETAILS)
select
(ID, CODE, DESC) from test_view;
Thanks. -
How to retrive data from selected checkboxes with fieldnames
hi experts,
how to retrive data from selected checkboxes with fieldnames into another alv grid report.(here the fieldnames selected from table names is dynamically).
thankx in advance
rani.k.Hi,
Use user_command in the alv grid and then
do the follwoing code
FORM user_command1 USING lv_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
Declaration of local Variables
DATA : lv_ref1 TYPE REF TO cl_gui_alv_grid.
DATA lv_cnt TYPE i. "+INS SUHESH 12.07.2008
Check function code
CASE lv_ucomm.
WHEN 'ONLI'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lv_ref1.
CALL METHOD lv_ref1->check_changed_data.
now loop ur final internal table where check = 'X'.
now pass data to other internal table..Now the internal table will be having values that the user selcetd on the screen.
Hope this helps.
Regards,
Nagaraj -
Extract part of xml into CLOB or XMLType
I need to extract part of XML into CLOB or some another type. But I don't need only extract data, by whole part od xml with elements. How could I do it in PL/SQL?
For example from this xml:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
I need to get:
"<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>"
THXThat's why I need to process every book alone - to know which authors belongs to single book.For that specific requirement, a single query would do.
Assuming variable "v_xml_clob" holds the XML document :
<bookstore>
<name>nameOfBookstore</name>
<address>1st Avenue 24, SF</address>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>
<name>Giada De Laurentiis</name>
<birth>1956</birth>
</author>
<author>
<name>xxx</name>
<birth>1955</birth>
</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>
<name>Rowning</name>
<birth>1977</birth>
</author>
<author>
<name>xxx</name>
<birth>1955</birth>
</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>You can do :
SELECT *
FROM XMLTable(
'for $i in distinct-values($d//book/author/name)
where count($d//book/author[name=$i]) = 1
return $i'
passing xmltype(v_xml_clob) as "d"
columns author_name varchar2(80) path '.'
AUTHOR_NAME
Rowning
Giada De Laurentiis -
hi all
i want to write a select statment in a procedure with out into statement ..
is it possilbe if yes how can i do this.
if its not possible then if we have to Return a number of rows from procedure then how can i do this..
thanks in advanceUser1728 wrote:
actual i want to return a datatable type data from procedureWhat does "datatable type" mean? "Datatable" is not a type in PL/SQL, so I assume that it has some meaning in your client programming language. What Oracle data type are you trying to return?
My guess would be that you are trying to return a REF CURSOR so that you want something like
SQL> create procedure return_rc( p_rc OUT sys_refcursor )
2 as
3 begin
4 open p_rc for select * from emp;
5 end;
6 /
Procedure created.
SQL> variable rc ref cursor;
Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
BINARY_FLOAT | BINARY_DOUBLE ] ]
SQL> variable rc refcursor;
SQL> exec return_rc( :rc );
PL/SQL procedure successfully completed.
SQL> print rc
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7369 SMITH CLERK 7902 17-DEC-80 800
20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300
30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7566 JONES MANAGER 7839 02-APR-81 2975
20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400
30
<<more data snipped>>Justin -
Insert into CLOB fails with Oracle ODBC driver version 9.02.00.65
I tried to insert into CLOB using the latest Oracle ODBC driver 9.02.00.65 and it fails. But the same works with earlier versions of ODBC driver earlier to 9.02.00.65 ie., 9.02.00.63.
Here is the code snippet I tried. Any help now is highly appreciated as I am in the crunch time.
I tried the same code snippet with VARCHAR2 column with the same driver and it works.
** CONVDSN.C - This is the ODBC sample code for
** creating File DSN pointers to machine DSNs.
**This code is furnished on an as-is basis as part of the ODBC SDK and is
**intended for example purposes only.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcinst.h>
#include <sqltypes.h>
#define MAXDATALEN 25 //maximum data length per column
#define MAX_COL 15 //maximum column in result set
#define MAX_ROW 100 //maximum number of rows
#define MAXBUFLEN 256
#define SQLERR_FORMAT "SQL Error State:%s, Native Error Code: %lX, ODBC Error: %s"
#define MAXDISPLAYSIZE MAX_COL*(MAXDATALEN+1)
#define SQLWRNMSGTITLE "SQL_SUCCESS_WITH_INFO results"
#define SQLERRCNTDTITLE "SQL_ERROR results continued"
#define SQLWRNMSGTITLE "SQL_SUCCESS_WITH_INFO results"
#define SQLWRNCNTDTITLE "SQL_SUCCESS_WITH_INFO results continued"
#define NULLDATASTRING "SQL_NULL_DATA"
#define SQLERRMSGTITLE "SQL_ERROR results"
// prototypes
void ExpandFileName(LPSTR szFileDSNName, LPCSTR szDSNName);
void MakeLegalName(LPSTR szLegalDSNName, LPCSTR szDSNName);
// main routine: Iterate through the user and system DSNs, creating a pointer
// to each.
void FAR PASCAL DisplayError(SQLRETURN nResult, HWND hWnd, SWORD fHandleType, SQLHANDLE handle);
void insertSelectClob();
void checkRcCode(RETCODE rc);
int main (int argc, char* argv[])
insertSelectClob();
return 0;
void FAR PASCAL DisplayError(SQLRETURN nResult, HWND hWnd, SWORD fHandleType, SQLHANDLE handle)
UCHAR szErrState[SQL_SQLSTATE_SIZE+1]; // SQL Error State string
UCHAR szErrText[SQL_MAX_MESSAGE_LENGTH+1]; // SQL Error Text string
char szBuffer[SQL_SQLSTATE_SIZE+SQL_MAX_MESSAGE_LENGTH+MAXBUFLEN+1];
// formatted Error text Buffer
SWORD wErrMsgLen; // Error message length
UDWORD dwErrCode; // Native Error code
int iSize; // Display Error Text size
SQLRETURN nErrResult; // Return Code from SQLGetDiagRec
SWORD sMsgNum = 1;
SWORD fFirstRun = TRUE;
char szDispBuffer[MAXDISPLAYSIZE+1]; // Display Buffer
szBuffer[0] = '\0';
do
// continue to bring messageboxes till all errors are displayed.
// more than one message box may be reqd. as err text has fixed
// string size.
// initialize display buffer with the string in error text buffer
strcpy(szDispBuffer, szBuffer);
// call SQLGetDiagRec function with proper ODBC handles, repeatedly until
// function returns SQL_NO_DATA. Concatenate all error strings
// in the display buffer and display all results.
while ((nErrResult = SQLGetDiagRec(fHandleType, handle, sMsgNum++,
szErrState, &dwErrCode, szErrText,
SQL_MAX_MESSAGE_LENGTH-1, &wErrMsgLen)) != SQL_NO_DATA)
if(nErrResult == SQL_ERROR || nErrResult == SQL_INVALID_HANDLE)
break;
wsprintf(szBuffer, SQLERR_FORMAT, (LPSTR)szErrState, dwErrCode, (LPSTR)szErrText);
iSize = strlen(szDispBuffer);
if (iSize && (iSize+strlen(szBuffer)+1) >= MAXDISPLAYSIZE)
break;
if (iSize)
strcat(szDispBuffer, "\n");
strcat(szDispBuffer, szBuffer);
// display proper ERROR or WARNING message with proper title
if (nResult == SQL_SUCCESS_WITH_INFO)
MessageBox(hWnd, szDispBuffer, (fFirstRun? SQLWRNMSGTITLE : SQLWRNCNTDTITLE),
MB_OK | MB_ICONINFORMATION);
else
MessageBox(hWnd, szDispBuffer, (fFirstRun? SQLERRMSGTITLE : SQLERRCNTDTITLE),
MB_OK | MB_ICONEXCLAMATION);
if (fFirstRun)
fFirstRun = FALSE;
while (!(nErrResult == SQL_NO_DATA || nErrResult == SQL_ERROR || nErrResult == SQL_INVALID_HANDLE));
void insertSelectClob()
SQLCHAR clobdata[1001];
SQLCHAR resultdata[1001];
SQLINTEGER ind = SQL_DATA_AT_EXEC;
SQLCHAR *bufp;
SQLINTEGER cbOrderID = sizeof(SQLSMALLINT);
SQLSMALLINT sTmp=13;
SQLCHAR *sqlStmt1 = _T("INSERT INTO clobtbl(id, clob1) VALUES(?, ?)");
SQLCHAR *sqlStmt2 = _T("SELECT id, clob1 FROM clobtbl");
// SQLCHAR *sqlStmt1 = _T("INSERT INTO testInsert(id, clob1) VALUES(?, ?)");
// SQLCHAR *sqlStmt2 = _T("SELECT id, clob1 FROM testInsert");
int clobdatalen, chunksize, dtsize, retchklen;
HENV envHnd;
HDBC conHnd;
HSTMT stmtHnd;
RETCODE rc;
int nRowcnt=0;
SQLPOINTER pToken = NULL;
rc = SQL_SUCCESS;
// ENV is allocated
rc = SQLAllocEnv(&envHnd);
// Connection Handle is allocated
rc = SQLAllocConnect(envHnd, &conHnd);
rc = SQLConnect(conHnd, T("testd734"), SQLNTS, T("ipathdba"), SQLNTS, T("ipathdba"), SQLNTS);
printf(_T("Insert CLOB1 using SQLPutData...\n[%s]\n"), sqlStmt1);
// Set CLOB Data
int i;
SQLCHAR ch;
for (i=0, ch=_T('A'); i< sizeof(clobdata)/sizeof(SQLCHAR); ++i, ++ch)
if (ch > _T('Z'))
ch = _T('A');
clobdata[i] = ch;
clobdata[sizeof(clobdata)/sizeof(SQLCHAR)-1] = _T('\0');
clobdatalen = lstrlen(clobdata); // length of characters
chunksize = clobdatalen / 7; // 7 times to put
rc = SQLAllocHandle(SQL_HANDLE_STMT, conHnd, &stmtHnd);
// Step 1: Prepare
rc = SQLPrepare(stmtHnd, sqlStmt1, SQL_NTS);
// checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 2: Bind Parameter with SQL_DATA_AT_EXEC
rc = SQLBindParameter(stmtHnd,
1,
SQL_PARAM_INPUT,
SQL_C_SSHORT,
SQL_INTEGER,
0,
0,
&sTmp,
0,
&cbOrderID);
rc = SQLBindParameter(stmtHnd,
2,
SQL_PARAM_INPUT,
SQL_C_CHAR,
SQL_LONGVARCHAR,
clobdatalen*sizeof(CHAR),
0,
(SQLPOINTER)clobdata,
clobdatalen*sizeof(CHAR),
&ind);
// checkSQLErr(envHnd, conHnd, stmtHnd, rc);
// Step 3: Execute
rc = SQLExecute(stmtHnd);
while (rc == SQL_NEED_DATA) {
rc = SQLParamData(stmtHnd, &pToken);
if (rc == SQL_NEED_DATA) {
for (dtsize=0, bufp = clobdata;
dtsize < clobdatalen;
dtsize += chunksize, bufp += chunksize)
int len;
if (dtsize+chunksize < clobdatalen)
len = chunksize;
rc = SQLPutData(stmtHnd, bufp, len*sizeof(SQLCHAR));
else
len = clobdatalen-dtsize;
rc = SQLPutData(stmtHnd, bufp, SQL_NTS);
rc = SQLParamData(stmtHnd, &pToken);
// Fails as row count retrieved is zero.
rc = SQLRowCount(stmtHnd, &nRowcnt);
if(rc != SQL_SUCCESS)
DisplayError(rc, NULL, SQL_HANDLE_ENV, conHnd);
rc = SQLFreeStmt(stmtHnd, SQL_CLOSE);
printf(_T("Finished Update\n\n"));
rc = SQLAllocStmt(conHnd, &stmtHnd);
if (rc != SQL_SUCCESS)
printf(_T("Failed to allocate STMT\n"));
exit(-1);
// Clear Result Data
memset(resultdata, 0, sizeof(resultdata));
chunksize = clobdatalen / 15; // 15 times to gut
rc = SQLExecDirect(stmtHnd, sqlStmt2, SQL_NTS); // select
if(rc != SQL_SUCCESS)
DisplayError(rc, NULL, SQL_HANDLE_ENV, conHnd);
// Step 2: Fetch
rc = SQLFetch(stmtHnd);
for(dtsize=0, bufp = resultdata;
dtsize > sizeof(resultdata)/sizeof(CHAR) && rc != SQL_NO_DATA;
dtsize += chunksize-1, bufp += chunksize-1)
int len; // len should contain the space for NULL termination
if (dtsize+chunksize<sizeof(resultdata)/sizeof(CHAR))
len = chunksize;
else
len = sizeof(resultdata)/sizeof(CHAR)-dtsize;
// Step 3: GetData
rc = SQLGetData(stmtHnd,
2,
SQL_C_CHAR,
(SQLPOINTER)bufp,
len*sizeof(CHAR),
&retchklen);
if (!_tcscmp(resultdata, clobdata))
printf(_T("Succeeded!!\n\n"));
else
printf(_T("Failed!!\n\n"));
if (conHnd)
SQLFreeConnect(conHnd);
if (envHnd)
SQLFreeEnv(envHnd);
}Hi,
Since 9.2 has been desupported for error correction you will not be able to download that version from OTN. You should ask whoever is providing the training if their is an alternate version you can use. The only versions that you will be able to download from oracle.com is 10.2 11.1, and 11.2. -
Oracle SQL - Extracting clob value from XML with repeating nodes
Hi All,
I am attempting to run SQL on a table (called test_xml with a column xml_data [data type xmltype]). The column contains xml with repeating nodes (description). The following statement runs successfully when the node contains data of a non clob size:
SELECT
extractvalue (Value (wl), '*/description')
FROM test_xml
, TABLE (xmlsequence (extract (xml_data, '*/record'))) wl
but fails when description node contains a lot of data:
ORA-01706: user function result value was too large
I amended my query:
SELECT
extractvalue(Value (wl), '*/description').getClobVal()
FROM test_xml
, TABLE (xmlsequence (extract (xml_data, '*/record'))) wl
but this fails with:
ORA-22806: not an object or REF
Thanks in AdvanceHi Greg,
11.2.0.2.0 (Although I will need to do this on my work instance also which is 10.2.0.4)That's gonna be a problem...
Direct CLOB projection is supported starting with 11.2.0.2, using XMLTable or XMLCast/XQuery functions (extractvalue, extract, xmlsequence are deprecated now) :
SELECT x.*
FROM test_xml t
, XMLTable(
'/*/record'
passing t.xml_data
columns
description clob path 'description'
) x
;On prior versions, implicit conversions will occur to VARCHAR2 datatype, hence the limitation observed.
AFAIK you have two options on 10.2.0.4 :
1) Using Object-Relational storage, with the xdb:SQLType="CLOB" annotation.
2) Using the following trick :
SELECT dbms_xmlgen.convert(x.description.getClobVal(), 1) as description
FROM test_xml t
, XMLTable(
'/*/record'
passing t.xml_data
columns
description xmltype path 'description/text()'
) x
; -
Select LONG column into CLOB variable
Hi all,
I am trying retrieve the data present in a LONG column into a CLOB variable.
However I am getting an error, pls let me know how I can resolve it.
DECLARE
v_text CLOB;
BEGIN
SELECT TO_LOB(trigger_body)
INTO v_text
FROM
user_triggers
WHERE
ROWNUM <= 1;
END;
ERROR at line 8:
ORA-06550: line 8, column 20:
PL/SQL: ORA-00932: inconsistent datatypes: expected NUMBER got LONG
ORA-06550: line 8, column 5:
PL/SQL: SQL Statement ignored
Let me know if there is an alternate to this. I would like to get the data present in the LONG column into a variable.
The reason why I am not retrieving the LONG column into LONG variable is stated below (from Oracle Website):
You can insert any LONG value into a LONG database column because the maximum width of a LONG column is 2**31 bytes.
However, you cannot retrieve a value longer than 32760 bytes from a LONG column into a LONG variable.
Thanks and Regards,
SomuThere are couple of things I did (listed in order):
1) Create Global Temporary Table containing a CLOB column
2) Select LONG column and convert to CLOB by using TO_LOB and insert into Global Temporary Table containing a CLOB column
2) Select from this Global Temporary Table (which already contains data in CLOB) and assign it to a CLOB variable.
This is done because you can not directly use TO_LOB in a select statement to assign the value to a CLOB variable.
Stated below is an example:
-- Create Temporary Table
CREATE GLOBAL TEMPORARY TABLE glb_tmp_table_lob(
time TIMESTAMP WITH LOCAL TIME ZONE,
text CLOB
ON COMMIT DELETE ROWS;
-- PL/SQL Block to Execute
DECLARE
v_clob CLOB;
BEGIN
-- Insert into Temporary Table by converting LONG into CLOB
INSERT INTO glb_tmp_table_lob (
time ,
text
SELECT
sysdate ,
TO_LOB(dv.text)
FROM
dba_views dv
WHERE
ROWNUM <= 1
-- Select from the Temporary table into the variable
SELECT
gt.text
INTO
v_clob
FROM
glb_tmp_table_lob gt;
COMMIT;
-- Now you can use the CLOB variable as per your needs.
END;
/ -
How to insert into table from a xml with XDE for java?
want to insert into the oracle tables from the xml with XDE for java, some sample better. thank you.
XML Document may be stored in a SQL database with XML SQL Utility.
http://download-west.oracle.com/docs/cd/B13789_01/appdev.101/b10794/adx08xsu.htm#i1008168
XML Document may be stored in a SQL database with Oracle XML DB.
http://download-west.oracle.com/docs/cd/B13789_01/appdev.101/b10790/xdb03usg.htm#CEGFECFH -
Hi all, I could use some help (using version CS5.5).
I want to import (via Javascript) an XML file similar to this:
<movieRoot>
<dvds>
<movie>
<title>2001: A Space Odyssey</title>
<edition>Special Edition</edition>
<features>NOTHING</features>
<notes/>
</movie>
<movie>
<title>Airplane!</title>
<edition />
<features>Extra Laughs</features>
<notes/>
</movie>
</dvds>
</movieRoot>
I've been able to successfully do this, so no problem there.
Then I want to dump the child elements under the XML element "<dvds>" into a single text frame that spans 2 columns per page. That's easy enough too, except:
1) I want to filter the data so that empty elements or whose contents equal "NOTHING" do not appear.
2) I want to add static text title above some of the elements that remain (outside the XML proper).
3) Then I want to format the text (using Paragraph Styles).
Tall order, I know, but I'm keen on figuring it out. I initially created a document using placeholders and used the standard XML Import to populate it with data, which was filtered using scripts to remove extraneous placeholders and static text. It gave me the result I wanted, but as the XML will be regularly updated and since the "filtered" tags result in non-standard XML entries, it means starting over from scratch after every XML update. So I turned to scripting...
For point #1, I was able to filter properly using a recursive IF statement, tested here using message alerts:
I've included a bunch of variables for (hopefully) easier viewing.
var myXMLRoot = myDocument.xmlElements.item(0); //movieRoot
var myXMLParent = myXMLRoot.xmlElements.item(0); //dvds
var myXMLElement = myXMLParent.xmlElements.item(0); //movie
var currElement = myXMLElement.xmlElements.item(0); //title
for (i = 0; i < myXMLParent.xmlElements.length; i++)
myXMLElement = myXMLParent.xmlElements.item(i);
for (j = 0; j < myXMLElement.xmlElements.length; j++)
currElement = myXMLElement.xmlElements.item(j);
if (currElement.contents != "" && currElement.contents != "NOTHING")
alert (currElement.markupTag.name + ": " + currElement.contents);
It worked great until I tried to get it into an existing text frame. Since I want all the info in one text frame, placexml was out of the question, and markup worked but overwrote XML tags -- such as assigning the entire text frame to <movie/title> when I wanted it assigned to <dvds> with <movie/title> tags nested within it.
If you can help me with anything, this is really where I need pointed in the right direction most. But if you're feeling generous or bored...
Then for points #2 and #3, I want to take what's left ("filtered" XML data) and add additional text and formatting wherever certain tags are found.
For example, applying the paragraph style "MovieTitles" for any text within <title></title> XML tags; or adding the phrase "Special Features" (with paragraph style "Headers") above any text marked with <features> tags, while the content within those <features> tags applies the paragraph style "NormalText."
I've got some of this worked out in pieces already, but it generally falls apart because I can't get the tag structure correct in the text frame. I can provide more info as requested. Any help would be mighty appreciated!
UPDATE: Surprisingly, I've actually had some good success this evening on solving most of these problems. I'll post my results once I've finished up just in case anyone else can be helped by what I've learned.
One question remains for the moment: I've inserted text within an XML element, but outside of XML tags (e.g., </title>EDITION:<edition>) using "insertTextAsContent":
[xmlElementHere].insertTextAsContent("EDITION:", XMLElementPosition.beforeElement);
Does anyone know a good way to apply a paragraph style to that text without using a find & replace function later (after placing the XML into a text frame)?As posted into the other thread:
Yes, each record will be in its own frame.
You can use one of a couple solutions to stitch (link) each frame to the other, delete all but the first page and the first merged record, then resize that first merge frame and reflow the entire document.
https://forums.adobe.com/thread/1341730?start=0&tstart=0
Please review this thread. There is a couple posts with a script and you would want the last version of that script. You would have to follow the directions, as well as add a column at the beginning of your data and fill it with consecutive numbers.
Alternatively, there is a free plug-in by Rohiko for stitching merge data frames together, then follow the process above to reflow the document.
https://www.rorohiko.com/wordpress/indesign-downloads/textstitch/
Mike -
Parse XML Elements/Attributes from CLOB into Oracle Table
Hi!
I have an XML file (loaded into a CLOB) which I need to parse and have each individual element and attribute inserted into an oracle table for manipulation.
Eg: XML File...
<PERSON>
<PER_ID changed="1">1</PER_ID>
<SURNAME changed="1">MARTIN</SURNAME>
<ADDRESS>
<STREET_NO changed="1">1</STREET_NO>
<POSTCODE changed="1">LE3 8RA</POSTCODE>
</ADDRESS>
</PERSON>
There will only ever be one address.
From this I need to extract
* PER_ID and related changed attribute
* SURNAME and related changed attribute
* STREET_NO and related changed attribute
* POSTCODE and related changed attribute
and insert a single record into the table below:
CREATE TABLE PERSON AS
( PER_ID VARCHAR2(10)
, ID_CHANGED VARCHAR2(1)
, SURNAME VARCHAR2(30)
, ID_CHANGED VARCHAR2(1)
, STREET_NO VARCHAR2(5)
, ID_CHANGED VARCHAR2(1)
, POSTCODE VARCHAR2(10) );
Any assistance/advice would be very much appreciated. I've tried using DBMS_XMLSave / DBMS_XMLStore which works great at pulling in elements (PER_ID, SURNAME, etc) straight into the table but doesn't look at the changed attributes, and I need both.
Thanks a million in advance to anyone who can crack this!!
JayTry looking at this thread
Loading datafrom a PL/SQL table into the Database table -
How to read XML data stored in CLOB in Concurrent prog Output
Hi All,
I'm trying to Generate the XML Data as concurrent Program output. I have a PL/SQL package which generated the XML data by using SQL/XML functions. I'm storing the generated XML data in a CLOB variable. But when i try to read the data using fnd_file.put_line(fnd_file.OUTPUT,XML_Data) it doesn't display data more than 32767 bytes.
Please help me out to understand what could be done to read the data in chunks. I have tried many logic's to print chunks of data but the output tags are either chopped off and errors out saying Tag not found.
My logic is as below:
v_handler:= DBMS_XMLGEN.newContext(v_xml_query);
--Sets NULL handling options
DBMS_XMLGen.SetNullHandling(v_handler, dbms_xmlgen.EMPTY_TAG ) ;
--Set special character handling
DBMS_XMLGEN.setConvertSpecialChars(v_handler, TRUE);
-- Specified whether to use an XML attribute to indicate NULLness of particular entity in the XML document
DBMS_XMLGen.useNullAttributeIndicator(v_handler,TRUE);
-- set Checking invalid chars
DBMS_XMLGEN.setCheckInvalidChars(v_handler, TRUE);
-- get the xml data as required
v_xml_data:= DBMS_XMLGEN.getXMLtype(v_handler);
SELECT XMLROOT(v_xml_data.extract('/*'),VERSION '1.0').getClobVal() into v_new_xml_Data from dual;
-- get the length of the xml generated
v_clob_len := dbms_lob.getlength(v_new_xml_Data);
FND_FILE.PUT_LINE(FND_FILE.LOG,'The Clob length is :'|| v_clob_len);
-- logic to process string more than 32767 Processing by each character
v_offset :=1;
while (v_offset <= v_clob_len)
LOOP
v_char := dbms_lob.substr(v_new_xml_Data, 1, v_offset);
IF (v_char = CHR(10))
then
fnd_file.new_line(fnd_file.output, 1);
else
fnd_file.put(fnd_file.output, v_char);
end if;
v_offset := v_offset + 1;
END LOOP;
FND_FILE.PUT_LINE(FND_FILE.LOG,'The offset is :'|| v_offset);
FND_FILE.NEW_LINE(FND_FILE.OUTPUT, 1);
THe above logic is for character by character which is a performance burden? Please let me know if there is any other work around for thisHi,
Thanks for Replying. I have refered http://blog.oraclecontractors.com/?p=69 and then i added that piece of code. Basically, i'm trying to generate a report using XML publisher. To generate the XML data i'm writing a pl/sql package with SQl/XML functions. DBMS_XMLGEN would help me convert the XML Data as is. When the concurrent program runs this XML data will merge with RTF layout and generate required report. I'm able to generate the Report for data less then 32767 bytes. More than the limit i need to pass chunks of XML data to read as output. That's the reason i'm using fnd_file.output. But it reads only 32767 size at a time.
WHen i use the given logic, it works perfectly fine, but it loops for each character, for example if you have 30,000 characters it loops the same, which is peformance burden.
So i tried to write the logic of chunks but still i get the error that XML tag is not found or missing. I'm hoping this is very common issue, but after all my trails, i didn't find the right solution.
the other logic i tried was :
v_new_xml_data varchar2(32767)
v_iterations := CEIL(v_clob_len/v_chunk_length); -- v_chunk_length is 32767 and v_clob_length is length of the XML data stored inthe clob variable
For i in 0..v_iterations
LOOP
FND_FILE.put_line (fnd_file.log,'the loops v_pos :'||i||' and v_clob_length :'||v_clob_len);
v_new_xml_data := DBMS_LOB.SUBSTR ( V_XML_DATA,v_chunk_length,(i*v_chunk_length)+1);
FND_FILE.PUT_LINE (FND_FILE.OUTPUT,v_new_xml_data); -- read the output for every 32767 chunks
FND_FILE.PUT_LINE(FND_FILE.LOG, 'Chunk length is :'||((i*v_chunk_length)+1));
END LOOP;
FND_FILE.put_line (fnd_file.log,'out of loop');
FND_FILE.put_line (fnd_file.log,'length of new xml is '||v_clob_len);
Please, let me know if you need Further clarifications on the same.
Maybe you are looking for
-
Nano not showing up in iTunes or My Computer
I had to reformat my computer hard drive and reload my computer with Windows Vista Ultimate. I lost all of my music on my computer but they still are on my Nano. I tried to reload the music from my Nano to my computer but that didn't work and now I c
-
Spry tabbed panels java script error screwing up whole page when I reopen document in dreamweaver
I need help! I am creating a site in dreamweaver and I am using spry tabbed panels for my content on every page. I've created 4 pages. When I go to reopen the pages after quitting dreamweaver 2 open and work just fine. However, for the other two I
-
As prompted, Adobe Flash update was installed today. Since installing , Flash no longer works with FireFox (works ok with IE);
-
Mail takes FOREVER to send. Suggestions?
I had this problem since I got my Mac and 10.5.6. I've been using Thunderbird but would like to be able to use Mail for the integration with the rest of OS X, iLife. Thunderbird works as expected, sending and receiving. Receiving is fine, but sending
-
So I have about an eight year-old Sony TRV 330 camcorder and am desperate to transfer old tapes to iMac - got rid of old Windows Vista to get an iMac that'd make this possible. Hooked it up numerous times (firewire/IEEE 1394, camera) opened iMovie 08