我们可以在雪花中的UDF或UDTF内执行列表命令或存储过程吗?

时间:2020-08-08 19:31:05

标签: stored-procedures user-defined-functions snowflake-cloud-data-platform

问题陈述:我们希望将对所有外部STAGES的直接访问限制为所有USER'S或DEVELOPER'S。我们希望可以使用LIST命令通过存储过程或表UDF访问这些STAGE。

我们有以下两种可行的解决方案:

解决方案1 ​​

  1. 编写一个存储过程,并返回一个列表命令结果集,该结果集为具有列定界符(即|)和记录定界符(即换行符)的单个数组或varchar

  2. 在使用RESULT_SCAN(),LAST_QUERY_ID()和LATERAL SPLIT_TO_TABLE()函数调用上述存储过程之后,运行视图以类似于原始LIST命令的平坦行级输出形式显示结果。

限制

  1. 由于视图正在使用LAST_QUERY_ID和RESULT_SCAN函数,因此必须在每次选择打开视图之前调用SP,否则选择关闭视图将失败。

解决方案2

  1. 编写存储过程并在其中创建易失表以存储列表命令结果。
  2. 在由上述存储过程创建的易失表上运行选择查询。

以上两种解决方案都对我们来说很好用,但是使用存储过程方法时,仅调用存储过程就不能将结果视为表格格式。由于雪花不支持“ dbms_output.put_line()”之类的PL / SQL函数。

这始终是两步解决方案。

  1. 调用存储过程
  2. 使用RESULT_SCAN(),LAST_QUERY_ID()函数或在存储过程内部创建表来查看该存储过程输出的结果,并在存储过程执行完成后对创建的表运行查询。

期望的解决方案

  1. 我们想在一次调用中查看存储过程或UDF的输出,并具有类似的表示形式,就像Snowflake Web UI工作表中的任何其他查询输出一样。

  2. 我们想知道是否有可能在雪花UDF或UDTF中使用LIST命令,那么像SQL或JAVASCRIPT这样的任何语言都将对我们有用。

  3. 否则,如果我们可以在UDF中调用存储过程(即上述两种解决方案中所述的方法),这也将满足我们的需求。

请告知我们上述任何预期输出是否有可能的解决方案。

1 个答案:

答案 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');

enter image description here