我有下表和以下存储过程(简化为演示问题所需的基本知识):
CREATE TABLE T(C INT);
CREATE PROCEDURE PROC(IN T TABLE(C INT), OUT X INT) AS BEGIN
X = 5;
END;
从HANA Studio,我可以CALL PROC(T, ?)
得到5。但是,从hdbcli Python driver我没有找到任何好的方法来做同样的事情。在
callproc
似乎无法接受表参数。将表名作为字符串传递无效:
execute
可以执行该过程,但它似乎没有提供任何访问输出参数的方法。没有结果集:
>>> cur.execute('CALL PROC(T, ?)')
True
>>> cur.fetchone()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/hdbcli/dbapi.py", line 434, in fetchone
raise ProgrammingError(0,"No result set")
hdbcli.dbapi.ProgrammingError: (0, 'No result set')
我发现了一个非常笨拙的解决方法,我将其作为答案发布,但它非常冗长,并且与默认参数值的交互效果不佳。有什么好方法可以访问输出参数吗?在
我找到的一个解决方法是将过程包装在匿名块中,并将标量填充到匿名块中的SELECT中:
那是很多额外的打字。我们可以保存一个包装过程来完成这项工作,而不是每次都重复匿名块,但是如果有很多过程要包装,那么这可能会导致很多包装过程。而且,它不能很好地使用默认值。如果您有以下步骤:
^{pr2}$通常可以将其称为
CALL PROC2(?)
,但如果不传递T
的显式值,则不能从匿名块或存储过程内部调用它:该异常是由于
T
默认值而发生的。在相关问题 更多 >
编程相关推荐