Professional Documents
Culture Documents
Bulk Collect
Bulk Collect
Simay Alpge
AGENDA
Performance gains with Bulk Binding Array processing with BULK COLLECT and FORALL Error handling. Native Dynamic SQL with Bulk binding. Typical problems. Oracle 10g FORALL improvements.
FETCH statements
Table.column%TYPE
DECLARE TYPE CustList IS TABLE OF Customer.Customer_Account_Id%TYPE INDEX BY BINARY_INTEGER; Custs CustList; CURSOR c1 IS SELECT customer_account_id FROM Customer WHERE effective_date BETWEEN TO_DATE(01-JANTO_DATE(01-JAN-2004, DD-MON-RRRR) AND DD-MONTRUNC(SYSDATE); BEGIN OPEN c1; FETCH c1 BULK COLLECT INTO Custs; CLOSE c1; END;
SELECT statement
Table%ROWTYPE
DECLARE TYPE Cust_tab IS TABLE OF Customers_Active%ROWTYPE; Custs Cust_tab; BEGIN SELECT Customer_Account_Id, Effective_Date, Expired_Date BULK COLLECT INTO Custs FROM Customers_Active WHERE Effective_date BETWEEN TO_DATE(01-JANTO_DATE(01-JAN-2004 , DD-MON-RRRR) AND DD-MONTRUNC(SYSDATE); END;
April 14, 2004 Next Information Systems 9
FETCH statement
CURSOR%ROWTYPE
DECLARE CURSOR c1 IS SELECT Customer_Account_Id, Effective_Date,Expired_Date FROM Customer WHERE Effective_Date BETWEEN TO_DATE(01-JanTO_DATE(01-Jan-2004, DD-MON-RRRR) ANDTRUNC(SYSDATE); DD-MONTYPE Cust_tab IS TABLE OF C1%ROWTYPE; Custs Cust_tab; BEGIN OPEN c1; LOOP FETCH c1 BULK COLLECT INTO Custs LIMIT 100; EXIT WHEN c1%NOTFOUND; END LOOP; END ;
April 14, 2004 Next Information Systems 10
12
In-Bind Binding InDECLARE CURSOR c1 SELECT Customer_Account_Id, Effective_Date,Expired_Date FROM Customer WHERE Effective_Date BETWEEN TO_DATE(01-Jan-2003, DD-MONTO_DATE(01-JanDD-MONRRRR) And TO_DATE(01-Jan-2004, DD-MON-RRRR); TO_DATE(01-JanDD-MONTYPE Cust_tab IS TABLE OF C1%ROWTYPE; Custs Cust_tab; BEGIN OPEN c1; LOOP FETCH c1 BULK COLLECT INTO Custs LIMIT 100; END LOOP; FORALL i IN 1 .. Custs.COUNT SAVE EXCEPTIONS INSERT into Customer_History VALUES Custs (i); .
April 14, 2004 Next Information Systems 13
14
Typical Problems
FORALL limitations
SINGLE DML (INSERT, UPDATE, DELETE) statement is allowed. No IF condition within FORALL. For multi table INSERT/UPDATE use WHEN clause instead of IF condition. No DBMS_OUTPUT or other OUTPUT statements within FORALL. No SELECT .. BULK COLLECT within FORALL statement.
Next Information Systems 15
OutOut-Bind binding
DECLARE TYPE AcctTab IS TABLE OF Acct_Install.Customer_Account_id%TYPE; Acusts AcctTab; BEGIN DELETE FROM Acct_Install WHERE INSTALL_DATE = TRUNC(TO_DATE(01-jan-1970,DD-MONTRUNC(TO_DATE(01-jan-1970,DD-MON-RRRR) RETURNING Customer_Account_Id BULK COLLECT INTO Acusts; END;
16
19
20
BEGIN
SELECT CUSTOMER_ID, PHONE_NBR, EFF_DATE, EXPIRED_DATE BULK COLLECT INTO CUSTIDS, PHONES, EFFDTS, EXPDTS; FROM CUSTOMER WHERE Effective_Date BETWEEN TO_DATE(01-JanTO_DATE(01-Jan-2003, DD-MON-RRRR) And DD-MONTO_DATE(01-JanTO_DATE(01-Jan-2004, DD-MON-RRRR); DD-MONEND;
21
22
Questions
23
THANK YOU
dbasig@nyoug.org alpoge@nextinfosys.com
24