如何评估雪花存储过程中的语句

Posted

技术标签:

【中文标题】如何评估雪花存储过程中的语句【英文标题】:How do I evaluate a statement in a Snowflake Stored Procedure 【发布时间】:2020-01-15 18:35:22 【问题描述】:

我需要使用 JSON 文档创建计算。使用像 10+10-3 这样的简单示例,我想评估语句,但 Snowflake javascript 不允许我评估语句,有人知道如何评估基于 json 的计算结果吗?我已经能够将每个输入分配给一个变量,然后执行一个 select 语句来获得结果,但是这是相当费力的。

【问题讨论】:

您的程序脚本或示例将有助于我们了解您要完成的工作 我的代码包含太多对专有数据的引用。这个问题基本上是询问有关如何评估“表”中定义的计算的任何想法,实际计算非常复杂,并且有多个步骤。我正在使用一个 json 文档,其结构定义了应该如何执行计算。创建视图不是一种选择,因为有 1000 种自定义计算依赖于使用的客户。目前我正在将定义传递给 Python,但最终最好在 Snowflake 中完成所有工作。 【参考方案1】:

eval() 函数确实给出了错误:JavaScript execution error: Uncaught EvalError: Dynamic code evaluation disallowed

一种解决方法是将表达式注入到 SELECT 语句中,如下所示:

create or replace procedure p(S varchar)
returns number
language javascript
as
$$
    const rs = snowflake.execute( sqlText: `SELECT $S` )
    rs.next()
    return rs.getColumnValue(1)
$$;

call p('1+1');

但要小心 SQL 注入。或者实现一个简单的 javascript 中缀表达式解析器。

【讨论】:

是的,我使用了方法,但是我有 1000 次计算,并且它们有多个步骤,每个步骤的长度和步骤都不同。 单个 SELECT 语句可以有大量的多步算术表达式。 (并且可能在整个集群中并行执行。)。但我们是在谈论算术表达式还是任意 javascript 程序/算法?在任何情况下,我知道从 Snowflake 过程中执行动态 javascript 的唯一方法是让该过程创建一个 UDF,然后调用它。我对它进行了测试,它可以工作,但它是一个 hack。

以上是关于如何评估雪花存储过程中的语句的主要内容,如果未能解决你的问题,请参考以下文章

如何获取雪花中执行存储过程的名称?

可以从雪花中的函数调用存储过程吗

雪花中的存储过程中是不是有打印命令

雪花存储过程多语句列表参数

如何在雪花中调用另一个存储过程中的存储过程

雪花存储过程调用具有迭代返回消息的多个语句