首页 > 解决方案 > 在 db2 中,为什么 python 脚本总是返回“无”,当我们分配“0”时,从 ibm_db.callproc 调用过程 SP_MEM_DAILY_TMS

问题描述

蟒蛇脚本:

import ibm_db
v_conn = ibm_db.connect("DATABASE=BLUDB;HOSTNAME=127.0.1.1;PORT=50000;PROTOCOL=TCPIP;   UID=bluadmin;PWD=Yugenreddy@1;", "", "")
v_id = 1 
v_aa = None 
v_ret = 99
v_stmt, v_id, v_aa, v_ret = ibm_db.callproc(v_conn,"SP_MEM_DAILY_TMS",(v_id,v_aa,v_ret))
print("SP_MEM_DAILY_TMS")
print(v_ret)
ibm_db.close(v_conn)

v_conn = ibm_db.connect("DATABASE=BLUDB;HOSTNAME=127.0.1.1;PORT=50000;PROTOCOL=TCPIP;                                                       UID=bluadmin;PWD=Yugenreddy@1;", "", "")
v_id = 1 
v_aa = None 
v_ret = 99
v_stmt, v_id, v_aa, v_ret = ibm_db.callproc(v_conn,"ZZ_TEST_RET2",(v_id,v_aa,v_ret))
print("ZZ_TEST_RET2")
print(v_ret)
ibm_db.close(v_conn)

python 输出:SP_MEM_DAILY_TMS 无 ZZ_TEST_RET2 9

为什么当我们分配“0”时它返回“无”。并使用 ibm_db.callproc 从 python 执行它

create or replace procedure ZZ_TEST_RET2(
IN I_QUEUE_PROC_ID BIGINT
,IN I_AAA_ID INTEGER
,OUT O_RETURN SMALLINT
)
 SPECIFIC ZZ_TEST_RET2
 P1:BEGIN
 DECLARE C_RET_OK SMALLINT CONSTANT 9;
 SET O_RETURN = C_RET_OK;
 RETURN;
 end"

CREATE OR REPLACE PROCEDURE SP_MEM_DAILY_TMS(
     IN  I_QUEUE_PROC_ID     BIGINT
    ,IN  I_EMPLR_ID          INTEGER
    ,OUT O_RETURN            SMALLINT
 )
BEGIN
 DECLARE C_RET_OK                SMALLINT     CONSTANT 0;
 SET O_RETURN = C_RET_OK;
RETURN;
END

标签: db2

解决方案


linux 上的 python 2.7 和 python 3.6.9 以及 ibm_db 版本 3.0.1 都可以重现此行为。

作为一种解决方法,在您的存储过程中,使用 BIGINT 类型声明输出参数。然后 ibm_db 模块不会像对待 SMALLINT 和 INTEGER 那样将 0 视为无。

您可以在github上开票以获取更多信息。


推荐阅读