ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DB29.7 SQL函数的限制还是BUG?

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

原创 Linux操作系统 作者:hdzwl 时间:2009-11-16 20:54:55 0 删除 编辑

示例:

准备:

创建表:
(其中两列为计算列,信息存放在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博客 ” ,链接:https://blog.itpub.net/7690668/viewspace-619783/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-09-13

  • 博文量
    16
  • 访问量
    35001