2011-12-27 18 views
11

ho questo codice:Come leggere i dati cx_Oracle.LOB in Python?

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() 

Quando faccio print rows, ottengo questo:

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

Tuttavia, quando lo faccio print template.read(), ottengo questo errore:

cx_Oracle.DatabaseError: Invalid handle!

Do come ottengo e leggo questi dati? Grazie.

risposta

16

ho scoperto che questo accade nel caso in cui la connessione ad Oracle viene chiusa prima di utilizzare il metodo cx_Oracle.LOB.read().

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() 

e ottengo: DatabaseError: Handle non valido!
Ma il seguente codice funziona:

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

qualche idea del perché questo è il caso? –

+0

Non riesco nemmeno a riprodurre l'errore più, ma questo è buono a sapersi. Grazie! Edit: In realtà, l'ho appena riprodotto e ha funzionato dopo aver spostato 'orcl.close()' dopo 'read()'. Grazie! –

+0

Ho fatto altri test. Questo succede solo sui dati LOB. Questo è davvero interessante. Potrei fare un'altra domanda al riguardo. –

4

Capito. Devo fare qualcosa di simile:

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

solo aggiungere a questo, se la riga è int solo fila è richiesto [0]. Per int non c'è read(). – NIK