首页 > 解决方案 > 在 Snowflake UDF 中查询“list stage”

问题描述

我正在尝试编写一个 Snowflake UDF,它接受阶段名称和特定文件夹名称作为输入参数,并返回最新的文件 ID(从完整文件名中剥离)作为输出。谁能帮助我用一个简单的代码来实现这一点?

标签: snowflake-cloud-data-platform

解决方案


我不确定您是否需要 UDF 或存储过程。创建的语法类似,所以我认为这会有所帮助。这是一个存储过程,它将从给定的阶段和路径获取最新的暂存文件。请注意limit 1in 查询,多个暂存文件可能共享相同的上次修改日期,而此过程返回标量(单个)值。

存储过程定义

create or replace procedure "MYDB"."MYSCHEMA"."LATEST_STAGED_FILE"(stage_name text, folder text) 
returns string not null 
language javascript  
execute as caller 

as 
$$ 
var sql_text = "list @" + STAGE_NAME + "/" + FOLDER ; 
var sql_command0 = snowflake.createStatement({ sqlText: sql_text}); 
var sql_command1 = snowflake.createStatement({ sqlText:`SELECT "name" FROM table(result_scan(last_query_id())) WHERE "last_modified" = (select MAX("last_modified") from table(result_scan(last_query_id()))) LIMIT 1;`});

try { 
    sql_command0.execute();
    var resultSet = sql_command1.execute(); 
    while(resultSet.next()) 
    {  
        var resultFile = resultSet.getColumnValue('name').split("/")
        return resultFile[resultFile.length - 1]
    }
}
catch (err) { 
    return "Failed: " + err;
}
$$;

然后,您可以调用存储过程,如

call "MYDB"."MYSCHEMA"."LATEST_STAGED_FILE"('MYDB.MYSCHEMA.MYSTAGE', 'mypath/myotherpath');

参考

从列表中选择@

通过 SP 列出阶段


推荐阅读