问题陈述:我们希望将对所有外部STAGES的直接访问限制为所有USER'S或DEVELOPER'S。我们希望可以使用LIST命令通过存储过程或表UDF访问这些STAGE。
我们有以下两种可行的解决方案:
解决方案1
编写一个存储过程,并返回一个列表命令结果集,该结果集为具有列定界符(即|)和记录定界符(即换行符)的单个数组或varchar
在使用RESULT_SCAN(),LAST_QUERY_ID()和LATERAL SPLIT_TO_TABLE()函数调用上述存储过程之后,运行视图以类似于原始LIST命令的平坦行级输出形式显示结果。
限制
解决方案2
以上两种解决方案都对我们来说很好用,但是使用存储过程方法时,仅调用存储过程就不能将结果视为表格格式。由于雪花不支持“ dbms_output.put_line()”之类的PL / SQL函数。
这始终是两步解决方案。
期望的解决方案
我们想在一次调用中查看存储过程或UDF的输出,并具有类似的表示形式,就像Snowflake Web UI工作表中的任何其他查询输出一样。
我们想知道是否有可能在雪花UDF或UDTF中使用LIST命令,那么像SQL或JAVASCRIPT这样的任何语言都将对我们有用。
否则,如果我们可以在UDF中调用存储过程(即上述两种解决方案中所述的方法),这也将满足我们的需求。
请告知我们上述任何预期输出是否有可能的解决方案。
答案 0 :(得分:0)
我对要求没有完全理解,但是您是否正在尝试执行以下操作
CREATE OR REPLACE PROCEDURE LIST_EXTERNAL_STAGE(stage_name varchar)
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var return_stage_rows = [];
var snowstmt = snowflake.createStatement({
sqlText: 'LIST '+ STAGE_NAME
});
var query_result = snowstmt.execute();
var end_of_table = snowstmt.getRowCount();
var counter = 0;
while (counter <= end_of_table) {
query_result.next();
return_stage_rows.push(query_result.getColumnValue(1),query_result.getColumnValue(2),query_result.getColumnValue(3),query_result.getColumnValue(4))
counter += 1;
}
return return_stage_rows;
$$;
call LIST_EXTERNAL_STAGE('@EMPLOYEE_STAGE');