问题描述
我在之前的一篇文章 (Cursors in BigQuery) 中找到了一种在 bigquery 上声明游标的方法。当游标子查询不作为参数存在时,这很有效。
目前我正在 Netezza 中完成 FOR..IN EXECUTE
构造。除了这里的 sql 是动态 sql 之外,它的行为完全类似于游标构造。这个动态 sql 首先执行,然后构造归结为一个简单的游标语句。
考虑以下用例,其中子查询作为参数存在。
CREATE or replace PROCEDURE myproc(varchar(256))
RETURNS INT4
LANGUAGE NZPLSQL
AS
BEGIN_PROC
declare
sqlstr alias for $1; ---- sqlStr is a parameter
r1 record;
begin
FOR r1 IN EXECUTE sqlstr ---- sqlStr is evaluated after that it boils down to cursor statement.
loop
insert into t1 values r1.c1;
end loop;
end;
END_PROC@
是否有类似的方法来声明带有子查询的游标作为 BigQuery 上的参数?
解决方法
从形式上讲,LOOP 和 EXECUTE IMMEDIATE 在 BigQuery 中都可用并且有很好的文档记录。
实际上 - 使用 LOOP 来模拟真实表的游标是非常低效的,并且在 BigQuery 中是非常禁忌的,除非您有用例,这是唯一的方法
但几乎在 100% 的情况下,您可以以批处理方式表达您的逻辑(而不是使用游标)
同时,如果表不是那么大(例如查找表文件)-您可以将表行选择到数组中,然后循环遍历数组元素运行执行立即获取结果并将其插入到目标表中