DB29.7 SQL函数的限制还是BUG?

示例:

准备:

创建表:
(其中两列为计算列,信息存放在syscat.columns的text列中,该列为CLOB类型)
CREATE TABLE T1(
 c1 integer,
 c2 integer GENERATED ALWAYS AS (c1 * 10),
 c3 integer GENERATED ALWAYS AS (c1 * 20)
) @

创建函数:
(将表T1中计算列的信息,存放在一个字符串中返回)
CREATE FUNCTION F1(
 func_schema varchar(128),
 func_name varchar(128)
)
RETURNS clob(2M)
SPECIFIC F1
LANGUAGE SQL
READS SQL DATA
BEGIN ATOMIC
 DECLARE v_txt clob(2M) DEFAULT '';
 
 FOR ThisCols
   AS SELECT colname,
             typename,
             text
        FROM syscat.columns
       WHERE tabschema = func_schema
         AND tabname = func_name
         AND identity = 'N'
         AND GENERATED = 'A'
       ORDER BY colno
 DO
 SET v_txt = v_txt
           ||(CASE varchar(v_txt) WHEN '' THEN '' ELSE ','||chr(10) END)
           ||space(4)
           ||lower(rtrim(ThisCols.colname))
           ||space(1)
           ||lower(rtrim(ThisCols.typename))
           ||space(1)
           ||rtrim(ThisCols.text);
 END FOR;
 
 RETURN v_txt;
END
@

验证:

1、打开一个db2cmd窗口,连接到数据库,执行:
 D:\>db2 -x "values varchar(f1('DB2ADMIN', 'T1'), 128)"
     c2 integer AS (C1 * 20),
     c3 integer AS (C1 * 20)
     
 注意:两列的返回结果均为”AS (C1 * 20)“,这应该是计算列c3的信息,难道函数写错了吗?

2、重建函数,将FOR查询语句中 ”ORDER BY colno“,修改为”ORDER BY colno DESC“,(原来是默认升序)

3、再打开一个db2cmd窗口,连接到数据库,执行:
 D:\>db2 -x "values varchar(f1('DB2ADMIN', 'T1'), 128)"
     c3 integer AS (C1 * 10),
     c2 integer AS (C1 * 10)

 注意:两列的返回结果均为”AS (C1 * 10)“,这应该是计算列c2的信息
 
 
结论:

在SQL函数中,FOR循环中如果包含CLOB列的处理,则所有CLOB列的值,以最后一次取得的CLOB列的值为准;
将函数改为过程,不存在该问题。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7690668/viewspace-619783/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7690668/viewspace-619783/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值