Bar*_*dia 5 stored-procedures snowflake-cloud-data-platform dbt
我在通过 dbt 在 Snowflake 中执行存储过程时遇到问题:
我的过程的描述如下: MyStoredProcedure(ARRAY, VARCHAR, VARCHAR)
因此,当我想运行它时,我使用array_construct函数来创建第一个参数,例如:
call MyStoredProcedure(array_construct(array_construct('str_1', 'str_2')), 'schema_name', 'table_name');
当我在 Snowflake 中运行它时,这是有效的。但是,当我从 dbt 运行此命令时,它失败并出现以下错误:
不允许修改在不同范围启动的事务。
我确信这与在此调用中调用 array_construct 有关。
我应该提到,为了从 dbt 运行它,我定义了一个如下宏:
{% macro MyStoredProcedure() %}
{% set query -%}
CALL MyStoredProcedure(
array_construct(array_construct('str_1', 'str_2')),
'schema_name',
'table_name');
{%- endset %}
{% do run_query(query) %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
当然,像这样运行它:dbt run-operation MyStoredProcedure
我很感激任何帮助我解决这个问题的提示或想法。
谢谢
我仍然对雪花有很多了解,但通过阅读 文档的这一部分,在我看来,这可能只是多范围过程调用的机制。
据我所知,在雪花中执行此操作的典型(非 dbt)方法是:
begin transaction;
insert 1;
call storedprocedure();
insert 2;
commit;
Run Code Online (Sandbox Code Playgroud)
也许您可以调整您的宏,这样可以克服范围嵌套问题,因为所有事情都将在一个事务中完成?
{% macro MyStoredProcedure() %}
{% set query -%}
begin transaction;
CALL MyStoredProcedure(
array_construct(array_construct('str_1', 'str_2')),
'schema_name',
'table_name');
commit;
{%- endset %}
{% do run_query(query) %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
无法对此进行测试,因为我无法重现该过程本身。