A coworker passed a test script on to me that was failing with the following memory error:
ORA-04030: out of process memory when trying to allocate 4088 bytes (PLS CGA hp,pdzgM64_New_Link)
The error occurred when initializing a PL/SQL table variable with 7500 objects. Here is my sanitized version of the code:
CREATE OR REPLACE TYPE ARRAY_ELEMENT AS OBJECT ( n1 NUMBER, n2 NUMBER, n3 NUMBER, n4 NUMBER ); / CREATE OR REPLACE TYPE MY_ARRAY IS TABLE OF ARRAY_ELEMENT; / DECLARE MY_LIST MY_ARRAY; BEGIN MY_LIST := MY_ARRAY( ARRAY_ELEMENT(1234,5678,1314,245234), ARRAY_ELEMENT(1234,5678,1314,245234), ARRAY_ELEMENT(1234,5678,1314,245234), ... ARRAY_ELEMENT(1234,5678,1314,245234), ARRAY_ELEMENT(1234,5678,1314,245234) );
The real code had different meaningful constants for each entry in the table. Here is the error:
8004 ARRAY_ELEMENT(1234,5678,1314,245234) 8005 ); 8006 8007 END; 8008 / DECLARE * ERROR at line 1: ORA-04030: out of process memory when trying to allocate 4088 bytes (PLS CGA hp,pdzgM64_New_Link) Elapsed: 00:02:51.31
I wrapped the error code manually so it would fit on the page.
The solution looks like this:
create table MY_OBJECTS ( o ARRAY_ELEMENT ); DECLARE MY_LIST MY_ARRAY; BEGIN MY_LIST := MY_ARRAY( ); insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); ... insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); commit; SELECT o BULK COLLECT INTO MY_LIST FROM MY_OBJECTS; END; /
Here is what the successful run looks like:
8004 insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); 8005 insert into MY_OBJECTS values(ARRAY_ELEMENT(1234,5678,1314,245234)); 8006 8007 commit; 8008 8009 SELECT o 8010 BULK COLLECT INTO MY_LIST 8011 FROM MY_OBJECTS; 8012 8013 END; 8014 / PL/SQL procedure successfully completed. Elapsed: 00:00:21.36 SQL>
There is an Oracle document about this bug:
ORA-4030 (PLSQL Opt Pool,pdziM01_Create: New Set), ORA-4030 (PLS CGA hp,pdzgM64_New_Link) (Doc ID 1551115.1)
It doesn’t have using bulk collect as a work around. My situation could be only useful in very specific cases but I thought it was worth sharing it.
Here are my scripts and their logs: zip
This is on HP-UX Itanium Oracle 11.2.0.3.
Bobby