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