2

我有一个旧的 PL/SQL 函数:

getlogin(p_username in varchar2, p_password in varchar2) return boolean;

如何从 SQLAlchemy 执行此操作并获取返回值?

像这样天真的方法似乎不起作用:

result = DBSession.execute('getlogin(:username, :password)',
                           {'username':request.POST['username'],'password':request.POST['password']});
# extract return value from result

从日志中我看到了这个错误:

文件“../env/lib/python3.3/site-packages/SQLAlchemy-0.8.0-py3.3.egg/sqlalchemy/engine/base.py”,第 871 行,在 _execute_context 上下文中)文件“../ env/lib/python3.3/site-packages/SQLAlchemy-0.8.0-py3.3.egg/sqlalchemy/engine/default.py”,第 322 行,在 do_execute cursor.execute(statement, parameters) cx_Oracle.DatabaseError: ORA-00900: 无效的 SQL 语句

我可以看到它看起来像是在调用 SQL 解释器而不是 PL/SQL 解释器,但我不确定接下来的步骤。

4

2 回答 2

3

您可能必须为您的执行调用提供一个 PL/SQL 块:

result = DBSession.execute('begin getlogin(:username, :password); end;',
                             {'username':request.POST['username'],'password':request.POST['password']});

SQLAlchemy + Oracle SP 上的这个 SO 问题也可能有所帮助。

于 2013-04-10T10:38:32.160 回答
2

如果您使用.execute()的是连接方法,那么您需要一个有效的 SQL 语句。如果getlogin是一个函数,这需要一个 SELECT:

result = DBSession.execute('select getlogin(:username, :password) from dual'
                          , {'username' : request.POST['username']
                             ,'password' : request.POST['password']});

如错误所述,您的 SQL 语句无效。

于 2013-04-10T07:59:45.927 回答