表输入参数和标量输出参数

2024-06-28 19:47:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下表和以下存储过程(简化为演示问题所需的基本知识):

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似乎无法接受表参数。将表名作为字符串传递无效:

^{pr2}$

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')

我发现了一个非常笨拙的解决方法,我将其作为答案发布,但它非常冗长,并且与默认参数值的交互效果不佳。有什么好方法可以访问输出参数吗?在


Tags: 方法inexecute参数过程createlinetable
1条回答
网友
1楼 · 发布于 2024-06-28 19:47:17

我找到的一个解决方法是将过程包装在匿名块中,并将标量填充到匿名块中的SELECT中:

>>> cur.execute('''
... DO BEGIN
... DECLARE X INT;
... T_VAR = SELECT * FROM T;
... CALL PROC(:T_VAR, X);
... SELECT :X FROM DUMMY;
... END''')
True
>>> cur.fetchone()
(5,)

那是很多额外的打字。我们可以保存一个包装过程来完成这项工作,而不是每次都重复匿名块,但是如果有很多过程要包装,那么这可能会导致很多包装过程。而且,它不能很好地使用默认值。如果您有以下步骤:

^{pr2}$

通常可以将其称为CALL PROC2(?),但如果不传递T的显式值,则不能从匿名块或存储过程内部调用它:

>>> cur.execute('''
... DO BEGIN
... DECLARE X INT;
... CALL PROC2(X);
... SELECT :X FROM DUMMY;
... END''')
Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
  File "/usr/local/lib/python3.6/site-packages/hdbcli/dbapi.py", line 363, in execute
    ret = self.__execute(operation)
  File "/usr/local/lib/python3.6/site-packages/hdbcli/dbapi.py", line 249, in __execute
    ret = self.__cursor.execute(operation, parameters=parameters, iscall=iscall, scrollable=self._scrollable)
hdbcli.dbapi.Error: (7, 'feature not supported: Only table variable is allowed in input parameter in a nested call: line 1 col 15 (at pos 14)')

该异常是由于T默认值而发生的。在

相关问题 更多 >