使用 cx_Oracle 调用函数时表达式类型错误
Expresssion is of wrong type when calling function using cx_Oracle
我正在尝试使用 python 和 [= 从 PL/SQL API 调用 FND_CONCURRENT.WAIT_FOR_REQUEST 进行并发处理32=]。为了调用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 关于使用 an anonymous block wrapper and a 的建议,以下代码将起作用:
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())
可以直接使用boolean,如下:
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)
submitted_request = cursor.callfunc('fnd_concurrent.wait_for_request', bool,
[141116467,
1,
1,
phase,
status,
dev_phase,
dev_status,
message])
请注意,cursor.callfunc()
将在内部创建一个指定为 return 类型的变量(在本例中为 bool
),然后 return 该变量的值作为 cursor.callfunc()
.
的 return 值的变量
我正在尝试使用 python 和 [= 从 PL/SQL API 调用 FND_CONCURRENT.WAIT_FOR_REQUEST 进行并发处理32=]。为了调用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 关于使用 an anonymous block wrapper and a
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())
可以直接使用boolean,如下:
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)
submitted_request = cursor.callfunc('fnd_concurrent.wait_for_request', bool,
[141116467,
1,
1,
phase,
status,
dev_phase,
dev_status,
message])
请注意,cursor.callfunc()
将在内部创建一个指定为 return 类型的变量(在本例中为 bool
),然后 return 该变量的值作为 cursor.callfunc()
.