首页 > 解决方案 > 使用 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,但到目前为止还没有运气)。

提前致谢。

标签: pythonpython-3.xoraclecx-oracle

解决方案


遵循 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())

推荐阅读