oracledb处理游标中的对象类型数据
如果Oracle定义了以下对象类型
1 CREATE OR REPLACE TYPE "TY_RESULT" 2 AS OBJECT 3 ( 4 item CHAR(8), 5 cnt NUMBER(20), 6 7 --构造空对象 8 CONSTRUCTOR FUNCTION TY_RESULT RETURN SELF AS RESULT, 9 );
并用于存储过程的返回,放在ref cursor中
oracledb中可以用以下方法来获取游标输出的列名
[col[0] for col in cursor.description]
因为输出的是一个对象,而不是一个普通列,所以得到的列名格式为:TY_RESULT(ITEM, CNT)
如果想写一个不在乎列名的程序,那么必须要得到TY_RESULT的属性列表,也就是(ITEM, CNT),可以通过一个简单的字符提取来实现
1 text = cursor.description[0][0] 2 low = text.find('(') 3 high = text.rfind(')') 4 attrs = text[low+1, high].split(',')
这样就可以用一个通用的代码来使用对象TY_RESULT的值(假设游标只输出TY_RESULT对象)
1 for r, in cursor: 2 for attr in attrs: 3 print(r.__getattr__(attr))
但这里有个陷阱:[col[0] for col in cursor.description]中的col[0]是TY_RESULT的字符串表示,格式为前面提到的:TY_RESULT(ITEM, CNT)
在范例代码中没有问题
但col[0]是有长度限制的
当列很多时,将只能显示部分列
因此,获取TY_RESULT的属性的正确方式应该是下面的代码
1 result_type = conn.gettype('TY_RESULT')
2 attrs = [e.name for e in result_type.attributes]