为什么我会得到这个;无效句柄&引用;Python cx_Oracle中的错误?

为什么我会得到这个;无效句柄&引用;Python cx_Oracle中的错误?,python,cx-oracle,Python,Cx Oracle,这个问题与我先前发布的一个问题有关 我有以下代码: 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() p

这个问题与我先前发布的一个问题有关

我有以下代码:

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()
template.read()
当我打印行时,我得到以下信息:

[(<cx_Oracle.LOB object at 0x0000000001D49990>,)]
现在,当我交换
orcl.close()
template.read()
时,就像这样:

template.read()
orcl.close()
我一点错误都没有


此外,这仅在数据类型为LOB时发生。如果我正在检索的数据是字符串、整数或任何其他非LOB数据,
print rows
将打印我的所有数据,并且
template.read()
不会抛出错误,无论它是在
或.close()之前还是之后。我的问题是,为什么会发生这种情况?

LOB上的文档说Oracle通过只返回LOB的句柄而不是LOB数据本身来优化查询。我的猜测是
cx\u Oracale
遵循此约定,并且
cx\u Oracle.LOB
对象只是远程数据的代理。因此,关闭与服务器的连接也会终止代理。@sr2222啊,好的。这是有道理的。你觉得你能给我指一下那些说这句话的文档吗?我想直接从甲骨文那里找到一些东西,但是这个@sr2222太棒了,谢谢!LOB上的文档说Oracle通过只返回LOB的句柄而不是LOB数据本身来优化查询。我的猜测是
cx\u Oracale
遵循此约定,并且
cx\u Oracle.LOB
对象只是远程数据的代理。因此,关闭与服务器的连接也会终止代理。@sr2222啊,好的。这是有道理的。你觉得你能给我指一下那些说这句话的文档吗?我想直接从甲骨文那里找到一些东西,但是这个@sr2222太棒了,谢谢!
template.read()
orcl.close()