使用 REFERENCES 子句指向一个简单大对象

用户定义函数不能返回一个 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 会话创建两个例程 udr1udr2,每个返回一个 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 中。