示例: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.