首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用游标的动态表名

不使用游标的动态表名
EN

Stack Overflow用户
提问于 2017-03-20 00:25:53
回答 1查看 507关注 0票数 1

我想在for循环中使用动态表名。我知道用游标解决这个问题是有办法的。但是我想知道是否有一个没有游标的解决方案,因为我当前的代码具有泛型for循环(隐式游标),我想知道是否可以以同样的方式保留它,而不必使用显式游标。

现在对我有用的是:

代码语言:javascript
复制
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循环中使用它。在重新设计整个过程以使用显式游标之前,我只是想在这里检查一下(与隐式相比,我不太喜欢性能)。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-20 01:13:17

您可以使用EXECUTE IMMEDIATE对集合进行BULK COLLECT INTO,并通过以下循环进行循环:

甲骨文12c

代码语言:javascript
复制
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作用域中声明它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42894080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档