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]

 

posted on 2023-06-15 16:04  神气小宇  阅读(14)  评论(0编辑  收藏  举报

导航