我使用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。
答案 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)
它不起作用。
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”。现在可能已经存在,所以你必须重新考虑你的编码。