存储过程嵌套调用(独立会话)时出现会话仓库不存在错误的解决咨询
问题分析与解决方案
你遇到的这个错误核心原因很明确:当前会话正在使用的仓库被CREATE OR REPLACE WAREHOUSE语句删除了,导致后续调用子存储过程时,会话失去了可用的执行仓库,从而抛出"This session warehouse no longer exists"的报错。
为什么会触发这个问题?因为当你执行CREATE OR REPLACE WAREHOUSE时,如果当前会话的默认仓库正好是你要替换的目标仓库(也就是报错里的WH_STD_EDWQA_ANALYST),Snowflake会先删除原仓库再创建新的——这直接导致你的会话突然失去了绑定的仓库,后续任何需要仓库的操作(比如show warehouses、insert)都会因为没有可用计算资源而失败。
下面是针对性的修复建议:
1. 在父存储过程中切换到稳定的管理仓库
在执行仓库创建/替换操作前,先切换到一个不会被修改或删除的运维专用仓库(比如WH_ADMIN,或者你的账户默认仓库),确保会话始终有可用的计算资源:
create or replace procedure wh_resource_govern(type varchar, env varchar, team varchar, v_wh_size varchar, v_created_by varchar) returns varchar not null language sql as $$ declare wh_name varchar; wh_setup varchar; lv_acct_name varchar; begin -- 先切换到稳定的管理仓库,避免会话仓库被删除 use warehouse WH_ADMIN; -- 替换成你环境中永久存在的仓库名 wh_name := 'WH_' || type || '_' || env || '_' || team; wh_setup := 'CREATE OR REPLACE WAREHOUSE ' || wh_name || ' WITH WAREHOUSE_SIZE = ' || v_wh_size || ' COMMENT= ''' || v_created_by || ''''; -- 用双单引号转义字符串,避免语法问题 execute immediate wh_setup; -- Snowflake的DDL语句自动提交,不需要显式commit call load_all_warehouse_metadata(type, env, team); return 'Warehouse ' || wh_name || ' created and metadata loaded successfully'; end; $$ ;
2. 优化子存储过程的仓库依赖
为了彻底避免子存储过程受会话仓库状态影响,最好在子存储过程开头也强制指定使用稳定仓库,确保元数据操作能稳定执行:
create or replace procedure load_all_warehouse_metadata(wh_type varchar, wh_env varchar, wh_team varchar) returns varchar not null language sql as $$ declare lv_acct_name varchar; begin -- 强制使用稳定仓库执行元数据操作 use warehouse WH_ADMIN; select current_account() into lv_acct_name; show warehouses; insert into ALL_WAREHOUSE_METADATA (account_name, warehouse_type, warehouse_env, warehouse_team, warehouse_name) select :lv_acct_name, :wh_type, :wh_env, :wh_team, "name" from table(result_scan(last_query_id())); return 'Metadata loaded successfully'; end; $$ ;
3. 额外注意事项
- 移除父存储过程中的
commit;:Snowflake的DDL语句(比如创建/替换仓库)是自动提交的,显式commit不仅多余,还可能引发不必要的会话状态波动。 - 检查变量拼接语法:确保
wh_setup生成的SQL语句没有语法错误,比如用双单引号转义字符串(不要用",SQL存储过程中直接用两个单引号转义即可)。 - 验证列映射一致性:确保
insert语句的目标列数和select子句的返回列数完全匹配,避免插入失败。
内容的提问来源于stack exchange,提问作者Somen Swain
相关产品推荐
相关产品推荐

