【问题标题】:How call oracle function that returns record with cx_Oracle?如何使用 cx_Oracle 调用返回记录的 oracle 函数?
【发布时间】:2019-03-07 10:05:10
【问题描述】:

cx_Oracle 有办法做到这一点:

typeObj = connection.gettype("PKG_DEMO.UDT_DEMORECORD")
obj = typeObj.newobject()

但在文档中说:

 This feature is new in cx_Oracle 5.3 and is only available in Oracle
 Database 12.1 and higher.

在我的情况下,oracle 服务器版本是 11g,我无法更改功能本身。 我认为由于服务器版本 python 引发错误:

cx_Oracle.DatabaseError: ORA-04043: object PKG_DEMO.UDT_DEMORECORD does not exist

有没有办法从 oracle 11g 获取记录?

【问题讨论】:

    标签: python oracle function cx-oracle


    【解决方案1】:

    不幸的是,不,至少不是直接的!您可以使用 PL/SQL 将记录拆分为零碎,例如,如果您有 PKG_DEMO.UDT_DEMORECORD 记录,您可以执行以下操作:

    import cx_Oracle
    import datetime
    
    conn = cx_Oracle.connect("pythondemo/welcome")
    cursor = conn.cursor()
    
    numVar = cursor.var(int)
    strVar = cursor.var(str)
    dateVar = cursor.var(datetime.datetime)
    boolVar = cursor.var(bool)
    
    numVar.setvalue(0, 6)
    strVar.setvalue(0, "Test String")
    dateVar.setvalue(0, datetime.datetime(2016, 5, 28))
    boolVar.setvalue(0, False)
    
    # show the original values
    print("NUMBERVALUE ->", numVar.getvalue())
    print("STRINGVALUE ->", strVar.getvalue())
    print("DATEVALUE ->", dateVar.getvalue())
    print("BOOLEANVALUE ->", boolVar.getvalue())
    print()
    
    cursor.execute("""
            declare
                t_Record pkg_Demo.udt_DemoRecord;
            begin
                t_Record.NumberValue := :numVar;
                t_Record.StringValue := :strVar;
                t_Record.DateValue := :dateVar;
                t_Record.BooleanValue := :boolVar;
                pkg_Demo.DemoRecordsInOut(t_Record);
                :numVar := t_Record.NumberValue;
                :strVar := t_Record.StringValue;
                :dateVar := t_Record.DateValue;
                :boolVar := t_Record.BooleanValue;
            end;""",
            numVar = numVar,
            strVar = strVar,
            dateVar = dateVar,
            boolVar = boolVar)
    
    # show the modified values
    print("NUMBERVALUE ->", numVar.getvalue())
    print("STRINGVALUE ->", strVar.getvalue())
    print("DATEVALUE ->", dateVar.getvalue())
    print("BOOLEANVALUE ->", boolVar.getvalue())
    print()
    

    尽你所能,它比原始演示复杂得多——但它确实有效!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多