使用 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 值的变量