过程(或匿名块)中使用的隐式 SELECT 语句在过程完成后执行,标量用户定义的函数 (SUDF) 在 SELECT 语句的读取时进行评估,因为设计了后期实现。为避免出现超出过程或 SUDF 中语句快照顺序的语句的意外结果,现在将实例化隐式结果集,以防 SUDF 引用持久表。
CREATE TABLE t1(C1 VARCHAR(20));
CREATE FUNCTION my_count RETURNS v_result INTEGER AS
BEGIN
SELECT COUNT(*) INTO v_result FROM t1;
END;
CREATE PROCEDURE proc_insert_delete AS
BEGIN
INSERT INTO t1 VALUES ('test');
SELECT 'TRACE 1: COUNT AFTER INSERT', COUNT(*) FROM t1;
SELECT 'TRACE 2: COUNT DURING FUNCTION CALL', my_count() FROM DUMMY;
DELETE FROM t1;
SELECT 'TRACE 3: COUNT AFTER DELETE', COUNT(*) FROM t1;
COMMIT;
END;
CALL proc_insert_delete;
-- ('TRACE 1: COUNT AFTER INSERT', 1),
-- ('TRACE 2: COUNT DURING FUNCTION CALL', 1),
-- ('TRACE 3: COUNT AFTER DELETE', 0),