【问题标题】: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

  • 你可能想看看这个:discourse.getdbt.com/t/…
  • 您可以使用具体化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 对象。您需要为此编写宏。

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2023-01-23
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      • 2018-10-25
      • 1970-01-01
      相关资源
      最近更新 更多