oracle 如何从cursor.execute中检索REF CURSOR输出的列名?

7jmck4yq  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(206)

下面是我尝试的代码,如果我改变,它可以正常工作

column_names by column_names = ['Col1','Col2','Col3']

但是我需要它是动态的,因为列的数量和名称可以根据我想要执行的过程而改变。

cursor.execute(GET_Transaction_History, date_value=date_value, cursor=ref_cursor)
column_names = [desc[0] for desc in ref_cursor.description]

df = pd.DataFrame(ref_cursor.getvalue(), columns=column_names)

下面的一行抛出以下错误:

column_names = [desc[0] for desc in ref_cursor.description]

属性错误:“Var”对象没有属性“description”
所以我想知道如何正确地检索列名。

ocebsuys

ocebsuys1#

您似乎正在使用从PL/SQL过程返回的REF CURSOR。
以下PL/SQL过程:

drop table t purge;
create table t (IntCol number, StringCol varchar2(4), DateCol date);

insert into t (IntCol, StringCol, DateCol) values (1, 'abcd', sysdate);
insert into t (IntCol, StringCol, DateCol) values (2, 'efgh', sysdate);
commit;

create or replace procedure myrefcursorproc2 (rc out sys_refcursor) as
begin
    open rc for select IntCol, StringCol from t;
end;
/

可用于:

import getpass
import os

import oracledb

un = os.environ.get('PYTHON_USERNAME')
cs = os.environ.get('PYTHON_CONNECTSTRING')
pw = getpass.getpass(f'Enter password for {un}@{cs}: ')

with oracledb.connect(user=un, password=pw, dsn=cs) as connection:
    with connection.cursor() as cursor:
        ref_cursor = connection.cursor()
        cursor.callproc("myrefcursorproc2", [ref_cursor])
        column_names = [desc[0] for desc in ref_cursor.description]
        print(column_names)

运行此命令将给出REF CURSOR的列名:

Enter password for cj@localhost/orclpdb1: 
['INTCOL', 'STRINGCOL']

相关问题