Snowflake脚本:如何在FOR循环中累计执行结果集?
解决Snowflake循环删除Schema时返回所有执行状态的问题
要累计每次删除Schema的执行结果,你可以通过创建临时表存储每次操作的状态来实现,替代原脚本中覆盖结果集的方式。以下是修改后的完整脚本:
DECLARE curs CURSOR FOR ( select schema_name from information_schema.schemata where last_altered < dateadd(day, -7, current_timestamp()) ); v_drop_result RESULTSET; BEGIN -- 创建临时表用于存储所有删除操作的结果 CREATE OR REPLACE TEMPORARY TABLE drop_schema_results ( schema_name VARCHAR, operation_status VARCHAR, message VARCHAR ); FOR record IN curs DO -- 执行删除操作并获取结果 v_drop_result := (EXECUTE IMMEDIATE 'drop schema if exists ' || record.schema_name || ';'); -- 将当前删除结果插入临时表,关联对应的Schema名称 INSERT INTO drop_schema_results SELECT record.schema_name, status, 'Operation completed' FROM TABLE(v_drop_result); END FOR; -- 返回所有删除操作的结果 SELECT * FROM drop_schema_results; END;
关键改动说明:
- 新增临时表
drop_schema_results,用于持久化每次删除操作的Schema名称、执行状态和消息 - 循环中不再覆盖结果集变量,而是将每次
DROP的结果插入临时表 - 最终返回临时表的所有记录,包含所有Schema的删除状态
异常处理增强版(可选)
如果需要避免单个Schema删除失败导致整个脚本终止,可添加异常捕获逻辑,记录详细错误信息:
DECLARE curs CURSOR FOR ( select schema_name from information_schema.schemata where last_altered < dateadd(day, -7, current_timestamp()) ); v_drop_result RESULTSET; v_error_msg VARCHAR; BEGIN CREATE OR REPLACE TEMPORARY TABLE drop_schema_results ( schema_name VARCHAR, operation_status VARCHAR, message VARCHAR ); FOR record IN curs DO BEGIN v_drop_result := (EXECUTE IMMEDIATE 'drop schema if exists ' || record.schema_name || ';'); INSERT INTO drop_schema_results SELECT record.schema_name, 'SUCCESS', status FROM TABLE(v_drop_result); EXCEPTION WHEN OTHERS THEN v_error_msg := SQLERRM; INSERT INTO drop_schema_results (schema_name, operation_status, message) VALUES (record.schema_name, 'FAILED', v_error_msg); END; END FOR; SELECT * FROM drop_schema_results; END;
这个版本会捕获删除过程中的异常,记录失败的Schema名称和错误信息,确保脚本能完整遍历所有符合条件的Schema。
内容的提问来源于stack exchange,提问作者Seub
相关产品推荐
相关产品推荐

