--> PL/SQL Normal Insert and Bulk Insert
CREATE TABLE XXAA_INSERT_TEST (
  id           NUMBER(10),
  code         VARCHAR2(10),
 
description  VARCHAR2(50));
ALTER TABLE XXAA_INSERT_TEST ADD (CONSTRAINT XXAA_INSERT_TEST_pk PRIMARY KEY (id));
ALTER TABLE XXAA_INSERT_TEST ADD (CONSTRAINT XXAA_INSERT_TEST_uk UNIQUE (code));
SET SERVEROUTPUT ON
DECLARE
  TYPE t_XXAA_INSERT_TEST_tab IS TABLE OF XXAA_INSERT_TEST%ROWTYPE;
  l_tab    t_XXAA_INSERT_TEST_tab := t_XXAA_INSERT_TEST_tab();
  l_start  NUMBER;
  l_size   NUMBER            := 10000;
BEGIN
  -- Populate collection.
  FOR i IN 1 .. l_size 
  LOOP
    l_tab.extend;
    l_tab(l_tab.last).id          :=
i;
    l_tab(l_tab.last).code        :=
TO_CHAR(i);
    l_tab(l_tab.last).description := 'Description: ' || TO_CHAR(i);
  END LOOP;
  EXECUTE IMMEDIATE 'TRUNCATE TABLE
XXAA_INSERT_TEST';
  -- Time regular inserts.
  l_start := DBMS_UTILITY.get_time;
  FOR i IN l_tab.first .. l_tab.last LOOP
    INSERT INTO XXAA_INSERT_TEST (id, code, description)
    VALUES (l_tab(i).id, l_tab(i).code, l_tab(i).description);
  END LOOP;
  DBMS_OUTPUT.put_line('Normal Inserts: ' || (DBMS_UTILITY.get_time - l_start));
  EXECUTE IMMEDIATE 'TRUNCATE TABLE
XXAA_INSERT_TEST';
  -- Time bulk inserts.  
  l_start := DBMS_UTILITY.get_time;
  FORALL i IN l_tab.first .. l_tab.last
    INSERT INTO XXAA_INSERT_TEST VALUES l_tab(i);
  DBMS_OUTPUT.put_line('Bulk Inserts  : ' || (DBMS_UTILITY.get_time - l_start));
  COMMIT;
END;
 
No comments:
Post a Comment