I have been playing with this as of late and the
Short answer is no with a but; and the
Long answer is yes with a maybe.

Right now with OCI (and hence DBD::Oracle as that is what is it written in) it is not possiable to directly select a xmltype.

you have one of two options

1) use the XML C Library that oracle provides and select it into one of their structures and then into OCI and then into Perl Not very piratical with DBD::Oracle as you would have to include the right lib etc which would be a nightmare and might break some copyright etc/ 2) do as you suggest use 'xmltype.getclobval' in the SQL to get the data as a clob.

That is the short No answer.

Now for the long YES answer

we already use OCIXMLTypeCreateFromSrc to create an XML type from text there are part of a number of other 'secret/undocumented' functions in OCI

which I have listed at the end of the doc.

Having played with them they look like they do the same sorts of things that the 'xmltype' SQL function do but as they are undocumented I have not had much luck with them.

If we could get some examples of the code in use I could build this right into DBD::Oracle but so far I have not managed to get any of the functions to work correctly.

don't bother searching the web for these things as they are not there. So unless some volunteers with some code come up or some docs I am not going to be spending much more time with it.

Cheers
John Scoles

'secret/undocumented'  XML functions in OCI

sword  OCIXMLTypeNew(OCISvcCtx *svchp, OCIError *errhp, OCIDuration dur,
                    OraText *elname, ub4 elname_Len,
                    OraText *schemaURL, ub4 schemaURL_Len,
                    OCIXMLType **retInstance);

sword  OCIXMLTypeCreateFromSrc(OCISvcCtx *svchp, OCIError *errhp,
                    OCIDuration dur, ub1 src_type, dvoid *src_ptr,
                    sb4 ind, OCIXMLType **retInstance);

sword  OCIXMLTypeCreateFromSrcWithSchema(OCISvcCtx *svchp, OCIError *errhp,
                    OCIDuration dur, ub1 src_type, dvoid *src_ptr,
                    sb4 ind, OraText *schemaURL, ub4 schemaURL_Len,
                    boolean wellformed, boolean valid,
                    OCIXMLType **retInstance);

sword OCIXMLTypeExtract(OCIError *errhp,
             OCIXMLType *doc, OCIDuration dur,
             OraText *xpathexpr, ub4 xpathexpr_Len,
             OraText *nsmap, ub4 nsmap_Len,
             OCIXMLType **retDoc);

sword OCIXMLTypeTransform(OCIError *errhp, OCIDuration dur,
              OCIXMLType *doc, OCIXMLType *xsldoc,
              OCIXMLType **retDoc);

sword OCIXMLTypeExists(OCIError *errhp, OCIXMLType *doc,
                OraText *xpathexpr, ub4 xpathexpr_Len,
                OraText *nsmap, ub4 nsmap_Len,
                boolean *retval);

sword OCIXMLTypeIsSchemaBased(OCIError *errhp,
                             OCIXMLType *doc, boolean *retval);

sword OCIXMLTypeIsFragment(OCIError *errhp, OCIXMLType *doc, boolean *retval);

sword OCIXMLTypeGetSchema(OCIError *errhp, OCIXMLType *doc,
            OCIXMLType **schemadoc,
            OraText **schemaURL, ub4 *schemaURL_Len,
            OraText **rootelem, ub4 *rootelem_Len);

sword OCIXMLTypeValidate(OCIError *errhp, OCIXMLType *doc,
                  OraText *schemaURL, ub4 schemaURL_Len, boolean *retval);

sword OCIXMLTypeGetDOM(OCIError *errhp, OCIXMLType *doc, OCIDuration dur,
                      OCIDOMDocument **retDom);

sword OCIXMLTypeGetFromDOM(OCIError *errhp, OCIDOMDocument *domdoc,
                          OCIXMLType **retXMLType);

sword OCIXMLTypeGetNS(OCIError *errhp, OCIXMLType *domdoc,
                     OraText **ns, ub4 *ns_len);

sword OCIDOMFree(OCIError *errhp, OCIDOMDocument *domdoc);



Martin Evans wrote:
Mickautsch, Alfred wrote:
Hello,

when I try to select from a table with a column of sys.xmltype ("select * from c041_dev.xmltest") I get the following error message:

DBD::Oracle::db prepare failed: ORA-22318: input type is not an array type (DBD ERROR: OCIAttrGet) [for Statement "select * from C041_DEV.XMLTEST"] at [...].

Can someone please tell me what I have to do to get the statement executed?

I am using Activestate perl 5.10.0, DBI 1.607 and DBD::Oracle 1.21 on Windows XP. The release of the oracle database server is 9.2.0.8.0 and the client is 10.2.0.1.0.

The table create statement is:

create table c041_dev.xmltest
(
  id integer primary key,
  xml sys.xmltype
);

insert into c041_dev.xmltest values(0, '<root/>');


Servus -- Alfred

--
Alfred Mickautsch

SCHULER Business Solutions AG
Karl-Berner-Str. 4
72285 Pfalzgrafenweiler
Deutschland
Tel:    +49 7445 830-184
Fax:    +49 7445 830-349
E-Mail: [email protected]
Web:    www.schuler-ag.com

SCHULER Business Solutions AG Aktiengesellschaft mit Sitz in D-72285 Pfalzgrafenweiler, Karl-Berner-Str. 4 Registergericht Stuttgart HRB 430947
Vorstand: Uwe Jonas, Harald Sieber
Vorsitzender des Aufsichtsrates: Achim Gauß



Sorry answer is so late after you posted but I marked your post as I knew I wanted to do this and I didn't get around to trying it until today.

select xmltype.getclobval(xmltype_column) from c041_dev.xmltest

should work but I'd be interested in anyone else thoughts on this as a straight select xmltype_column from table fails the prepare as Alfred has documented above.

I don't mind changing my perl to retrieve the column but I was hoping not to have to change my SQL. Anyone know what is going on with the prepare failing?

Martin

Reply via email to