首页 > 解决方案 > 部署存储过程时使用会话变量-雪花

问题描述

我有一种情况,我将存储过程 DDL 推送到 git 存储库中。这些代码有一些特定于环境的代码,比如我有 dev、qa 和 prd,而我每次部署时都需要替换。

我正在寻找的是能够使用可以在部署时替换的变量。像这样的东西

var env= 'dev';

create or replace procedure test
returns varchar
language javascript
as
$$
insert into raw_$env.employee values(1);
$$;

当我运行此代码时,我希望像这样部署代码。

create or replace procedure test
returns varchar
language javascript
as
$$
insert into raw_raw.employee values(1);
$$;

标签: snowflake-cloud-data-platform

解决方案


要指定动态模式名​​称,您可以使用 IDENTIFIER()。然后使用javascript存储过程API来执行。

create or replace procedure test()
returns text
language javascript
execute as caller
as
$$
  snowflake.createStatement({ sqlText: `set t = 'raw_' || $env || '.employee'` }).execute()
  snowflake.createStatement({ sqlText: `insert into identifier($t) values(1)` }).execute()
  return 'SUCCESS'
$$;

set env= 'dev';

call test();

您可能还想指定数据库。


更新——静态解决方案,硬编码'env'参数

在 SNOWSQL 中运行

!define env=dev;

create or replace procedure test()
returns text
language javascript
execute as caller
as
$$
  snowflake.createStatement({ sqlText: `insert into raw_&env.employee values(1)` }).execute()  return 'SUCCESS'
$$;

要验证替换是静态的:

select get_ddl('procedure','test()')

env 参数也可以在配置文件或SNOWSQL命令行中定义。


推荐阅读