2011-12-27 192 views
11

我有這樣的代碼:如何讀取Python中的cx_Oracle.LOB數據?

dsn = cx_Oracle.makedsn(hostname, port, sid) 
    orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn) 
    curs = orcl.cursor() 
    sql = "select TEMPLATE from my_table where id ='6'" 
    curs.execute(sql) 
    rows = curs.fetchall() 
    print rows 
    template = rows[0][0] 
    orcl.close() 
    print template.read() 

當我做print rows,我得到這個:

[(<cx_Oracle.LOB object at 0x0000000001D49990>,)] 

然而,當我做print template.read(),我得到這個錯誤:

cx_Oracle.DatabaseError: Invalid handle!

待辦事項我如何獲取並閱讀這些數據?謝謝。

回答

16

我發現,這種情況發生的情況下,當使用cx_Oracle.LOB.read()方法之前關閉連接到Oracle。

orcl = cx_Oracle.connect(usrpass+'@'+dbase) 
c = orcl.cursor() 
c.execute(sq) 
dane = c.fetchall() 

orcl.close() # before reading LOB to str 

wkt = dane[0][0].read() 

我得到:DatabaseError:無效句柄!
但下面的代碼工作:

orcl = cx_Oracle.connect(usrpass+'@'+dbase) 
c = orcl.cursor() 
c.execute(sq) 
dane = c.fetchall() 

wkt = dane[0][0].read() 

orcl.close() # after reading LOB to str 
+1

任何想法,爲什麼這是這種情況? – 2012-09-26 00:26:28

+0

我甚至不能重現錯誤,但這是很好的知道。謝謝!編輯:其實,我只是將它重現,它在我將'orcl.close()'移到'read()'之後後就起作用了。謝謝! – 2012-09-26 13:48:16

+0

我做了一些更多的測試。這隻發生在LOB數據上。這真的很有趣。我可能會問另一個關於這個問題。 – 2012-09-26 13:58:20

4

想通了。我必須做這樣的事情:

curs.execute(sql)   
for row in curs: 
    print row[0].read() 
+0

只是爲了增加這一點,如果行[0]需要INT只有一行。對於int,沒有read()。 – NIK 2017-11-29 04:41:53