用户定义函数不能返回一个 BYTE 或 TEXT 值(总称为简单大对象)。然而,用户定义函数可以使用 REFERENCES 关键字,返回一个包含 BYTE 或 TEXT 对象指针的描述符。
下面的例子说明了如何在 SPL 例程中选择 TEXT 列然后返回一个值:
CREATE FUNCTION sel_text()
RETURNING REFERENCES text;
DEFINE blob_var REFERENCES text;
SELECT blob_col INTO blob_var
FROM blob_table WHERE key_col = 10;
RETURN blob_var;
END FUNCTION;
对于作为查询的 Projection 列表中的列值的简单大对象,如在此示例中,返回的描述符中的指针根据 BYTE 或 TEXT 列定义从系统目录引用 sysblobs.spacename 值。
然而,对于不对应于永久表的列的简单大对象,指针引用定义了 UDR 的数据库的 dbspace 。这是当数据库服务器不指定 sysblobs 表的位置时, UDR 返回的 BYTE 或 TEXT 对象的缺省存储位置。
以下示例中的 DB-Access 会话创建两个例程 udr1 和 udr2,每个返回一个 TEXT 对象:
CREATE DATABASE db WITH LOG;
CREATE TABLE t (c2 TEXT);
CREATE TABLE t1 (c2 TEXT);
LOAD FROM "t.unl" INSERT INTO t;
CREATE FUNCTION udr1 ( param_1
REFERENCES TEXT DEFAULT NULL )
RETURNING REFERENCES TEXT
WITH (NOT VARIANT)
DEFINE var1 REFERENCES TEXT;
ON EXCEPTION
RETURN param_1;
END EXCEPTION;
SELECT t.c2 udr1_col1
INTO var1 FROM t;
RETURN var1;
END FUNCTION;
CREATE PROCEDURE udr2 ( OUT param_1
REFERENCES TEXT DEFAULT NULL )
RETURNING INT;
SELECT t.c2 udr1_col1
INTO param_1 FROM t;
RETURN 1;
END PROCEDURE;
SELECT udr1(t.c2) query_1_col1 FROM t
INTO TEMP mytemp;
SELECT c2, slv1 FROM t1
WHERE udr2(slv1#TEXT) > 0
INTO TEMP mytemp;
在调用这些 UDR 的 SELECT 语句中,每个查询返回到 mytemp 临时表的 TEXT 对象存储在 db数据库的 dbspace 中。