[Zope-DB] ZOracleDA and Stored Procedure -- bug, no such feature or my fault?

Matthew T. Kromer matt@zope.com
Thu, 07 Nov 2002 12:37:32 -0500


I'm going to prepend my answer instead of appending it ;)

What this looks like is a bug in SP.py of DCOracle2 (gasp!) where some 
other error is causing the transaction to be aborted.  The _abort call is:

   def _abort(self, *ignored):
        self._v_db.db.rollback()

and self._v_db is the database connection object.  Something in this 
case means this object is getting registered with the transaction 
manager (which happens down in the __call__ code) but then blowing up 
later, but in such a way that the object is not connected.

The connection is done in __call__ by checking if self._v_proc exists. 
 If it doesn't, connect gets called which sets up _v_proc and _v_db.

The actual call to the procedure in __call__ is guarded with an exept 
that will clear _v_proc if an error happens (which would cause the 
connection to be re-established the next time the object is called).

I can't see why self._v_db would not be defined and yet the object be 
registered with the transaction manager, but it seems to have happened. 
 You can fix that by changing the _abort method to either test for the 
existance of _v_db before using it, or by catching and ignoring 
AttributeErrors in _abort.

Then, and only then, will whatever the "real" error is show up.


Bo M. Maryniuck wrote:

>Hi.
>
>I have a Stored Procedure and Zope shows me it like this:
>
>function PM.PM_02.CLOB_PRINT returns OUT BOOLEAN, has arguments:
>         P_TABLE IN VARCHAR2
>         P_ID IN NUMBER
>         P_BUFFER IN OUT VARCHAR2
>         P_AMOUNT IN OUT NUMBER
>         P_POS IN NUMBER
>
>According to the PL/SQL it should work in this way: return 
>EOF into LL_NOTENT and a body of the CLOB into the buffer:
>
> ln_amount:=4000;
> ln_pos:=1;
> result:='';
> LOOP
>   ll_notend:=PM.PM_02.CLOB_PRINT('PM_REQUEST_ATTACHEMENTS',p_att_id,buffer,
>              ln_amount,
>              ln_pos);
>   result=result||buffer
>   ln_pos:=ln_pos+ln_amount;             
>  IF NOT ll_notend THEN EXIT; END IF;
> END LOOP;
>
>Well. Now I try to store the result of _procedure_ into some buffer
>with the Zope/PythonScript, like:
>
>buffer = ''
># clobPrint -- is ID of StoredProcedure in ZODB
>(answer,buffer,amount) = container.clobPrint(P_TABLE ='PM_REQUEST_ATTACHEMENTS',
>                                             P_ID = 294,
>                                             P_AMOUNT = 200,
>                                             P_POS = 1,
>                                             P_BUFFER = buffer)
>return buffer
>
>This causes:
>File /opt/zope/lib/python/ZODB/Transaction.py, line 107, in abort
>  File /opt/zope/lib/python/Shared/DC/ZRDB/TM.py, line 60, in abort
>    (Object: clobPrint)
>  File /opt/zope/lib/python/Products/DCOracle2/SP.py, line 154, in _abort
>    (Object: clobPrint)
>AttributeError: _v_db
>
>O.K., then DCOracle2 documentation sais, that I should not define OUT parameter.
>Then Oracle causes "Not enough arguments". Now what shell I do? 
>Is DCOracle2 Stored Procedure can not return more than one result? Or I do something
>wrong?
>
>  
>



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