python - 如何使用 cx_Oracle 调用返回记录的 oracle 函数?
问题描述
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 获取记录?
解决方案
不幸的是,不,至少不是直接的!您可以使用 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()
如您所知,它比原始演示复杂得多——但它确实有效!
推荐阅读
- express - Hasura - 来自 Express 的电话
- oracle - Oracle SQL:自引用表层次结构。选择后如何使用临时表/循环将父母添加到顶部?
- r - 如何建立呼叫潜在客户的推荐模型
- multithreading - 获取正在运行的任务的线程
- php - 将表单粘贴到字符串中(使用 str_replace)不起作用
- .net-core - 迁移中不生成继承的子表/字段
- javascript - 谷歌函数返回未定义
- verilog - 强制模块的内部信号 - Verilog
- google-cloud-platform - Dialogflow:如何识别特定字符串?
- sql - 当数据为数字时,VBA SQL 查询不会将值始终作为数字拉取