[Zope-dev] DCOracle and BLOBs Handling

Cheuk Cheng Cheuk_Cheng@Phoenix.com
Thu, 6 Apr 2000 18:55:14 -0700


Hi Everyone:

In the past couple weeks, I started looking at Zope for my future
development work.  One of the requirements is to be able to upload and
download Oracle blob via Zope.  In the last few days, I spent most of my
time searching through the mailing list for help from installing DCOracle to
inserting blob from an external method.  So far I've successfully used
DCOracle to create an Oracle connection in an external method and performed
some simple db tasks.  Now here're my questions for all the zope gurus:
1.	Can I use ZSQL method to insert blob into Oracle?  It works for
querying blob out of the database.  Why doesn't it work in insertion?
2.	In an external method can I get a hold of the connection object from
zope by doing these:

import  Shared.DCOracle
def     sql_exec(self, param)
.....
conn = self.oracle_connection 
cur = conn.cursor()
cur.execute(sqlstat)
.....

		When I execute the function from Zope, it keeps giving me an
AttributeError for the cursor.  Can someone please explain?  And if I create
the db connection inside using 
		conn = Shared.DCOracle.Connect('scott/tiger@oracledb'), I'll
be getting the cursor successfully.
		
3.	With the connection created in the external method, I thought I
could make the blob insertion work.  Obviously, I'm wrong!  I keep getting
an error about invalid hex number "oci.error: (1465, 'ORA-01465: invalid hex
number\012')".  The way I'm testing the insertion is to select a blob from
one table and try to insert it in another as follow:

cur.execute('select  no, blob_data from res_info where no=1000')
data = cur.fetchall()
a,b = data[0]
	image = (100, b)
	cur.execute('insert into test_info (no, data) values(:p1, :p2)',
image)

		I found that the returned "data" is a list of tuple.  So I
get the first tuple and unpack it. Then I created a new tuple and tried to
insert it into the test_info table.  And I keep getting the invalid hex
number  error.  When I took this and converted it to a standalone program
with a print statement for 'b', it printed out the correct binary data.  So
I suspect that I may have to convert the binary stream into a string before
I can do the insertion?  I also tried to set b = 'ff00ff00ff'  (a text
string of hex numbers), and it didn't complain about it.  Can someone please
tell me how blob shall be handled?  

Thanks in advance.

- Cheuk