[Zope-DB] ZOracleDA and CLOBs

Matthew T. Kromer matt@zope.com
Tue, 13 May 2003 17:38:39 -0400

Brian Brinegar wrote:

> I am having trouble getting the data for a CLOB out of Oracle within 
> Zope. I started with a ZSQL Method which queries my table containing 
> CLOBs. I'm not sure what type of object I got back for the CLOB 
> column. When I try to display it I get an error saying "__str__ 
> returned non-string (type None)" if I call read() on the result it 
> returns None.
> So after poking around a bit I found in the ZOracleDA README file that 
> LOBs will only work if the "Maximum rows to retrieve" is set to 1. 
> After making that change the result is "<LobLocator object at 
> 0x144adf20>" now I'm not sure if this is a ZOracleDA LobLocator or a 
> DCOracle2 LobLocator object. If I try to call the read() method on 
> this object I get an Unauthorized Error.
> I did notice that the LobLocator object in ZOracleDA has a lob 
> attribute, if I try to access lob on my result I get an Attribute 
> Error. The LobLocator object in ZOracleDA also has the 
> __allow_access_to_unprotected_subobjects__ attribute set. So I think 
> I'm getting back the wrong LobLocator object.
> Any suggestions?
> I will play around when I get a chance to see if the _lobConvert 
> method is functioning correctly.
> Thank you,
> Brian Brinegar
> ECN Web System Developer
> Purdue University
> West Lafayette, IN 

Make sure you're using post 1.2 source or binaries.  The binary build of 
1.2 has a stupid LOB bug which makes the code think all LOB objects are 
temporary objects (ie it never clears the temporary flag) and so you'll 
never be able to read any real data from them.

LOB objects at the DA level have implicit reads; ergo if I go into the 
TEST tab of the database connection and try to query a LOB column, I'll 
get the actual LOB value back, not the LOB locator back. 

If you use a method or a script to look at the results, you really do 
get a LOB locator back -- but its str() method does a read of the LOB.

I dont think the README is correct either -- the restriction of 1 row 
results is for LONG columns not LOB columns.    BUT, I cant find 
anything in the README that mentions this anyway, so I'm wondering if 
you're using DCOracle not DCOracle2?

Matt Kromer
Zope Corporation  http://www.zope.com/