Ale*_*and 2 python stored-procedures pyodbc teradata output
我有一个使用 Python 脚本和 Pyodbc 模块调用的存储过程。代码如下所示:
import pyodbc
pyodbc.pooling=False
oConnexion = pyodbc.connect("driver={Teradata};dbcname=myServer;DefaultDatabase=myDB;uid=myUser;pwd=myPassword;charset=utf8;", autocommit=True)
oConnexion.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
oConnexion.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
oConnexion.setencoding(encoding='utf-8')
oCursor = oConnexion.cursor()
oQueryRegisterBatch = "CALL DEV_AUDIT.SP_AUDIT_BATCH('ED_DATA_QUALITY_MANUAL', 'REGISTER', '1900-01-01 00:00:00.000000', '2999-12-31 00:00:00.000000');"
oCursor.execute(oQueryRegisterBatch)
for row in oCursor:
print (row)
Run Code Online (Sandbox Code Playgroud)
存储过程创建一个新记录并返回记录 ID (BATCH_KEY)。当我在 Teradata 中执行存储过程时,它会正确返回 BATCH_KEY,但我无法在 Python 中捕获它。我收到以下错误消息而不是值:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.ProgrammingError: No results. Previous SQL was not a query.
Run Code Online (Sandbox Code Playgroud)
我可以在调用存储过程后通过查询表来检索 BATCH_KEY,但我想避免。您能否建议如何捕获存储过程的输出?
谢谢
根据 pyodbc 包的文档,无法捕获存储过程的输出。这在此处记录:https : //github.com/mkleehammer/pyodbc/wiki/Calling-Stored-Procedures
pyodbc 目前没有实现可选的 .callproc 方法。
有一种变通方法可以根据您的数据库引擎起作用,它将对存储过程的调用嵌入到查询中。
因为 pyodbc 没有 .callproc 我们需要使用一种解决方法来检索输出参数和返回值的值。具体方法取决于您的特定 ODBC 驱动程序支持什么,但对于 Microsoft 的 SQL Server ODBC 驱动程序,我们可以使用“匿名代码块”来执行存储过程,然后选择输出参数和/或返回值。
请参阅上面链接中的详细信息。