显示用于UDF的SNowflake DDL的正确语法是什么

问题描述

我以管理员身份登录并创建了以下功能

Create or replace function "CONSUMPTION"."UDF_GetCountArea" (
    LOCN_CLASS varchar,LOCN_SIZE_TYPE varchar,ZONE varchar,LOCN_AISLE varchar)

    Returns varchar(40) as

$$

    select CASE 
        WHEN  ZONE in('81','84') THEN                                                                       'Pallet Reserve'
        WHEN  ZONE = '88' AND LOCN_AISLE = '84' THEN                                                        'Pallet Reserve'
        WHEN  ZONE = '85' THEN                                                                              'Case Reserve'
        
        WHEN  ZONE in('80','83') THEN                                                                       'Pallet Reserve'
        WHEN  ZONE = '88' AND LOCN_AISLE = '83' THEN                                                        'Pallet Reserve'
        WHEN  ZONE = '86' THEN                                                                              'Case Reserve'
        
        WHEN LOCN_CLASS ='R' AND LOCN_SIZE_TYPE IN ('BFL','AFL','HLF','FUL') THEN                           'Pallet Reserve'
        WHEN LOCN_CLASS ='R' AND LOCN_SIZE_TYPE IN ('CSR','ACS','X1','BCS') THEN                            'Case Reserve'
        WHEN LOCN_CLASS ='C' AND ZONE IN ('41','42','43') THEN                                            'Cart Picking'
        WHEN LOCN_CLASS ='C' AND ZONE IN ('44','45','46') THEN                                            'Unit Picking'
        WHEN LOCN_CLASS ='C' AND ZONE IN ('47','48','49') THEN                                            'Mod Picking' 
        Else '99-UNK'
    End Phys_COUNT_AREA
$$

grant usage on function "CONSUMPTION"."UDF_GetCountArea"(VARCHAR,VARCHAR,VARCHAR) to APPLICATION_SNowFLAKE_QA_SC_WMS_NALC_READWRITE;

grant usage on function "CONSUMPTION"."UDF_GetCountArea"(VARCHAR,VARCHAR) to APPLICATION_SNowFLAKE_QA_SC_WMS_NALC_READ;

SHOW USER FUNCTIONS return and shows the function. 

我可以测试该功能,并且可以正常工作。但是当我尝试使用以下命令列出代码时,它无法列出

select GET_DDL('FUNCTION','UDF_GetCountArea(VARCHAR,VARCHAR)');

sql编译错误:对象'UDF_GetCountScope(VARCHAR,VARCHAR,VARCHAR)'

不存在或未被授权。

还可以在某处进行设置,以允许在SF对象窗口中列出UDF和SP吗?

解决方法

创建函数时,您将函数名称用双引号引起来,因此该函数名为UDF_GetCountArea。但是,在调用GET_DDL()函数时,您没有将名称用双引号引起来,并且在Snowflake中,所有标识符均按DEFAULT大写,因此您需要一个名为UDF_GETCOUNTAREA的函数,但是不存在这样的功能。为了检索您创建的功能的DDL,可以使用:

select GET_DDL('FUNCTION','"UDF_GetCountArea"(VARCHAR,VARCHAR,VARCHAR)');
;

也就是说,我强烈建议您避免使用带引号的标识符,除非您绝对需要使用它们。为此,您需要删除现有功能:

DROP FUNCTION "UDF_GetCountArea"(VARCHAR,VARCHAR)

,然后以新名称重新创建函数:

CREATE OR REPLACE FUNCTION CONSUMPTION.UDF_GETCOUNTAREA (
  LOCN_CLASS      VARCHAR,LOCN_SIZE_TYPE  VARCHAR,ZONE            VARCHAR,LOCN_AISLE      VARCHAR
)
RETURNS VARCHAR AS
$$
...