python - 使用 cx_Oracle 调用函数时,表达式类型错误
问题描述
我正在尝试从 PL/SQL API 调用FND_CONCURRENT.WAIT_FOR_REQUEST以使用 python 和 cx_Oracle 进行并发处理。为了调用WAIT_FOR_REQUEST,需要提供以下参数:
( request_id IN number default NULL,
interval IN number default 60,
max_wait IN number default 0,
phase OUT varchar2,
status OUT varchar2,
dev_phase OUT varchar2,
dev_status OUT varchar2,
message OUT varchar2) return boolean;
所以我的python代码看起来像:
submitted_request = cursor.var(cx_Oracle.STRING)
phase = cursor.var(cx_Oracle.STRING)
status = cursor.var(cx_Oracle.STRING)
dev_phase = cursor.var(cx_Oracle.STRING)
dev_status = cursor.var(cx_Oracle.STRING)
message = cursor.var(cx_Oracle.STRING)
cursor.callfunc('fnd_concurrent.wait_for_request', submitted_request,
[141116467,
1,
1,
phase,
status,
dev_phase,
dev_status,
message])
但是当我尝试运行代码时,会出现以下错误:
cx_Oracle.DatabaseError: ORA-06550: line 1, column 13:
PLS-00382: expression is of wrong type
我的见解submitted_request
是导致问题的原因,但我在文档中找不到如何从函数中获取布尔值(我已经尝试过int
,但到目前为止还没有运气)。
提前致谢。
解决方案
遵循 kfinity 关于使用匿名块包装器的建议和一个非常相似的问题,以下代码将起作用:
outVal = cursor.var(int)
phase = cursor.var(cx_Oracle.STRING)
status = cursor.var(cx_Oracle.STRING)
dev_phase = cursor.var(cx_Oracle.STRING)
dev_status = cursor.var(cx_Oracle.STRING)
message = cursor.var(cx_Oracle.STRING)
sql="""
begin
:outVal := sys.diutil.bool_to_int(
fnd_concurrent.wait_for_request(
:id,
:interval,
:max_wait,
:phase,
:status,
:dev_phase,
:dev_status,
:message
)
);
end;
"""
cursor.execute(
sql,
outVal=outVal,
id='141116467',
interval='1',
max_wait='1',
phase=phase,
status=status,
dev_phase=dev_phase,
dev_status=dev_status,
message=message
)
print(outVal.getvalue())
推荐阅读
- java - JavaFX 逐个像素地绘制波形
- python - 将嵌套的 JSON 转换为 Pandas df
- javascript - 使用“npm start”命令反应应用程序问题
- html - 如何将组件放置到 Angular 9 中父组件结构中的特定位置?
- javascript - 单击HTML表格列以在Javascript中进行排序时如何显示向上/向下箭头
- python - 启动我的 Django 服务器时出错
- python - 将 df.loc 除以具有 NaN 值的 df.loc;错误“str”/“str”
- spring-boot - 带有 testcontainers 和 jOOQ 的 Spring Boot 不会注入 DSL 上下文
- c++ - C ++声明双链表,使用两个for循环双向遍历列表并打印
- kubernetes - 通过 Ansible 将多个 Kubectl 命令传递给 Pod