暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle PLSQL比较中的游标代码

ASKTOM 2020-07-25
289

问题描述

我想比较下面的光标示例。我想知道哪一个对处理数据的1000万记录更好。

以及如何检查内部执行计划和内部流程。

declare

  type type_1 is table of user_tab_columns%rowtype;

  cursor cursor_1(p_table_name varchar2) is
    select * from user_tab_columns s where s.table_name = p_table_name;

  v_type_1 type_1;

begin
  open cursor_1('TABLE_NAME_1');
  fetch cursor_1 bulk collect
    into v_type_1;
  close cursor_1;

  for i in v_type_1.first .. v_type_1.last loop
    dbms_output.put_line(' ' || v_type_1(i).column_id ||
                         ' ' || v_type_1(i).column_name ||
                         ' ' || v_type_1(i).data_type);
  end loop;

end;

------------------------------------------------------------
declare

  cursor cursor_2(p_table_name varchar2) is
    select * from user_tab_columns s where s.table_name = p_table_name;

begin

  for i in cursor_2('TABLE_NAME_1') loop
    dbms_output.put_line(' ' || i.column_id || ' ' || i.column_name || ' ' ||
                         i.data_type);
  end loop;

end;
------------------------------------------------------------

declare

  cursor cursor_3(p_table_name varchar2) is
    select * from user_tab_columns s where s.table_name = p_table_name;
  v_type cursor_3%rowtype;

begin

  open cursor_3('TABLE_NAME_1');
  loop
    fetch cursor_3
      into v_type;
    dbms_output.put_line(' ' || v_type.column_id || ' ' ||
                         v_type.column_name || ' ' || v_type.data_type);
    exit when cursor_3%notfound;
  end loop;
  close cursor_3;

end;

专家解答

好吧,让我们称它们为cursor1,cursor2和cursor3

cursor1

对于小数据 (例如多达100万条记录) 来说很好,但是您正在将所有数据放入内存中,因此,如果您尝试将100亿行带回... 这可能会使您的会话崩溃

cursor2

可能会像cursor1一样快地运行,因为我们分批获取100,不会有任何内存问题,很容易编码

cursor3

一次获取1行,将是最慢的 (很长一段路)。如果您打算进行提取,但可能需要在少量记录后过早结束循环,则很好。

对于您的99% 代码,cursor2可能是您的转到选项。

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论