示例:
准备:
创建表:
(其中两列为计算列,信息存放在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/