You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程嵌套调用(独立会话)时出现会话仓库不存在错误的解决咨询

问题分析与解决方案

你遇到的这个错误核心原因很明确:当前会话正在使用的仓库被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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:12:37