我在运行此代码时报告错误。由于某些原因,我必须在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” 请告诉我该怎么办。...
答案 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。