我想在for循环中使用动态表名。我知道用游标解决这个问题是有办法的。但是我想知道是否有一个没有游标的解决方案,因为我当前的代码具有泛型for循环(隐式游标),我想知道是否可以以同样的方式保留它,而不必使用显式游标。
现在对我有用的是:
BEGIN
for itr in (select var1,var2,var3,var4 from schedule_table)
loop
--work using itr.var1, itr.var2, itr.var3, itr.var4
end loop
END我想知道是否存在,我可以使用相同类型的for循环,但是动态地将表名传递给它。我查看了立即执行动态sql选项,但我认为我无法在for循环中使用它。在重新设计整个过程以使用显式游标之前,我只是想在这里检查一下(与隐式相比,我不太喜欢性能)。
谢谢。
发布于 2017-03-20 01:13:17
您可以使用EXECUTE IMMEDIATE对集合进行BULK COLLECT INTO,并通过以下循环进行循环:
甲骨文12c
DECLARE
TYPE t_rec IS RECORD( fname VARCHAR2(100), lname VARCHAR2(100) );
TYPE t_tab IS TABLE OF t_rec;
t t_tab;
v_table_name VARCHAR2(128) := 'HR.EMPLOYEES';
BEGIN
EXECUTE IMMEDIATE 'SELECT first_name, last_name FROM ' || v_table_name
BULK COLLECT INTO t;
FOR i IN 1 .. t.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( t(i).fname || ' ' || t(i).lname );
END LOOP;
END;
/注意:在Oracle 10/11中,您需要在SQL作用域中创建集合类型。在Oracle 12中,您可以在PL/SQL作用域中声明它。
https://stackoverflow.com/questions/42894080
复制相似问题