Snowflake - 如何循环添加到 RESULTSET

问题描述 投票:0回答:1

问题 - 我只获取最后一个循环执行的结果集

问题:如何连接/添加到结果集?

详情

我正在尝试做的事情:

  1. 使用 CURSOR 从表 1 中获取患者 ID 和日期
c_row CURSOR FOR SELECT PatientID, PIDATE FROM table_1
  1. 表_1示例

table_1

  1. 根据游标的值对表 2 构建并运行动态查询。将结果添加到 RESULTSET 以便在循环完成时返回。
for r_row in c_row do
        v_SQL := 'SELECT * FROM table_2 where patientid =' || r_row.PatientID || ' AND TO_DATE(time) < ''' || r_row.PIDATE ||'\'';
        rs_out := (EXECUTE IMMEDIATE :v_SQL);
END FOR;
RETURN TABLE(rs_out);
CLOSE c_row;

预期结果:使用 table_1 的每一行生成的查询结果将填充到结果集 (rs_out)

实际结果:仅返回上次执行的结果

我很确定这是因为 rs_out 不断被查询结果覆盖而不是连接。

rs_out := rs_out || (立即执行:v_SQL);导致错误:)

我可能会 INSERT 到表中,而不是使用结果集,但不确定它将如何工作,因为步骤 2 中的动态查询可能会返回多行..

任何帮助都将有助于我的工作保障:)感谢您的时间

完整代码

DECLARE 
    v_SQL text;
    c_row CURSOR FOR SELECT PatientID, PIDATE FROM table_1;
    rs_out RESULTSET;
BEGIN
    for r_row in c_row do
        v_SQL := 'SELECT * FROM table_2 where patientid =' || r_row.PatientID || ' AND TO_DATE(time) < ''' || r_row.PIDATE ||'\'';
        rs_out := (EXECUTE IMMEDIATE :v_SQL);
    END FOR;
    RETURN TABLE(rs_out);
    CLOSE c_row;
END;

sql snowflake-cloud-data-platform cursor resultset
1个回答
0
投票

我们可以使用临时表来保存中间结果并返回它。

另外一个好的做法是,我们应该在 return 语句之前关闭游标,否则该行将永远不会执行。

找到下面的示例代码:

DECLARE 
    v_SQL text;
    c_row CURSOR FOR SELECT PatientID, PIDATE FROM table_1;
    rs_out RESULTSET;
BEGIN
    create or replace temporary table temp_result like table_2;
    
    for r_row in c_row do
        
        v_SQL := 'insert into temp_result SELECT * FROM table_2 where patientid =' || r_row.PatientID || ' AND TO_DATE(time) <= ''' || r_row.PIDATE ||'\'';
        EXECUTE IMMEDIATE :v_SQL;
        
    END FOR;
    CLOSE c_row;
    rs_out := (select* from temp_result);
    RETURN TABLE(rs_out);
    
END;
© www.soinside.com 2019 - 2024. All rights reserved.