我是一名初学者程序员(实际上是自动化 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 位数字。我想将原始数字插入到表 temp
的 column1
中,并将 UDF 的返回值插入到 column2
中。当我输入这行代码时,它成功完成,但我得到的返回值是 0
而不是 9 位数字。
我已经用谷歌搜索了我能想到的所有东西来解决这个问题。如果有人至少能够指出我正确的方向,我将不胜感激。
我使用的是 Python 3.4、最新的 fdb 版本和 Firebird 2.5。
编辑:如果我从 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
语句。
关于python - 如何使用Python fdb从Firebird数据库正确调用UDF(外部函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31926782/