【问题标题】:Execute a PL/SQL function (or procedure) from SQLAlchemy从 SQLAlchemy 执行 PL/SQL 函数(或过程)
【发布时间】:2013-04-01 22:53:10
【问题描述】:

我有一个旧的 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(语句,参数) cx_Oracle.DatabaseError: ORA-00900: 无效的 SQL 语句

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

【问题讨论】:

    标签: python oracle plsql sqlalchemy


    【解决方案1】:

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

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

    SQLAlchemy + Oracle SP 上的This SO question 也可能有帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 那行不通,因为该函数返回一个布尔值(这是一种 PL/SQL 类型,而不是 SQL 类型)。
      • 感谢您的回复。 getlogin() 的签名返回布尔值,它是有效的 plsql,而不是有效的 sql。是的,我可以包装这个函数来返回一个有效的 SQL 类型。但即便如此,您提供的 execute() 示例实际上是一个 SQL 调用。我最初的问题仍然存在:是否可以通过 SQLAlchemy 执行 PLSQL?
      • 所以这似乎可行,但是我如何查看 pl/sql proc 中打印的 dbms_output' 语句?
      猜你喜欢
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多