2

我使用 db2 9.7.6 full edition 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 过程中实现处理异常。当我尝试使用块“声明退出处理程序”时,出现语法错误。第二个变体是 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。

4

2 回答 2

1

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

脚本.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 有许多不同之处: - 单值返回与表或行返回。- 读取与修改的数据。- 条件处理程序与无。

由于函数定义不同,调用方式也不同,一种是标量值,另一种是函数表。

于 2012-10-21T06:07:28.797 回答
0

它只是行不通。

最大访问级别列表

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”。现在可能有办法解决这个问题,所以你必须重新考虑你的编码。

于 2012-10-22T09:31:40.203 回答