Thanks Matt. I've been able to get around the initial problem I was having by using the XMLTYPE's getClobValue() to have Oracle return a CLOB instead of the XMLTYPE, which was causing DCOracle2 to Segfault. However, no write()s to this CLOB ever get written back to the database. I've also discovered the Zope-DB mailing list, so I'll be using that to post these types of problems from now on. Matthew T. Kromer wrote:
John Ziniti wrote:
Hello --
The DCOracle2 Documentation states that it is possible to force type coercion on a result column to particular type, but does not give an example of how to do this. Does anyone have any suggestions? I am trying to force an XMLTYPE column into a CLOB.
TIA,
John Ziniti
It doesn't go into detail because you really, really don't want to unless you know what you are doing.
What the DCOracle2 type coercion does is assert to Oracle that the python object is whatever type you say it is.
What this is most useful for is changing a string into something else -- but you have to be very careful that your input data is in fact properly formatted.
For example, if I say
import DCOracle2 i = DCOracle2.TypeCoercion("foo", "SQLT_INT")
I'm creating a coerced variable "i" that will claim to be an int. In fact, when Oracle goes to read it, it will read 0x666f6f00 (depending on the byte order). This may or may not be 1718578944 -- but it certainly isn't a very useful value. The coercion is applied AFTER the normal python type->oracle data type binding happens, ie it really just affects the bind declaration. If I coerce the number 1, I'm really referring to an address in memory pointing to a value containing 0x00000001 with a length of four bytes. When oracle is passed this pointer, its told what the data type is it points at. The TypeCoercion overrides what the declared type is, but doesn't *reformat* the data.
Why would you want to do this? Well, maybe you want to handle the binary conversion of values yourself. The underlying C module dco2 will let you get at the raw memory behind a result, so you could extend DCOracle2 to understand new types without writing additional C code.