从SQLAlchemy执行PL / SQL函数(或过程)

时间:2013-04-10 07:55:15

标签: python oracle plsql sqlalchemy

我有一个传统的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中       上下文)     在do_execute中输入文件“../env/lib/python3.3/site-packages/SQLAlchemy-0.8.0-py3.3.egg/sqlalchemy/engine/default.py”,第322行       cursor.execute(语句,参数)   cx_Oracle.DatabaseError:ORA-00900:无效的SQL语句

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

result = DBSession.execute('begin getlogin(:username, :password); end;',
                             {'username':request.POST['username'],'password':request.POST['password']});
SQLAlchemy + Oracle SP上的

This SO question也可能有所帮助。