【问题标题】:new to dbt and trying to learn how to execute procedure using dbt but getting error刚接触 dbt 并尝试学习如何使用 dbt 执行过程但出现错误
【发布时间】:2022-08-08 12:01:06
【问题描述】:
create or replace procedure output_message(message varchar)
returns varchar not null
language sql
as
begin
return message;
end;
call output_message(\'Hello World\');
我得到的错误:
Database Error in model my_first_dbt_model (models/example/my_first_dbt_model.sql)
001003 (42000): SQL compilation error:
syntax error line 2 at position 7 unexpected \'create\'.
syntax error line 3 at position 0 unexpected \'returns\'.
compiled SQL at target/run/dbt_project/example/my_first_dbt_model.sql
-
-
您可以使用具体化link 自定义您的代码,我已经按照link 创建了 ddl 对象。您需要为此编写宏。
标签:
stored-procedures
snowflake-cloud-data-platform
dbt
【解决方案1】:
您不能将存储过程的代码放在模型文件(模型目录中的任何 .sql 文件)中。 dbt 假定模型文件包含单个 select 语句;然后它将 select 语句包装在 DDL 中(通常是 create table my_model as (...) 语句),具体取决于您对该模型的具体化配置。
Macros 更灵活。通常,存储过程不是 dbt 工作流的一部分,但它们有一些有效的用例(以及 UDF)。
您可以在 macros 目录中创建一个 output_message.sql 文件,并使用您提供的代码,将其包装在宏定义中,例如:
{% macro output_message(msg) %}
create or replace procedure output_message(message varchar)
returns varchar not null
language sql
as
begin
return message;
end;
call output_message(msg);
{% endmacro %}
然后,您可以在 post-hook 中或使用 run-operation 调用该宏:
dbt run-operation output_message --args "{'msg': 'Hello World!'}"
【解决方案2】:
您可以使用具体化link 自定义您的代码,我已经按照link 创建了 ddl 对象。您需要为此编写宏。