如何在Snowflake存储过程中保存所有输出并统计每条update的影响行数
存储update语句变量的执行效果
如果你的变量是将所有update语句用分号拼接成的单个合法SQL字符串,直接通过EXECUTE IMMEDIATE执行时,只要满足以下前提,就可以按顺序完成所有更新操作:
- 所有update语句语法正确,涉及的表、列、过滤条件均合法
- 存储过程的执行角色持有目标表的UPDATE权限
- 若开启了事务,更新逻辑符合你的事务提交/回滚预期
如果你的变量存储的是生成update语句的select查询结果集,不能直接执行该变量完成更新,需要先遍历结果集逐行取出update语句再执行。
单条update影响行数的保存方案
你可以通过循环逐句执行update,结合Snowflake内置的SQLROWCOUNT变量获取每次执行的影响行数,写入自定义的日志表留存即可,具体实现步骤如下:
- 提前创建执行日志表,用来存储每条update的执行信息:
CREATE TABLE IF NOT EXISTS UPDATE_EXECUTION_LOG ( EXECUTE_TIME TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP(), UPDATE_SQL STRING, AFFECTED_ROWS NUMBER, EXECUTE_STATUS STRING, ERROR_MSG STRING );
- 在存储过程中遍历所有update语句逐句执行,同步写入日志,参考实现片段:
CREATE OR REPLACE PROCEDURE BATCH_UPDATE() RETURNS STRING LANGUAGE SQL AS $$ DECLARE -- 此处替换为你生成update语句的查询SQL update_cursor CURSOR FOR SELECT update_sql FROM your_generate_update_sql_table; current_sql STRING; row_count NUMBER; BEGIN FOR rec IN update_cursor DO current_sql := rec.update_sql; BEGIN -- 执行单条update EXECUTE IMMEDIATE :current_sql; -- 获取本次更新影响行数 row_count := SQLROWCOUNT; -- 写入成功日志 INSERT INTO UPDATE_EXECUTION_LOG(UPDATE_SQL, AFFECTED_ROWS, EXECUTE_STATUS) VALUES (:current_sql, :row_count, 'SUCCESS'); EXCEPTION WHEN OTHER THEN -- 写入失败日志,不会中断整体执行 INSERT INTO UPDATE_EXECUTION_LOG(UPDATE_SQL, AFFECTED_ROWS, EXECUTE_STATUS, ERROR_MSG) VALUES (:current_sql, 0, 'FAILED', SQLERRM); END; END FOR; RETURN 'Batch update finished, view log in UPDATE_EXECUTION_LOG'; END; $$;
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

