如何使用DB2捕获函数中的异常

时间:2019-04-25 03:27:07

标签: sql db2

我在运行此代码时报告错误。由于某些原因,我必须在BEGIN之后添加ATOMIC才能执行该函数,但它与函数主体中的SQLEXCEPT冲突。我该怎么办?

当我调用该函数时,我总是报告SQL0390N错误。有人告诉我在BEGIN之后将ATOMIC添加到函数中,但是我在函数中遇到了异常。

CREATE OR REPLACE FUNCTION IS_DATE(INDATE VARCHAR(10)) 
  RETURN INTEGER
  LANGUAGE SQL
BEGIN ATOMIC
  DECLARE V_DATE DATE;
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
      RETURN 0;
  END;
  SET V_DATE = TO_DATE(INDATE,'YYYYMMDD');

  RETURN 1;
END;

这些语句将产生冲突“ BEGIN ATOMIC”和“ DECLARE EXIT HANDLER FOR SQLEXCEPTION” 请告诉我该怎么办。...

1 个答案:

答案 0 :(得分:1)

如果要使用异常处理程序,则必须使用“复合SQL(已编译)”,一种指定方法是使用BEGIN而不是BEGIN ATOMIC。其他方式也是可能的。

IBM Db2-LUW具有两种不同类型的复合SQL块,用于对多个SQL PL语句进行分组。

每种类型都有其自身的优势和局限性。

第一种是内联的(在编译后成为调用语句的一部分),在文档中称为“复合SQL(内联的)”。

Compound-SQL(内联)仅提供SQL语句的子集,并且在块的开头需要BEGIN ATOMIC语法。

在您的示例中,您显示BEGIN ATOMIC,并且您需要知道这禁止在块内声明处理程序,因为是调用内联函数必须处理错误的是块(或语句) 。该文档显示了statements that are allowed in a compound inlined块。

第二种没有内联(与调用它的语句分开编译和存储)。在文档中,这称为“复合SQL(已编译)”。

与内联类型相比,复合SQL(已编译)允许更大范围的SQL PL语句,并且复合SQL(已编译)不需要是原子的(即它可以具有保存点,提交和回滚以及异常处理程序等)。该文档为here