In trunk! :-)

On Wednesday, 5 August 2015 13:31:01 UTC-5, Boris Aramis Aguilar Rodríguez 
wrote:
>
> Steps to reproduce:
>
> db.define_table('atable', Field('longtext', 'text'))#this makes longtext 
> to be a clob in oracle database
> for i in range(1, 100):
>   db.atable.insert(longtext=str(i))
>
> rows = db(db.atable.id>0).select()
> for r in rows:
>   print r.longtext #this fails with the following exception
>
> Traceback (most recent call last):
>   File "<console>", line 1, in <module>
> ProgrammingError: LOB variable no longer valid after subsequent fetch
>
> As I was trying to fix the error I found that LOB variables if not called 
> .read() they can't be accessed afterwards, so this only happened when you 
> selected something that returned more than 1 row. I finally found the issue 
> in 
>
> *OracleAdapter method _fetchall*
> def _fetchall(self):
>         if any(x[1]==cx_Oracle.LOB for x in self.cursor.description):
>             return [tuple([(c.read() if type(c) == cx_Oracle.LOB else c) \
>                                for c in r]) for r in self.cursor]
>         else:
>             return self.cursor.fetchall()
>
> So this method calls the read() method when it detects that the data is 
> cx_Oracle.LOB data type... but as long as the latest version of cx_Oracle 
> CLOB is not the same as LOB so this code fails for CLOB data (text fields 
> in web2py dal and Oracle backend).
>
> So, finally the bugfix is to detect for CLOB and LOB data types and call 
> the read() method
>
> The BugFix
> def _fetchall(self):
>         if any(x[1]==cx_Oracle.LOB or x[1]==cx_Oracle.CLOB for x in self.
> cursor.description):
>             return [tuple([(c.read() if type(c) == cx_Oracle.LOB else c) \
>                                for c in r]) for r in self.cursor]
>         else:
>             return self.cursor.fetchall()
>
>
>
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to