我是一个初级程序员(实际上是自动化的QA测试人员)在一个内部项目上工作(具体到我的工作),我试图使用存储在Firebird数据库中的UDF(外部函数又名用户定义函数)(我希望我正确地表达了所有这些)。
我正在使用Python的fdb驱动程序连接到Firebird数据库,我可以连接,运行基本的SQL语句,但是当我运行以下语句时,UDF返回0而不是预期的值。
cur.execute("INSERT INTO temp (column1,column2) VALUES(f_udfName(?),?)",(int(line.rstrip('n')),line.rstrip('n')))
我遍历一个文件,文件的每一行都是一个11位数字。我想将原始数字插入column1
,并将UDF的返回值插入表temp
的column2
。当我点击这行代码时,它成功地完成了,但是我得到的返回值是0
,而不是9位数字。
我用谷歌搜索了我能想到的一切来弄清楚这个问题。如果有人能至少给我指个正确的方向,我会非常感激的。
我使用Python 3.4,最新的fdb版本,和Firebird 2.5。
EDIT:如果我从python命令行运行代码并且不将语句参数化,UDF将返回预期的值。例子:
cur.execute("INSERT INTO temp (column1,column2) VALUES(f_udfName(12345678901),12345678901)")
根据Mark Rotteveel的建议,将SQL语句更改为CAST
参数作为BIGINT
解决了这个问题。
cur.execute("INSERT INTO temp (column1,column2) VALUES(f_udfName(CAST(? AS BIGINT)),?)",(int(line.rstrip('n')),line.rstrip('n'))
试图在Python 3.4中使用long(..)
函数不起作用,因为在Python 3.0.1中,long(..)
函数被合并到int(..)
函数中。尝试使用int(..)
将导致返回值0
,而不使用CAST
语句。