Function 处理sql函数的运行时异常

Function 处理sql函数的运行时异常,function,exception,db2,Function,Exception,Db2,我使用DB29.7.6FullEdition for windows。我需要开发的功能,可以在sql选择表达式上使用。 函数必须包含修改sql数据和处理运行时异常。有两种变体,但我在实现所有变体中的所有需求方面都有问题。 第一个变体是sql表函数的实现,例如 CREATE FUNCTION func1 (val CHAR(20)) RETURNS table(result varchar(1000)) LANGUAGE SQL MODIFIES SQL DATA

我使用DB29.7.6FullEdition for windows。我需要开发的功能,可以在sql选择表达式上使用。 函数必须包含修改sql数据和处理运行时异常。有两种变体,但我在实现所有变体中的所有需求方面都有问题。 第一个变体是sql表函数的实现,例如

 CREATE FUNCTION func1 (val CHAR(20))
    RETURNS table(result varchar(1000))
    LANGUAGE SQL
    MODIFIES SQL DATA
   BEGIN atomic
    insert into a values(val);
        return (select result from a);
    END 
它可以工作,但我无法在sql过程中实现异常处理方式。当我尝试使用块“declare exit handler”时,我遇到了一个语法错误。 第二个变体是pl/sql函数的实现,例如

CREATE OR REPLACE FUNCTION bb
RETURN varchar2
MODIFIES SQL DATA
AS
BEGIN
    insert into st values ('a');
    return 0;
END bb;
但当我尝试执行此函数时,出现错误“SQLCODE=-740,SQLSTATE=51034是使用MODIFIES SQL DATA选项定义的,在调用例程的上下文中无效”。请帮帮我。
最好的问候,Turkin Andrew。

内联SQL复合语句和编译复合语句之间有许多不同之处。我编写了以下脚本,它在DB210.1forLUW中运行正常

Script.sql

CREATE or replace FUNCTION func1a (val CHAR(20))
RETURNS varchar(20)
LANGUAGE SQL
READS SQL DATA
BEGIN
declare ret varchar(20);
declare exit handler for sqlstate '02000' resignal sqlstate '08888';
select C1 into ret from T1 fetch first 1 row only;
return ret;
END@

CREATE or replace FUNCTION func1b (val CHAR(20))
RETURNS table(result varchar(20))
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN atomic
insert into T1 values(val);
return (select C1 from T1);
END@
执行(在Windows客户端中,但不重要)

正如您所看到的,DB2 10.1对于内联SQL和编译SQL有许多不同之处: -单值返回vs表或行返回。 -读取与修改的数据。 -条件处理程序vs nothing

由于函数定义的不同,调用方法有所不同,一种是标量值,另一种是函数表。

它就是不起作用


对于标量函数,最大级别为“读取SQL数据”。现在可能有办法解决这个问题,所以您必须重新考虑您的编码

为什么在行的周围使用加号(+)呢?我在函数的行重新调整中遇到了类似的问题:谢谢回复。但我认为你理解我错了。我不在乎什么样的函数,标量还是表。我需要实现所有要求:1。它必须是函数2。它可以在sql select 3中使用。在第一个变量中,有处理运行时异常和修改sql数据,我不知道如何捕获异常。在第二个变体中,我不知道如何创建带有“修改sql数据”的pl/sql函数。在这种情况下,我在执行此函数时出错。谢谢回复。我知道pl/sql不能帮助我实现所需的功能。在原子sql函数中是否有处理运行时异常的方法?例如,如果捕获到重复异常,我需要返回具体字符串。
db2 CREATE TABLE T1 (C1 CHAR(20))
db2 -td@ -vf Script.sql
db2 "values func1a('s')"
db2 "SELECT * FROM TABLE (FUNC1b('A'))"
Routine type    Default SQL access level    Maximum allowed SQL access level
SQL procedures  MODIFIES SQL DATA   MODIFIES SQL DATA
SQL functions (scalar functions)    READS SQL DATA  READS SQL DATA
SQL functions (table functions)     READS SQL DATA  MODIFIES SQL DATA
External procedures     MODIFIES SQL DATA   MODIFIES SQL DATA
External functions (scalar functions)   READS SQL DATA  READS SQL DATA
External functions (table functions)    READS SQL DATA  READS SQL DATA