2011-12-27 53 views
11

tôi có mã này:Làm cách nào để đọc dữ liệu cx_Oracle.LOB bằng 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() 

Khi tôi làm print rows, tôi có được điều này:

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

Tuy nhiên, khi tôi làm print template.read(), tôi nhận được lỗi này:

cx_Oracle.DatabaseError: Invalid handle!

Đỗ làm cách nào để nhận và đọc dữ liệu này? Cảm ơn.

Trả lời

16

Tôi đã phát hiện ra rằng điều này xảy ra trong trường hợp khi kết nối đến Oracle được đóng trước khi phương pháp cx_Oracle.LOB.read() được sử dụng.

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

Và tôi nhận được: Cơ sở dữ liệuLỗi: Xử lý không hợp lệ!
Nhưng đoạn mã sau hoạt động:

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

bất kỳ ý tưởng tại sao đây là trường hợp? –

+0

Tôi thậm chí không thể tạo lại lỗi nữa, nhưng điều này là tốt để biết. Cảm ơn! Edit: Trên thực tế, tôi chỉ sao chép nó và nó làm việc sau khi tôi di chuyển 'orcl.close()' đến sau 'read()'. Cảm ơn! –

+0

Tôi đã làm một số thử nghiệm khác. Điều này chỉ xảy ra trên dữ liệu LOB. Điều này thực sự thú vị. Tôi có thể hỏi một câu hỏi khác về điều này. –

4

Đã tìm ra. Tôi phải làm một cái gì đó như thế này:

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

Chỉ cần thêm vào đó, nếu hàng chỉ là hàng int [0] là bắt buộc. Đối với int không có read(). – NIK

Các vấn đề liên quan