首页 > 解决方案 > 处理python和oracle之间异常握手的正确方法

问题描述

我有以下从 Python 调用的过程,问题是我无法看到异常出现在块中,现在为了重现我已经强制引发异常,但我无法在Python 端脚本

CREATE OR REPLACE FUNCTION mark_step
(
   batch_id   IN NUMBER
  ,request_id IN VARCHAR2
) RETURN NUMBER IS


BEGIN
   INSERT INTO temp_log VALUES ('entered');
   RAISE no_data_found;

   return 0;
EXCEPTION
   WHEN OTHERS THEN
      INSERT INTO temp_log VALUES ('exception');

END mark_step;

调用此函数的客户端脚本

l_result = cur.callfunc('mark_step', cx_Oracle.STRING,
                                    [batch_id,request_id])



print(l_result)

标签: pythonoraclecx-oracle

解决方案


该函数优雅地处理异常,并且 Python 脚本没有获得函数的任何可见性,因为在异常块上添加 Raise 失败

EXCEPTION
   WHEN OTHERS THEN
      INSERT INTO temp_log VALUES ('exception');
      RAISE;
END mark_step;

在 Python 方面,您可以添加 try , except 块来显式处理异常,以防您还没有这样做

try:   
   l_result = cur.callfunc('credit_ref_mig.mark_step', cx_Oracle.STRING,
                                       [batch_id,request_id])

   print(l_result)
except as e:
   print(e)

推荐阅读