如何在INFORMIX中使用带INTO子句的Execute Immediate为变量赋值
在INFORMIX存储过程中用动态SQL统计表行数的正确写法
你遇到的错误是因为动态SQL字符串里直接引用了存储过程的局部变量v_count,但动态SQL的执行上下文和存储过程的变量上下文是隔离的,数据库找不到这个变量,所以报“Variable (v_count) has undefined value.”。
要在INFORMIX的存储过程里通过动态SQL给变量赋值,不能把INTO 变量写在动态SQL字符串里,而是要把INTO子句放在EXECUTE IMMEDIATE或者EXECUTE语句的后面,直接关联存储过程的局部变量。
修正后的代码示例(两种写法)
方法1:使用EXECUTE IMMEDIATE ... INTO
CREATE PROCEDURE all_table_count_proc() DEFINE v_table_name VARCHAR(70); DEFINE v_count INT8; DEFINE z VARCHAR(100); -- 从系统表获取目标表名 SELECT tabname INTO v_table_name FROM systables WHERE tabtype = 'T' AND tabid = 508; -- 构造动态SQL,只写查询语句部分 LET z = 'SELECT count(*) FROM ' || v_table_name; -- 执行动态SQL并将结果赋值给局部变量v_count EXECUTE IMMEDIATE z INTO v_count; -- 将结果插入统计表格 INSERT INTO table_count_details_tbl VALUES(v_table_name, v_count); END PROCEDURE;
方法2:使用PREPARE + EXECUTE ... INTO(更适合复杂场景)
CREATE PROCEDURE all_table_count_proc() DEFINE v_table_name VARCHAR(70); DEFINE v_count INT8; DEFINE z VARCHAR(100); DEFINE stmt STATEMENT; SELECT tabname INTO v_table_name FROM systables WHERE tabtype = 'T' AND tabid = 508; LET z = 'SELECT count(*) FROM ' || v_table_name; -- 预编译动态SQL语句 PREPARE stmt FROM z; -- 执行预编译语句并赋值给变量 EXECUTE stmt INTO v_count; -- 释放预编译资源 FREE stmt; INSERT INTO table_count_details_tbl VALUES(v_table_name, v_count); END PROCEDURE;
关键说明
- 动态SQL字符串里只需要写
SELECT count(*) FROM 表名,不需要包含INTO v_count,因为v_count是存储过程的局部变量,不属于动态SQL的执行上下文。 - 必须通过
EXECUTE IMMEDIATE ... INTO或者EXECUTE ... INTO的方式,把动态SQL的查询结果直接赋值给存储过程的局部变量,这样数据库才能正确关联变量。
内容的提问来源于stack exchange,提问作者Shangeetha
相关产品推荐
相关产品推荐

