处理sql函数的运行时异常

时间:2012-10-20 22:18:15

标签: function exception db2

我使用db2 9.7.6完整版for windows。我需要开发可以在sql select表达式上使用的函数。 函数必须包含修改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程序中实现处理异常。当我尝试使用块“声明退出处理程序”时,我得到了语法错误。 第二个变体是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。

2 个答案:

答案 0 :(得分:1)

内联SQL化合物和编译化合物之间存在许多差异。我编写了以下脚本,它在db2 10.1 for LUW中运行正常。

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 CREATE TABLE T1 (C1 CHAR(20))
db2 -td@ -vf Script.sql
db2 "values func1a('s')"
db2 "SELECT * FROM TABLE (FUNC1b('A'))"

正如您所看到的,DB2 10.1中针对内联和编译SQL存在许多差异: - 单值返回vs表或行返回。 - 读取与修改的数据。 - 条件处理程序与无。

由于函数定义,调用方法不同,在一种情况下它是标量值,另一种是函数表。

答案 1 :(得分:0)

它不起作用。

List of maximum access levels

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

对于标量函数,最大级别为“READS SQL DATA”。现在可能已经存在,所以你必须重新考虑你的编码。