问题 - 我只获取最后一个循环执行的结果集
问题:如何连接/添加到结果集?
详情
我正在尝试做的事情:
c_row CURSOR FOR SELECT PatientID, PIDATE FROM table_1
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;
我们可以使用临时表来保存中间结果并返回它。
另外一个好的做法是,我们应该在 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;