title: bulk collect ...for all usage
body: <p>I want to understand the usage and need for bulk collect <code>forall</code> statements.</p>
  
  <p>An example mentioned <a href="http://www.dba-oracle.com/oracle_news/news_plsql_forall_performance_insert.htm" rel="nofollow">here</a> </p>
  
  <p>In most examples in different web pages; authors first fetch data from a table by using bulk collect statements. After that, they are inserting it into target table by using the <code>forall</code> statement.</p>
  
  <pre><code>DECLARE
  TYPE prod_tab IS TABLE OF products%ROWTYPE;
  products_tab   prod_tab := prod_tab();
   BEGIN
  -- Populate a collection - 100000 rows
  SELECT * BULK COLLECT INTO products_tab FROM source_products;
  
  FORALL i in products_tab.first .. products_tab.last
   INSERT INTO target_products VALUES products_tab(i);
  </code></pre>
  
  <p>But I do not understand when to choose this method. I think I can write the code like below:</p>
  
  <pre><code>INSERT INTO target_products
  SELECT * FROM SOURCE_PRODUCTS;
  </code></pre>
  
  <p>And I think, insert into select statement can work more performance.</p>
  
  <p>So why we need to choose bulk collect <code>forall</code> statements? For error logging or any other advantages?</p>