首页 > 解决方案 > 如何在 BigQuery 中创建 UDF?例程名称缺失数据集

问题描述

以下是我在 postgres db 中的工作函数的定义:

create function my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric) returns numeric
    language plpgsql
as
$$
DECLARE
    _charge numeric;
BEGIN
    IF qty = 0 THEN
        RETURN 0.00::numeric(19, 2);
    END IF;
    _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);
    RETURN (_charge + COALESCE(other_fee, 0.00))::numeric(19, 2);
END;
$$;

alter function my_function(numeric, numeric, numeric, numeric) owner to my_location;

但是当我在 BigQuery 中尝试以下操作时:

create function my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric) returns numeric
    language plpgsql
as
"""
DECLARE
    _charge numeric;
BEGIN
    IF qty = 0 THEN
        RETURN 0.00::numeric(19, 2);
    END IF;
    _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);
    RETURN (_charge + COALESCE(other_fee, 0.00))::numeric(19, 2);
END;
""";

我收到以下错误:

Routine name "my_function" missing dataset while no default dataset is set in the request.

我缺少什么命令/语法?我没有看到很多关于如何纠正这个问题的具体 sql 文档。

更新:到目前为止,我认为以下 BigQuery 是正确的,但它仍然会为浮点文字 0.00 和其他不兼容的语法提供错误

create procedure my_schema.my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric)
BEGIN
    IF qty = 0 THEN
        RETURN 0.00::numeric(19, 2);
    END IF;
    _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);
    RETURN (_charge + COALESCE(other_fee, 0.00))::numeric(19, 2);
END;

标签: google-bigqueryuser-defined-functions

解决方案


  • 只需使用 dataset.function_name 或 project.dataset.function_name 概念
  • 如果您想使用 BQ 脚本 - 您应该使用过程 - 请参阅CREATE PROCEDURE 语句。BQ 函数不支持脚本。因此,如果您的逻辑涉及脚本 - proc 是您的选择

推荐阅读