如何使用Python fdb从火鸟数据库正确调用UDF(外部函数)



我是一个初级程序员(实际上是自动化的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的返回值插入表tempcolumn2。当我点击这行代码时,它成功地完成了,但是我得到的返回值是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语句。

最新更新