示例:SQL 函数中的行数据类型用法

可在 SQL 函数中使用行数据类型来构造、存储或修改记录数据。

可使用基于行数据类型的变量轻松保存格式与表相同的行值。用于此用途时,第一次使用时初始化行变量很有帮助。

以下是 Db2® CLP 脚本示例,其中包含的 SQL 语句将创建表、行数据类型以及包含行变量声明、行引用和 UDF 调用的函数:
CREATE TABLE t1 (deptNo VARCHAR(3),
                 reportNo VARCHAR(3),
                 deptName VARCHAR(29),
                 mgrNo VARCHAR (8),
                 location VARCHAR(128))@

 INSERT INTO t1 VALUES ('123', 'MM1', 'Sales-1', '0112345', 'Miami')@
 INSERT INTO t1 VALUES ('456', 'MM2', 'Sales-2', '0221345', 'Chicago')@
 INSERT INTO t1 VALUES ('789', 'MM3', 'Marketing-1', '0331299', 'Toronto')@

 CREATE TYPE deptRow AS ROW (r_deptNo VARCHAR(3),
                             r_reportNo VARCHAR(3),
                             r_depTName VARCHAR(29),
                             r_mgrNo VARCHAR (8),
                             r_location VARCHAR(128))@

 CREATE FUNCTION getLocation(theDeptNo VARCHAR(3),
                              reportNo VARCHAR(3),
                              theName VARCHAR(29))
  RETURNS VARCHAR(128)
  BEGIN

    -- Declare a row variable 
    DECLARE dept deptRow;

    -- Assign values to the fields of the row variable 
    SET dept.r_deptno = theDeptNo;
    SET dept.r_reportNo = reportNo;
    SET dept.r_deptname = theName;
    SET dept.r_mgrno = '';
    SET dept.r_location = '';

    RETURN
      (SELECT location FROM t1 WHERE deptNo = dept.r_deptno);

  END@					

VALUES (getLocation ('789', 'MM3','Marketing-1'))@

执行时,此 CLP 脚本会创建表、在表中插入行、创建行数据类型和 UDF。

函数 getLocation 是一个 SQL UDF,它声明行变量并使用输入参数值以向其字段指定值。它引用 SELECT 语句的行变量中的一个字段值,该字段定义该函数返回的标量值。

在脚本结尾执行 VALUES 语句时,会调用 UDF 并返回标量返回值。

以下是从 CLP 运行此脚本的输出:
CREATE TABLE t1 (deptNo VARCHAR(3), reportNo VARCHAR(3), 
 deptName VARCHAR(29), mgrNo VARCHAR (8), location VARCHAR(128))
DB20000I  The SQL command completed successfully.

INSERT INTO t1 VALUES ('123', 'MM1', 'Sales-1', '0112345', 'Miami')
DB20000I  The SQL command completed successfully.

INSERT INTO t1 VALUES ('456', 'MM2', 'Sales-2', '0221345', 'Chicago')
DB20000I  The SQL command completed successfully.

INSERT INTO t1 VALUES ('789', 'MM3', 'Marketing-1', '0331299', 'Toronto')
DB20000I  The SQL command completed successfully.

CREATE TYPE deptRow AS ROW (r_deptNo VARCHAR(3), r_reportNo VARCHAR(3), r_depTNa
me VARCHAR(29), r_mgrNo VARCHAR (8), r_location VARCHAR(128))
DB20000I  The SQL command completed successfully.

CREATE FUNCTION getLocation(theDeptNo VARCHAR(3),
                            reportNo VARCHAR(3),
                            theName VARCHAR(29))
 RETURNS VARCHAR(128)
 BEGIN
   DECLARE dept deptRow;
   SET dept.r_deptno = theDeptNo;
   SET dept.r_reportNo = reportNo;
   SET dept.r_deptname = theName;
   SET dept.r_mgrno = '';
   SET dept.r_location = '';
 RETURN
   (SELECT location FROM t1 WHERE deptNo = dept.r_deptno);
 END
DB20000I  The SQL command completed successfully.

VALUES (getLocation ('789', 'MM3','Marketing-1'))

1

--------------------------------------------------------------------------------
------------------------------------------------
Toronto


  1 record(s) selected.