Varray of Objects: Initializing, Instantiation, Constructors, ORA-06531
This is supposed to fill a varray with ten objects, calling methods in those objects and populating the objects from queries, then display fields from the objects via methods. Error message is in comment at bottom. Any ideas?
-- Enable screen I/O
SET SERVEROUTPUT ON SIZE 1000000
SET VERIFY OFF
-- object spec
CREATE OR REPLACE TYPE employee4 AS OBJECT
o_ename CHAR (20 char),
o_empno NUMBER (4),
o_sal NUMBER (10),
o_thisno NUMBER (4),
MEMBER FUNCTION get_o_ename RETURN CHAR, MEMBER PROCEDURE set_o_ename (o_thisno IN number),
MEMBER FUNCTION get_o_empno RETURN NUMBER, MEMBER PROCEDURE set_o_empno (o_thisno IN number),
MEMBER FUNCTION get_o_sal RETURN NUMBER, MEMBER PROCEDURE set_o_sal (o_thisno IN number),
CONSTRUCTOR FUNCTION employee4 (o_ename CHAR,o_empno NUMBER,o_sal NUMBER,o_thisno NUMBER) RETURN SELF AS RESULT
-- object body
CREATE OR REPLACE TYPE BODY employee4 AS
CONSTRUCTOR FUNCTION employee4 (o_ename IN CHAR,
o_empno IN NUMBER,
o_sal IN NUMBER,
o_thisno IN NUMBER)
RETURN SELF AS RESULT IS
BEGIN
SELF.o_ename := o_ename;
SELF.o_empno := o_empno;
SELF.o_sal := o_sal;
SELF.o_thisno := o_thisno;
RETURN;
END;
-- gets
MEMBER FUNCTION get_o_ename RETURN CHAR IS
BEGIN
RETURN self.o_ename;
END;
MEMBER FUNCTION get_o_empno RETURN NUMBER IS
BEGIN
RETURN self.o_empno;
END;
MEMBER FUNCTION get_o_sal RETURN NUMBER IS
BEGIN
RETURN self.o_ename;
END;
-- sets
MEMBER PROCEDURE set_o_ename(o_thisno IN number) IS
BEGIN
SELECT ename INTO SELF.o_ename FROM emp WHERE empno = SELF.o_thisno;
END;
MEMBER PROCEDURE set_o_empno(o_thisno IN number) IS
BEGIN
SELECT empno INTO SELF.o_empno FROM emp WHERE empno = SELF.o_thisno;
END;
MEMBER PROCEDURE set_o_sal(o_thisno IN number) IS
BEGIN
SELECT sal INTO SELF.o_sal FROM emp WHERE empno = SELF.o_thisno;
END;
END;
DECLARE
-- a varray of employees
TYPE emp_varray1 IS VARRAY(10) OF employee4;
varray_of_emps EMP_VARRAY1;
-- List of EMPNO's in order of appearance in EMP table (for cross-referencing, single-line retrieval)
TYPE MYCREF_VARRAY IS VARRAY(10) OF NUMBER(4);
varray_mycref MYCREF_VARRAY := MYCREF_VARRAY(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-- make a variable to store one empno
thisno NUMBER(4);
-- make a counter
counter INT;
-- query variables for the set calls
q_ename CHAR(20 CHAR);
q_empno NUMBER(4);
q_sal NUMBER(10);
BEGIN
-- Put the first 10 EMPNO's in my cref array
SELECT empno BULK COLLECT INTO varray_mycref FROM emp WHERE ROWNUM < 11;
-- Use a loop to retrieve the first 10 objects in the "emp" table and put them in the varray of objects
FOR counter IN 1..10 LOOP
thisno := varray_mycref(counter);
varray_of_emps(counter).set_o_ename(thisno);
varray_of_emps(counter).set_o_empno(thisno);
varray_of_emps(counter).set_o_sal(thisno);
END LOOP;
-- Use another loop to display the information in the reverse order.
FOR counter in REVERSE 1..10 LOOP
dbms_output.put_line((varray_of_emps(counter).get_o_ename()) || CHR(9) || (varray_of_emps(counter).get_o_empno()) || CHR(9) || (varray_of_emps(counter).get_o_sal()));
END LOOP;
END;
This results in the following response in SQL*PLUS:
Type created.
Type body created.
DECLARE
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 33
Hi,
From metalink:
Cause: An element or member function of a nested table or varray was
referenced (where an initialized collection is needed) without the
collection having been initialized.
Action: Initialize the collection with an appropriate constructor or
whole-object assignment.
ORA 6531 Reference to uninitialized collection (Doc ID 48912.1)
Similar Messages
-
HI
what is solution for this error --urget
ORA-06531: Reference to uninitialized collection
regards
YashavanthThe desc of error seems explain enough :
ORA-06531 Reference to uninitialized collectionCause: An element or member function of a nested table or VARRAY was referenced (where an initialized collection is needed) without the collection having been initialized.
Action: Initialize the collection with an appropriate constructor or whole-object assignment.
Nicolas. -
ORA-06531 reference to uninitialized collection in oracle 6i form
Hello,
I am importing data from excel to database table with column mapping (oracle 6i forms)using ole2 package, then calling package
which is having a procedure. while executing the package procedure,
I am getting error 'ora-06531 reference to uninitialized collection' i.e. before for i in 1..in_lData.count
I am working on it but still not getting any solution. There is no problem in coding my form gets compiled but at run time i am getting this error.
And while debugging, data fetched from ole2 package is not passed to for loop of the procedure.
(first of all i am calling ole 2 package, then from ole2 package i am calling my package. procedure)
please help me. My code is this
------------------------------------------------------Ole 2 Package begins-----------------------------------------------------------------
PROCEDURE get_excel IS
APPLICATION OLE2.OBJ_TYPE;
WORKBOOKS OLE2.OBJ_TYPE;
WORKBOOK OLE2.OBJ_TYPE;
WORKSHEETS OLE2.OBJ_TYPE;
WORKSHEET OLE2.OBJ_TYPE;
CELL OLE2.OBJ_TYPE;
CTR NUMBER(12);
COLS NUMBER(2);
CELLVALUE VARCHAR2(89);
C_ROUTE VARCHAR2(255);
V_ROUTE VARCHAR2(1000);
C_TRNDATE VARCHAR2(255);
V_TRNDATE VARCHAR2(1000);
C_TTIME VARCHAR2(255);
V_TTIME VARCHAR2(1000);
C_TID VARCHAR2(255);
V_TID VARCHAR2(1000);
FILENAME VARCHAR2(500);
v_path varchar2(1000):=:path;
ARGS OLE2.OBJ_TYPE;
tDataList PK_EXCEL_TO_DB.tDataList;
BEGIN
:progress:='Please wait...';
SYNCHRONIZE;
--------------INITIATE EXCEL APPLICATION---------------------------
filename := V_PATH;--GET_FILE_NAME('c:\', File_Filter=>'Excel Files (*.xls)|*.xls|'); -- to pick the file
APPLICATION := OLE2.CREATE_OBJ('EXCEL.APPLICATION');
OLE2.SET_PROPERTY(APPLICATION,'VISIBLE','FALSE');
----------------GET WORKBOOKS FROM EXCEL APPLICATION---------------
WORKBOOKS := OLE2.GET_OBJ_PROPERTY(APPLICATION, 'WORKBOOKS');
----------------OPEN REQUIRED WORKBOOK-----------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS, FILENAME);
WORKBOOK := OLE2.GET_OBJ_PROPERTY(WORKBOOKS,'OPEN',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
----------------OPEN REQUIRED WORKSHEET---------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,'Sheet1');
WORKSHEET := OLE2.GET_OBJ_PROPERTY (WORKBOOK,'WORKSHEETS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
----------------GET CELL VALUE-------------------------------------
ctr := 2; --row number
cols := 1; -- column number
FIRST_RECORD;
LOOP
-----------------------COLUMN1-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS); --COLS
OLE2.ADD_ARG(ARGS,1);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_ROUTE := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,1);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_ROUTE := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
-----------------------COLUMN2-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS);
OLE2.ADD_ARG(ARGS,2);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_TRNDATE:= OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,2);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_TRNDATE:= OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
-----------------------COLUMN3-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS);
OLE2.ADD_ARG(ARGS,3);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_TTIME := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,3);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_TTIME := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
-----------------------COLUMN4-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS);
OLE2.ADD_ARG(ARGS,4);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_TID := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,4);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_TID := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
PK_EXCEL_TO_DB.PR_DO_INSERT(tDataList);
EXIT WHEN length(V_Route) = 0 or length(V_Route) is null;
ctr := ctr + 1;
cols := 1;
i_ldata := PK_EXCEL_TO_DB.tDatalist(); --already define
PK_EXCEL_TO_DB.PR_DO_INSERT(tDataList);
END LOOP;
:progress:='EXCEL READING IS DONE...';
----------------CLOSE THE EXCEL SHEET AFTER READING--------------
OLE2.INVOKE(APPLICATION,'QUIT');
-----------------RELEASE ALL OBJECTS
OLE2.RELEASE_OBJ(CELL);
OLE2.RELEASE_OBJ(WORKSHEET);
OLE2.RELEASE_OBJ(WORKBOOK);
OLE2.RELEASE_OBJ(WORKBOOKS);
OLE2.RELEASE_OBJ(APPLICATION);
:PROGRESS := 'DATA INSERTED INTO THE TABLE '; SYNCHRONIZE;
SYNCHRONIZE;
exception
WHEN OTHERS THEN
MESSAGE(sqlerrm);
END;
----------------------------------------------------------------------------------------OLE2 PACKAGE ENDS-------------------------------------------------
------------------------------------------------------------PK_EXCEL_TO_DB PACKAGE SPECIFICATION---------------------------------------------
PACKAGE PK_EXCEL_TO_DB IS
TYPE tKeyValue IS RECORD (
CROUTE VARCHAR2(255),
VROUTE VARCHAR2(1000),
CTRNDATE VARCHAR2(255),
VTRNDATE VARCHAR2(1000),
CTTIME VARCHAR2(255),
VTTIME VARCHAR2(1000),
CTID VARCHAR2(255),
VTID VARCHAR2(1000));
TYPE tDataList IS TABLE OF tKeyValue;
PROCEDURE PR_DO_INSERT(i_lData IN tDataList);
END;
-----------------------------------------------------------------PK_EXCEL_TO_DB PACKAGE BODY-----------------------------------------------------
PACKAGE BODY PK_EXCEL_TO_DB IS
PROCEDURE PR_DO_INSERT(i_lData IN tDataList) IS
CC_ROUTE VARCHAR2(255);
VV_ROUTE VARCHAR2(1000);
CC_TRNDATE VARCHAR2(255);
VV_TRNDATE VARCHAR2(1000);
CC_TTIME VARCHAR2(255);
VV_TTIME VARCHAR2(1000);
CC_TID VARCHAR2(255);
VV_TID VARCHAR2(1000);
BEGIN
FOR i IN 1..i_lData.count
LOOP
CC_ROUTE:=CC_ROUTE || ',' || i_ldata(i).CROUTE;
VV_ROUTE:=VV_ROUTE|| ',''' || i_ldata(i).VROUTE || '''';
CC_TRNDATE :=CC_TRNDATE || ',' || i_ldata(i).CTRNDATE ;
VV_TRNDATE :=VV_TRNDATE || ',''' || i_ldata(i).VTRNDATE || '''';
CC_TTIME :=CC_TTIME || ',' || i_ldata(i).CTTIME ;
VV_TTIME :=VV_TTIME || ',''' || i_ldata(i).VTTIME || '''';
CC_TID :=CC_TID || ',' || i_ldata(i).CTID ;
VV_TID :=VV_TID || ',''' || i_ldata(i).VTID|| '''';
END LOOP;
--EXECUTE IMMEDIATE
FORMS_DDL('INSERT INTO TEMP2 (' || SUBSTR(CC_ROUTE, 2) || ' ' ||
SUBSTR(CC_TRNDATE, 2) || ' ' ||
SUBSTR(CC_TTIME, 2) || '' ||
SUBSTR(CC_TID, 2) || ')
VALUES (' || SUBSTR(VV_ROUTE,2) || ' ' ||
SUBSTR(VV_TRNDATE,2) || '' ||
SUBSTR(VV_TTIME,2) || ' ' ||
SUBSTR(VV_TID,2)|| ')');
commit;
END;
END;
------------------------------------------------------------------------PK_EXCEL_TO_DB PACKAGE BODY ENDS--------------------------------------
Thank You
Sameer.Hii Andreas Weiden,
Sorry for replying late. I am very thankful to Francois and your for your suggestion. I've gone through the documentation of collection and finally i got the solution.
But I am unable to insert rercord to the table. Values are passed to the procedure, i am able to see the values while debugging and i get the message
'DATA INSERTED INTO THE TABLE' but when i check it with sql, the table is empty. I've tried commit and standard.commit, but it doesn't works. My modified code is given below.
PROCEDURE get_excel IS
APPLICATION OLE2.OBJ_TYPE;
WORKBOOKS OLE2.OBJ_TYPE;
WORKBOOK OLE2.OBJ_TYPE;
WORKSHEETS OLE2.OBJ_TYPE;
WORKSHEET OLE2.OBJ_TYPE;
CELL OLE2.OBJ_TYPE;
CTR NUMBER(12);
COLS NUMBER(2);
CELLVALUE VARCHAR2(89);
C_ROUTE VARCHAR2(255);
V_ROUTE VARCHAR2(1000);
C_TRNDATE VARCHAR2(255);
V_TRNDATE VARCHAR2(1000);
C_TTIME VARCHAR2(255);
V_TTIME VARCHAR2(1000);
C_TID VARCHAR2(255);
V_TID VARCHAR2(1000);
FILENAME VARCHAR2(500);
v_path varchar2(1000):=:path;
ARGS OLE2.OBJ_TYPE;
i_ldata PK_EXCEL_TO_DB.tDataList:=PK_EXCEL_TO_DB.tDataList();
tDataList PK_EXCEL_TO_DB.tDataList;
BEGIN
:progress:='Please wait...';
SYNCHRONIZE;
--------------INITIATE EXCEL APPLICATION---------------------------
filename := V_PATH;--GET_FILE_NAME('c:\', File_Filter=>'Excel Files (*.xls)|*.xls|'); -- to pick the file
APPLICATION := OLE2.CREATE_OBJ('EXCEL.APPLICATION');
OLE2.SET_PROPERTY(APPLICATION,'VISIBLE','FALSE');
----------------GET WORKBOOKS FROM EXCEL APPLICATION---------------
WORKBOOKS := OLE2.GET_OBJ_PROPERTY(APPLICATION, 'WORKBOOKS');
----------------OPEN REQUIRED WORKBOOK-----------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS, FILENAME);
WORKBOOK := OLE2.GET_OBJ_PROPERTY(WORKBOOKS,'OPEN',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
----------------OPEN REQUIRED WORKSHEET---------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,'Sheet1');
WORKSHEET := OLE2.GET_OBJ_PROPERTY (WORKBOOK,'WORKSHEETS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
----------------GET CELL VALUE-------------------------------------
ctr := 2; --row number
cols := 1; -- column number
FIRST_RECORD;
LOOP
i_ldata.extend(ctr);
i_ldata.extend(cols);
--tDataList:=PK_EXCEL_TO_DB.tDataList();
-----------------------COLUMN1-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS); --COLS
OLE2.ADD_ARG(ARGS,1);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_ROUTE := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(cols).CROUTE:=C_ROUTE;
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,1);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_ROUTE := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(ctr).VROUTE:=V_ROUTE;
-----------------------COLUMN2-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS);
OLE2.ADD_ARG(ARGS,2);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_TRNDATE:= OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(cols).CTRNDATE:=C_TRNDATE;
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,2);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_TRNDATE:= OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(ctr).vtrndate:=v_trndate;
-----------------------COLUMN3-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS);
OLE2.ADD_ARG(ARGS,3);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_TTIME := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(cols).CTTIME:=C_TTIME;
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,3);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_TTIME := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(ctr).vttime:=v_ttime;
-----------------------COLUMN4-------------------------------------
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,COLS);
OLE2.ADD_ARG(ARGS,4);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
C_TID := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(cols).CTID:=C_TID;
ARGS := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ARGS,CTR);
OLE2.ADD_ARG(ARGS,4);
CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET,'CELLS',ARGS);
OLE2.DESTROY_ARGLIST(ARGS);
ARGS := OLE2.CREATE_ARGLIST;
V_TID := OLE2.GET_CHAR_PROPERTY(CELL,'TEXT');
i_ldata(ctr).vtid:=v_tid;
PK_EXCEL_TO_DB.PR_DO_INSERT(i_ldata);
-- i_ldata := PK_EXCEL_TO_DB.tDatalist();
EXIT WHEN length(V_Route) = 0 or length(V_Route) is null;
ctr := ctr + 1;
cols := 1;
END LOOP;
:progress:='EXCEL READING IS DONE...';
----------------CLOSE THE EXCEL SHEET AFTER READING--------------
OLE2.INVOKE(APPLICATION,'QUIT');
-----------------RELEASE ALL OBJECTS
OLE2.RELEASE_OBJ(CELL);
OLE2.RELEASE_OBJ(WORKSHEET);
OLE2.RELEASE_OBJ(WORKBOOK);
OLE2.RELEASE_OBJ(WORKBOOKS);
OLE2.RELEASE_OBJ(APPLICATION);
:PROGRESS := 'DATA INSERTED INTO THE TABLE '; SYNCHRONIZE;
SYNCHRONIZE;
exception
WHEN OTHERS THEN
MESSAGE(sqlerrm);
END;Package specification and package body is
PACKAGE PK_EXCEL_TO_DB IS
TYPE tKeyValue IS RECORD (
CROUTE VARCHAR2(255),
VROUTE VARCHAR2(1000),
CTRNDATE VARCHAR2(255),
VTRNDATE VARCHAR2(1000),
CTTIME VARCHAR2(255),
VTTIME VARCHAR2(1000),
CTID VARCHAR2(255),
VTID VARCHAR2(1000));
TYPE tDataList IS TABLE OF tKeyValue;
PROCEDURE PR_DO_INSERT(i_lData IN tDataList);
END;
-----------------------------------------------------------------PK_EXCEL_TO_DB PACKAGE BODY-----------------------------------------------------
PACKAGE BODY PK_EXCEL_TO_DB IS
PROCEDURE PR_DO_INSERT(i_lData IN tDataList) IS
CC_ROUTE VARCHAR2(255);
VV_ROUTE VARCHAR2(1000);
CC_TRNDATE VARCHAR2(255);
VV_TRNDATE VARCHAR2(1000);
CC_TTIME VARCHAR2(255);
VV_TTIME VARCHAR2(1000);
CC_TID VARCHAR2(255);
VV_TID VARCHAR2(1000);
BEGIN
FOR i IN 1..i_lData.count
LOOP
CC_ROUTE:=CC_ROUTE || ',' || i_ldata(i).CROUTE;
VV_ROUTE:=VV_ROUTE|| ',''' || i_ldata(i).VROUTE || '''';
CC_TRNDATE :=CC_TRNDATE || ',' || i_ldata(i).CTRNDATE ;
VV_TRNDATE :=VV_TRNDATE || ',''' || i_ldata(i).VTRNDATE || '''';
CC_TTIME :=CC_TTIME || ',' || i_ldata(i).CTTIME ;
VV_TTIME :=VV_TTIME || ',''' || i_ldata(i).VTTIME || '''';
CC_TID :=CC_TID || ',' || i_ldata(i).CTID ;
VV_TID :=VV_TID || ',''' || i_ldata(i).VTID|| '''';
END LOOP;
FORMS_DDL('INSERT INTO TEMP2 (' || SUBSTR(CC_ROUTE, 2) || ' ' ||
SUBSTR(CC_TRNDATE, 2) || ' ' ||
SUBSTR(CC_TTIME, 2) || '' ||
SUBSTR(CC_TID, 2) || ')
VALUES (' || SUBSTR(VV_ROUTE,2) || ' ' ||
SUBSTR(VV_TRNDATE,2) || '' ||
SUBSTR(VV_TTIME,2) || ' ' ||
SUBSTR(VV_TID,2)|| ')');
--standard.commit;
commit;
END;
END;Thanks
Sam
Edited by: sam8682 on May 13, 2013 2:35 PM -
How to deal with error ORA-06531 for collection
All,
Can anybody see anything wrong with my code below. As far as I can see everything is in order but I am getting the ORA-06531 error.
Thanks in advance
CREATE OR REPLACE
Type T_PREO_PRIV is Object
PRIVILEGE_ID NUMBER(10),
PRIVILEGE_NAME VARCHAR2(20),
PRIVILEGE_TYPE CHAR(1))
CREATE OR REPLACE
TYPE T_PRIVInfo IS TABLE OF PREORDER.
T_PREO_PRIV
SQL> CREATE OR REPLACE Procedure PREORDER.P_GetUserPrivlegetest(Userid in number, UserPriv out T_PRI
VInfo, status out number)
2 as
3 V_UserPriv T_PRIVInfo;
4 begin
5 select T_PREO_PRIV(preo_priv.privilege_id, PRIVILEGE_NAME, PRIVILEGE_TYPE)
6 BULK COLLECT INTO V_UserPriv
7 from preo_user_role, preo_role_priv, preo_priv
8 where preo_user_role.role_id = preo_role_priv.role_id
9 and preo_role_priv.privilege_id = preo_priv.privilege_id
10 and user_id = Userid;
11
12 V_UserPriv := UserPriv;
13
14 status := 0;
15
16 EXCEPTION
17 WHEN OTHERS THEN
18
19 Status := -1;
20 end;
21 /
Procedure created.
SQL>
SQL> DECLARE
2 profile_info T_PRIVInfo;
3 Status smallint;
4 BEGIN
5
6 --preo_security.P_GetUserPrivlege(42, profile_info, status);
7 P_GetUserPrivlegeTest(42, profile_info, status);
8 dbms_output.put_line('P_GetUserPrivlege '||Status);
9 For i in profile_info.FIRST..profile_info.LAST loop
10
11 dbms_output.put_line('******************************* ');
12 -- dbms_output.put_line('privilege_id '||UserPriv(i).privilege_id);
13 -- dbms_output.put_line('privilege_name '||UserPriv(i).privilege_name);
14 -- dbms_output.put_line('privilege_type '||UserPriv(i).privilege_type);
15 end loop;
16
17 END;
18 /
P_GetUserPrivlege -1
DECLARE
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 9As in your other post, you have these reversed. The line that says
V_UserPriv := UserPriv;
should be
UserPriv := V_UserPriv;
There may also be other errors; I didn't check. -
Hello,
I am still very new at PL/SQL so please bare with me if you can. I am trying to learn how to store data from an object in a single varray of objects. My code below is attempting to declare an object type with 3 instance attributes and 3 instance methods of getter and setter method.
Then i want to create a varray type to store an array of "Employee" object types.
From here i am trying to use a loop to retrieve the first 10 ename, empno, and sal records from the emp table and store them in the variable array of 10 elements.
Finally, I tried to use another loop to output the ename, empno, and sal in reverse order.
My object and my object body was created successfully with no errors.
The problem starts when I begin the anonymous block that creates the varray, this is where i get an error message at the end.
At the end of my code is the error message i get. Can anyone suggest to me what I am doing wrong, and/or what I can do to achieve this task.
SET SERVEROUTPUT ON
--create object
CREATE OR REPLACE TYPE Employee AS OBJECT(
ename_obj VARCHAR2(10),
empno_obj NUMBER(4),
sal_obj NUMBER(7,2),
MEMBER FUNCTION getename RETURN VARCHAR2,
MEMBER FUNCTION getempno RETURN NUMBER,
MEMBER FUNCTION getsal RETURN NUMBER);
--create object body
CREATE OR REPLACE TYPE BODY Employee AS
MEMBER FUNCTION getename RETURN VARCHAR2 IS
BEGIN
RETURN ename_obj;
END;
MEMBER FUNCTION getempno RETURN VARCHAR2 IS
BEGIN
RETURN empno_obj;
END;
MEMBER FUNCTION getsal RETURN VARCHAR2 IS
BEGIN
RETURN sal_obj;
END;
END;
--create varray of object and begin line 1 of ERROR Message--
1> DECLARE
2> TYPE tvrEmploy IS VARRAY(10) OF Employee;
3> vClient tvrEmploy;
4> iCounter integer:=1;
5> CURSOR client_cursor IS
6> SELECT ename, sal
7> FROM emp
8> WHERE rownum < 11;
9> BEGIN
10> vClient:=tvrEmploy(null,null,null,null,null,null,null,null,null,null) ;
11> FOR i IN client_cursor LOOP
12> vClient(iCounter).ename_obj:=i.ename;
13> vClient(iCounter).empno_obj:=i.empno;
14> vClient(iCounter).sal_obj:=i.sal;
15> iCounter:=iCounter+1;
16> END LOOP;
17> FOR I IN REVERSE 1..10 LOOP
18> dbms_output.put_line(to_char(I) ||' '|| vClient(I).ename_obj ||' '|| vClient(I).empno_obj ||' '||
vClient(I).sal_obj);
19> END LOOP;
20> END ;
21> /
--ERROR message below--
DECLARE
ERROR at line 1:
ORA-06530: Reference to uninitialized composite
ORA-06512: at line 12
Thank you again for your time and patience.
-ToddHi,
The error occurs on line 12, the first time through the loop, when you try to execute:
vClient(iCounter).ename_obj:=i.ename;
At that point, vClient (1) is not an Employee object; it's NULL.
Try this:
DECLARE
TYPE tvrEmploy IS VARRAY(10) OF Employee;
vClient tvrEmploy;
iCounter integer := 1;
CURSOR client_cursor IS
SELECT ename, sal
, empno -- ADDED
FROM scott.emp
WHERE rownum < 11;
BEGIN
vClient := tvrEmploy (null,null,null,null,null,null,null,null,null,null) ;
FOR i IN client_cursor LOOP
vClient (iCounter) := Employee (i.ename, i.empno, i.sal); -- CHANGED
iCounter := iCounter + 1;
END LOOP;
FOR I IN REVERSE 1..10 LOOP
dbms_output.put_line(to_char(I) ||' '|| vClient(I).ename_obj ||' '|| vClient(I).empno_obj ||' '||
vClient(I).sal_obj);
END LOOP;
END ; -
Hello.
This program is supposed to pull values from a table using a loop, and in the loop, put the values in objects in a varray. I'm new to objects and am stumped trying to get this program to run. When I attempt to run it in SQL*Plus I get the following feedback:
Type created.
Type body created
SP2-0552: Bind variable "MY_VARRAY_EMP1" not declared.
I don't think I even need a bind variable. Any feedback would be appreciated. Here's the program:
-- Enable screen I/O
SET SERVEROUTPUT ON SIZE 1000000
SET VERIFY OFF
-- begin object spec
CREATE OR REPLACE TYPE employee3 AS OBJECT
ename CHAR (20 char),
empno NUMBER (4),
sal NUMBER (10),
MEMBER FUNCTION get_ename RETURN CHAR, MEMBER PROCEDURE set_ename (SELF IN OUT NOCOPY employee3),
MEMBER FUNCTION get_empno RETURN NUMBER, MEMBER PROCEDURE set_empno (SELF IN OUT NOCOPY employee3),
MEMBER FUNCTION get_sal RETURN NUMBER, MEMBER PROCEDURE set_sal (SELF IN OUT NOCOPY employee3)
-- begin object body
CREATE OR REPLACE TYPE BODY employee3 AS
-- gets
MEMBER FUNCTION get_ename RETURN CHAR IS
BEGIN
RETURN self.ename;
END;
MEMBER FUNCTION get_empno RETURN NUMBER IS
BEGIN
RETURN self.empno;
END;
MEMBER FUNCTION get_sal RETURN NUMBER IS
BEGIN
RETURN self.ename;
END;
-- sets
MEMBER PROCEDURE set_ename(SELF IN OUT employee3) IS
BEGIN
self.ename := ename;
END;
MEMBER PROCEDURE set_empno(SELF IN OUT employee3) IS
BEGIN
self.empno := empno;
END;
MEMBER PROCEDURE set_sal(SELF IN OUT employee3) IS
BEGIN
self.sal := sal;
END;
END;
DECLARE
TYPE emp_varray IS VARRAY(10) OF EMPLOYEE3;
my_varray_emp1 EMP_VARRAY;
-- List of EMPNO's in order of appearance in EMP table (for cross-referencing, single-line retrieval)
TYPE MYCREF_VARRAY IS VARRAY(10) OF NUMBER(4);
varray_mycref MYCREF_VARRAY := MYCREF_VARRAY(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
this_object EMPLOYEE3;
-- make a variable to store one empno
thisno NUMBER(4);
-- make a counter
counter INT;
-- query variables for the set calls
q_ename CHAR(20 CHAR);
q_empno NUMBER(4);
q_sal NUMBER(10);
my_result INT;
BEGIN
--my_varray_emp1 := EMP_VARRAY(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-- Put the first 10 EMPNO's in my cref array
SELECT empno BULK COLLECT INTO varray_mycref FROM emp WHERE ROWNUM < 11;
-- Use a loop to retrieve the first 10 objects in the "emp" table and put them in the varray of objects
q_ename := NULL;
q_empno := NULL;
q_sal := NULL;
my_result := NULL;
this_object := NULL;
counter := 1;
FOR counter IN 1..10 LOOP
thisno := varray_mycref(counter);
this_object := my_varray_emp1(counter);
SELECT ename INTO q_ename FROM emp WHERE empno = thisno;
my_result := this_object.set_ename(q_ename, NULL);
SELECT empno INTO q_empno FROM emp WHERE empno = thisno;
my_result := this_object.set_empno(q_empno, NULL);
SELECT sal INTO q_sal FROM emp WHERE empno = thisno;
my_result := this_object.set_sal(q_sal, NULL);
END LOOP;
-- Use another loop to display the information in the reverse order.
FOR counter in REVERSE 1..10 LOOP
this_object =: my_varray_emp1(counter);
dbms_output.put_line((this_object.get_ename()) || CHR(9) || (this_object.get_empno()) || CHR(9) || (this_object.get_sal()));
END LOOP;
END;Cleaning up your code for errors and eliminating unnecessary complexity...
Add a user-defined constructor which takes all attributes and calls the "setter" procedures in one trip:
-- Enable screen I/O
set SERVEROUTPUT on size 1000000
set VERIFY off
-- begin object spec
create or replace type employee3 as object
ename CHAR (20 char),
empno NUMBER (4),
sal NUMBER (10),
constructor function employee3(
self in out nocopy employee3,
aEname in char,
aEmpNo in integer,
aSal in number
return self as result,
member function get_ename return CHAR, member procedure set_ename (SELF in out nocopy employee3, ename in char),
member function get_empno return NUMBER, member procedure set_empno (SELF in out nocopy employee3, empno in integer),
member function get_sal return NUMBER, member procedure set_sal (SELF in out nocopy employee3, sal in integer)
-- begin object body
create or replace type body employee3 as
constructor function employee3(
self in out nocopy employee3,
aEname in char,
aEmpNo in integer,
aSal in number
return self as result
is
begin
self.set_ename(aEname);
self.set_empno(aEmpNo);
self.set_sal(aSal);
return;
end;
-- gets
member function get_ename return CHAR is
begin
return self.ename;
end;
member function get_empno return NUMBER is
begin
return self.empno;
end;
member function get_sal return NUMBER is
begin
return self.sal;
end;
-- sets
member procedure set_ename(SELF in out employee3, ename in char) is
begin
self.ename := ename;
end;
member procedure set_empno(SELF in out employee3, empno in integer) is
begin
self.empno := empno;
end;
member procedure set_sal(SELF in out employee3, sal in integer) is
begin
self.sal := sal;
end;
end;
(Since I don't have EMP handy at the moment, create a simple view instead)
create or replace view emp
as
select 'EMP' || to_char(level) ename
, level + 100 empno
, DBMS_RANDOM.VALUE(25000,75000) sal
from DUAL
connect by
level <= 20
Get rid of your loop and individual SELECTs, and replace it with a single SELECT BULK COLLECT INTO...
declare
type emp_varray is varray(10) of EMPLOYEE3;
my_varray_emp1 EMP_VARRAY;
this_object EMPLOYEE3;
begin
-- No need for a loop. Use SELECT BULK COLLECT INTO, together with a user-defined constructor call (since the
-- user-defined constructor overrides the default constructor we need to call it using named-parameter notation):
select new employee3(
aEname => e.ename,
aEmpNo => e.empno,
aSal => e.sal
bulk collect into
my_varray_emp1
from emp e
where rownum <= 10;
-- Use another loop to display the information in the reverse order.
for counter in reverse 1..10 loop
this_object := my_varray_emp1(counter);
dbms_output.put_line((this_object.get_ename()) || chr(9) || to_char(this_object.get_empno()) || chr(9) || to_char(this_object.get_sal()));
end loop;
end;
EMP10
110 60110
EMP9
109 67485
EMP8
108 58242
EMP7
107 47597
EMP6
106 58995
EMP5
105 49098
EMP4
104 47406
EMP3
103 67574
EMP2
102 59663
EMP1
101 52929
PL/SQL procedure successfully completed.
Gerard -
Sdo_geor.mosaic ends with ORA-06531
I'm using Oracle 11g R1, and try the enhanced mosaic function, but i always get this error.
ORA-06531: Reference to uninitialized collection
The SQL:
DECLARE
gr sdo_georaster;
BEGIN
INSERT INTO LGVHH05 (id, georaster) VALUES (1, sdo_geor.init('LGVHH05_RDT')) RETURNING georaster INTO gr;
sdo_geor.mosaic('LGVHH05_TILE', 'GEORASTER', gr, 'blocksize=(1024,1024,3)');
UPDATE LGVHH05 SET georaster=gr WHERE id=1;
END;
I'm wondering what collection this could be?
The GeoRaster objects are valid and have the same SRID.thanks so far, here is the metadata:
GEORASTER.METADATA
<georasterMetadata xmlns="http://xmlns.oracle.com/spatial/georaster">
<objectInfo>
<rasterType>21001</rasterType>
<isBlank>false</isBlank>
<defaultRed>1</defaultRed>
<defaultGreen>2</defaultGreen>
<defaultBlue>3</defaultBlue>
</objectInfo>
<rasterInfo>
<cellRepresentation>UNDEFINED</cellRepresentation>
<cellDepth>8BIT_U</cellDepth>
<totalDimensions>3</totalDimensions>
<dimensionSize type="ROW">
<size>4001</size>
</dimensionSize>
<dimensionSize type="COLUMN">
<size>4001</size>
</dimensionSize>
<dimensionSize type="BAND">
<size>3</size>
</dimensionSize>
<ULTCoordinate>
<row>0</row>
<column>0</column>
<band>0</band>
</ULTCoordinate>
<blocking>
<type>REGULAR</type>
<totalRowBlocks>16</totalRowBlocks>
<totalColumnBlocks>16</totalColumnBlocks>
<rowBlockSize>256</rowBlockSize>
<columnBlockSize>256</columnBlockSize>
</blocking>
<interleaving>BIP</interleaving>
<pyramid>
<type>NONE</type>
</pyramid>
<compression>
<type>NONE</type>
</compression>
</rasterInfo>
<spatialReferenceInfo>
<isReferenced>true</isReferenced>
<isRectified>true</isRectified>
<SRID>31467</SRID>
<spatialResolution dimensionType="X">
<resolution>0.5</resolution>
</spatialResolution>
<spatialResolution dimensionType="Y">
<resolution>0.5</resolution>
</spatialResolution>
<modelCoordinateLocation>CENTER</modelCoordinateLocation>
<modelType>FunctionalFitting</modelType>
<polynomialModel rowOff="0.0" columnOff="0.0" xOff="0.0" yOff="0.0" zOff="0" rowScale="1.0" columnScale="1.0" xScale="1.0" yScale="1.0" zScale="1.0">
<pPolynomial pType="1" nVars="2" order="1" nCoefficients="3">
<polynomialCoefficients>1.1852E7 0.0 -2.0</polynomialCoefficients>
</pPolynomial>
<qPolynomial pType="1" nVars="0" order="0" nCoefficients="1">
<polynomialCoefficients>1.0</polynomialCoefficients>
</qPolynomial>
<rPolynomial pType="1" nVars="2" order="1" nCoefficients="3">
<polynomialCoefficients>-7104000.0 2.0 0.0</polynomialCoefficients>
</rPolynomial>
<sPolynomial pType="1" nVars="0" order="0" nCoefficients="1">
<polynomialCoefficients>1.0</polynomialCoefficients>
</sPolynomial>
</polynomialModel>
</spatialReferenceInfo>
<layerInfo>
<layerDimension>BAND</layerDimension>
</layerInfo>
</georasterMetadata> -
I used JDeveloper to generate custom classes for an Oracle package. In that package, a function returns an array (of Oracle objects). JDeveloper created the custom class for the package(sitepkg.sqlj), and 3 additional custom classes to support the referenced Oracle object collections(Physicallocobj.sqlj - this is the Oracle object; PhysicallocobjRef.java; Physicallocobjtbl.java - this is the collection of the Oracle object).
I import the files into my program:
import DBAInfo1.sitepkg;
import DBAInfo1.Physicallocobj;
import DBAInfo1.PhysicallocobjRef;
import DBAInfo1.Physicallocobjtbl;
I declare the corresponding variables:
public static sitepkg SiteDBI = null;
public static Physicallocobjtbl SiteList = null;
I initialize the variables:
SiteDBI = new sitepkg();
SiteList = new Physicallocobjtbl();
And when I invoke a method of the SiteDBI object, the ORA-06531 error is raised
SiteList = SiteDBI.ListSites();
The error message is as follows:
)RA-06531: Reference to uninitialized collection
ORA-06512: at "WEBDEVADMIN.SITEPKG", line 81
ORA-06512: at line 1
The method definition for ListSites is as follows:
public Physicallocobjtbl ListSites ()
throws SQLException
Physicallocobjtbl __jPt_result;
#sql [_ctx] __jPt_result = { VALUES(SITEPKG.FLISTSITES()) };
return __jPt_result;
How does one correctly initialize the collection?
nullCharles, I can't answer your question, but I suggest you take a look at the SQLJ documentation, which has some sections on collections (select Technologies on the left of this page, then select SQLJ&JDBC, then Documentation). You might also want to post this question to the SQLJ/JDBC forum.
Blaise -
ORA-06531:collection error in trigger.
We are using DBMS_XMLSave to insert data into an object nested view. Error ORA-06531 causes the trigger to fail when trying to access the collection count.. Below is the XML, view and trigger. What is missing or are we running into a bug?
Thanks
****************************** XML ****************************
<?xml version = '1.0'?>
<ROWSET>
<ROW>
<ArrestNumber>2</ArrestNumber>
<IMErrors>
<IMErrors_ITEM>
<ResponseErrorCode>CODE 2</ResponseErrorCode>
<ResponseErrorDesc>DESC 2</ResponseErrorDesc>
</IMErrors_ITEM>
<IMErrors_ITEM>
<ResponseErrorCode>CODE 1</ResponseErrorCode>
<ResponseErrorDesc>DESC 1</ResponseErrorDesc>
</IMErrors_ITEM>
</IMErrors>
</ROW>
</ROWSET>
************************* VIEW ****************************
CREATE OR REPLACE TYPE sjs.imres_error_type AS OBJECT
("ResponseErrorCode" VARCHAR2(10),
"ResponseErrorDesc" VARCHAR2(4000))
CREATE OR REPLACE TYPE sjs.imres_errors_type AS TABLE OF imres_error_type
CREATE OR REPLACE VIEW sjs.imresponse
AS SELECT ith.a_id AS "ArrestNumber",
CAST(MULTISET(SELECT ire.errorcode,
ire.errordesc
FROM sjs.imresponseerrors ire
WHERE ire.ith_id = ith.ith_id) AS imres_errors_type) AS "IMerrors"
FROM sjs.imtransactionhistory ith
************************* TRIGGER ****************************
CREATE OR REPLACE TRIGGER sjs.imresponse_new INSTEAD OF INSERT ON sjs.imresponse FOR EACH ROW
DECLARE
error_list imres_errors_type;
error_t imres_error_type;
ith_id_holder NUMBER(18);
cnt NUMBER;
BEGIN
INSERT INTO imtransactionhistory(a_id,interfacetransaction,ith_nysid,ith_fbi,ith_cjtn)
VALUES(:new."ArrestNumber",'PENDING','PENDING','PENDING','PENDING');
SELECT sjs.ith_sequence.currval INTO ith_id_holder FROM dual;
error_list := :new."IMerrors";
cnt := error_list.count;
-- FOR i IN 1..cnt LOOP
-- error_t := error_list(i);
-- INSERT INTO imresponseerrors(ith_id,errorcode,errordesc)
-- VALUES(ith_id_holder,error_t."ResponseErrorCode",error_t."ResponseErrorDesc");
-- END LOOP;
END;
************************* ERROR ****************************
ERROR at line 1:
ORA-29532: Java call terminated by uncaught Java exception: oracle.xml.sql.OracleXMLSQLException:
'oracle.jdbc.driver.OracleSQLException: ORA-06531: Reference to uninitialized collection
ORA-06512: at "SJS.IMRESPONSE_NEW", line 11
ORA-04088: error during execution of trigger 'SJS.IMRESPONSE_NEW'
' encountered during processing ROW element 0. All prior XML row changes were rolled back. in the XM
ORA-06512: at "SJS.XML_UTIL", line 72
ORA-06512: at "SJS.IMRES", line 35
ORA-06512: at line 6Frank
error_list is a collection. What happens if you use an index with it? E.G.
error_list(1) := :new."IMerrors";
Cheers, APC -
Ora-06531 reference to uninitialized collection --- Please help
Hello,
I am getting this "ora-06531 reference to uninitialized collection" while executing the below procedure.
=======================
PROCEDURE iud_account_col
( pv_account_version IN account_version_t
AS
LC_USR_ID CONSTANT VARCHAR2(30) := pkg_util.get_usr_id ;
LC_TMSTMP CONSTANT TIMESTAMP /*WITH TIME ZONE*/ := pkg_util.get_tmstmp ;
lv_level VARCHAR2(100);
lv_am_key_id number;
lv_acct_cusip VARCHAR2(12);
LC_AM_KEY_ID number;
LC_AM_VER_NUM number;
BEGIN
DECLARE
lv_am account_version_t;
lv_amv account_maint_t;
lv_amvv account_maint_version_t;
cursor c_acct_cusip ( cv_am_key_id varchar2) is
select acct_cusip
from account_maintenance
where am_key_id = lv_amv.am_key_id;
BEGIN
lv_am := pv_account_version;
lv_level := 'ACCOUNT_MAINT' ;
lv_amv := pv_account_version.account_maint;
LC_AM_KEY_ID := lv_amv.am_key_id;
FOR acct_cusip_info in c_acct_cusip (lv_am_key_id)
LOOP
lv_acct_cusip := acct_cusip_info.acct_cusip;
END LOOP;
IF lv_amv.action = 'I'
THEN
INSERT
INTO
account_maintenance
( am_key_id
, acct_cusip
, am_orig_cre_tmstp
, am_orig_usr_id
, delete_ind
, add_usr_id
, add_tmstmp
, lock_level_num
VALUES
( lv_amv.am_key_id
, lv_amv.acct_cusip
, LC_TMSTMP
, LC_USR_ID
, lv_amv.delete_ind
, LC_USR_ID
, LC_TMSTMP
, lv_amv.lock_level_num
END IF;
lv_amvv := pv_account_version.account_maint.account_maint_version;
lv_level := 'ACCOUNT_MAINT_VERSION';
LC_AM_VER_NUM := lv_amvv.am_ver_num;
IF lv_amvv.action = 'I'
THEN
-- Insert issue maint version
INSERT
INTO
ACCOUNT_MAINTENANCE_VERSION
( AM_KEY_ID
, AM_VER_NUM
, ACCT_CUSIP
, LEGAL_ENTITY
, APPR_STATUS_REF_ID
, INACTIVE_IND
, ADD_USR_ID
, ADD_TMSTMP
, UPD_USR_ID
, UPD_TMSTMP
, LOCK_LEVEL_NUM
VALUES
( lv_amv.am_key_id
, lv_amvv.am_ver_num
, lv_acct_cusip
, lv_amvv.legal_entity
, lv_amvv.appr_status_ref_id
, 'N'
, LC_USR_ID
, LC_TMSTMP
, LC_USR_ID
, LC_TMSTMP
, lv_amvv.lock_level_num
END IF; --- end for account maint version.
FOR j IN lv_amv.account_maint_comment_col.FIRST
.. lv_amv.account_maint_comment_col.LAST
LOOP
DECLARE
lv_amvc account_maint_comment_t;
BEGIN
lv_amvc := lv_amv.account_maint_comment_col(j);
lv_level := 'ACCOUNT_MAINT_COMMENT';
IF lv_amvc.action = 'I'
THEN
--- Insert into account maintenance comment table
INSERT
INTO
ACCOUNT_MAINTENANCE_COMMENT
( AM_KEY_ID
, AM_VER_NUM
, COMMENT_NUM
, COMMENT_TMSTP
, COMMENT_TXT
, INACTIVE_IND
, ADD_USR_ID
, ADD_TMSTMP
, LOCK_LEVEL_NUM
VALUES
( LC_AM_KEY_ID
, LC_AM_VER_NUM
, lv_amvc.comment_num
, LC_TMSTMP
, lv_amvc.comment_txt
, 'N'
, LC_USR_ID
, LC_TMSTMP
, lv_amvc.lock_level_num
END IF;
END;
END LOOP; --- end loop for account maint comments
END;
COMMIT WORK;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
RAISE;
END iud_account_col;
====================
The UDT's are below:
CREATE OR REPLACE TYPE ACCOUNT_VERSION_T
AS OBJECT
PORTFOLIO PORTFOLIO_T
, ACCOUNT_MAINT ACCOUNT_MAINT_T
CREATE OR REPLACE TYPE ACCOUNT_MAINT_T
AS OBJECT
( AM_KEY_ID number
, ACCT_CUSIP varchar2(12)
, DELETE_IND varchar2(1)
, ADD_USR_ID varchar2(20)
, ADD_TMSTMP timestamp
, UPD_USR_ID varchar2(20)
, UPD_TMSTMP timestamp
, LOCK_LEVEL_NUM number
, ACTION VARCHAR2(1)
, ACCOUNT_MAINT_VERSION ACCOUNT_MAINT_VERSION_T
, ACCOUNT_MAINT_COMMENT_COL ACCOUNT_MAINT_COMMENT_COL_T
CREATE OR REPLACE TYPE ACCOUNT_MAINT_VERSION_T
AS OBJECT
( AM_KEY_ID number
, AM_VER_NUM number
, ACCT_CUSIP varchar2(12)
, LEGAL_ENTITY varchar2(100)
, APPR_STATUS_REF_ID number
, FUND_INACTIVE_TMSTMP timestamp
, ADD_USR_ID varchar2(20)
, ADD_TMSTMP timestamp
, UPD_USR_ID varchar2(20)
, UPD_TMSTMP timestamp
, LOCK_LEVEL_NUM number
, ACTION VARCHAR2(1)
CREATE OR REPLACE TYPE ACCOUNT_MAINT_COMMENT_T
AS OBJECT
( AM_KEY_ID number
, AM_VER_NUM number
, COMMENT_NUM number
, COMMENT_TXT varchar2(400)
, ADD_USR_ID varchar2(20)
, ADD_TMSTMP timestamp
, UPD_USR_ID varchar2(20)
, UPD_TMSTMP timestamp
, LOCK_LEVEL_NUM number
, ACTION VARCHAR2(1)
=====================================================
This is how I am trying to execute:
Declare
pv_account_version account_version_t := account_version_t(null
, account_maint_t ( 10041
, '11111111'
, 'N'
,'abc'
, NULL
, NULL
, NULL
, 1
,NULL-- 'I'
,ACCOUNT_MAINT_VERSION_T(10031
, 10001
, NULL
,'Legal entity'
,22
,NULL
,'abc'
,NULL
, NULL
,NULL
, 1
,NULL --'I'
,ACCOUNT_MAINT_COMMENT_COL_T(
10031
,10001
,1001
,'My first comment'
,'abc'
, NULL
, NULL
, NULL
, 1
, 'I')
Begin
pkg_cdm_process_v2.iud_account(pv_account_version);
END;
What am I doing wrong here....
Please help.
Thanks.Now if we only knew where the error was flagged.
PROCEDURE Iud_account_col
(pv_account_version IN ACCOUNT_VERSION_T)
AS
lc_usr_id CONSTANT VARCHAR2(30) := pkg_util.get_usr_id;
lc_tmstmp CONSTANT TIMESTAMP /*WITH TIME ZONE*/ := pkg_util.get_tmstmp;
lv_level VARCHAR2(100);
lv_am_key_id NUMBER;
lv_acct_cusip VARCHAR2(12);
lc_am_key_id NUMBER;
lc_am_ver_num NUMBER;
BEGIN
DECLARE
lv_am ACCOUNT_VERSION_T;
lv_amv ACCOUNT_MAINT_T;
lv_amvv ACCOUNT_MAINT_VERSION_T;
CURSOR c_acct_cusip(cv_am_key_id VARCHAR2) IS
SELECT acct_cusip
FROM account_maintenance
WHERE am_key_id = lv_amv.am_key_id;
BEGIN
lv_am := pv_account_version;
lv_level := 'ACCOUNT_MAINT';
lv_amv := pv_account_version.account_maint;
lc_am_key_id := lv_amv.am_key_id;
FOR acct_cusip_info IN c_acct_cusip(lv_am_key_id) LOOP
lv_acct_cusip := acct_cusip_info.acct_cusip;
END LOOP;
IF lv_amv.ACTION = 'I' THEN
INSERT INTO account_maintenance
(am_key_id,
acct_cusip,
am_orig_cre_tmstp,
am_orig_usr_id,
delete_ind,
add_usr_id,
add_tmstmp,
lock_level_num)
VALUES (lv_amv.am_key_id,
lv_amv.acct_cusip,
lc_tmstmp,
lc_usr_id,
lv_amv.delete_ind,
lc_usr_id,
lc_tmstmp,
lv_amv.lock_level_num);
END IF;
lv_amvv := pv_account_version.account_maint.account_maint_version;
lv_level := 'ACCOUNT_MAINT_VERSION';
lc_am_ver_num := lv_amvv.am_ver_num;
IF lv_amvv.ACTION = 'I' THEN
-- Insert issue maint version
INSERT INTO account_maintenance_version
(am_key_id,
am_ver_num,
acct_cusip,
legal_entity,
appr_status_ref_id,
inactive_ind,
add_usr_id,
add_tmstmp,
upd_usr_id,
upd_tmstmp,
lock_level_num)
VALUES (lv_amv.am_key_id,
lv_amvv.am_ver_num,
lv_acct_cusip,
lv_amvv.legal_entity,
lv_amvv.appr_status_ref_id,
'N',
lc_usr_id,
lc_tmstmp,
lc_usr_id,
lc_tmstmp,
lv_amvv.lock_level_num);
END IF; --- end for account maint version.
FOR j IN lv_amv.account_maint_comment_col.FIRST.. lv_amv.account_maint_comment_col.LAST LOOP
DECLARE
lv_amvc ACCOUNT_MAINT_COMMENT_T;
BEGIN
lv_amvc := lv_amv.Account_maint_comment_col(j);
lv_level := 'ACCOUNT_MAINT_COMMENT';
IF lv_amvc.ACTION = 'I' THEN
--- Insert into account maintenance comment table
INSERT INTO account_maintenance_comment
(am_key_id,
am_ver_num,
comment_num,
comment_tmstp,
comment_txt,
inactive_ind,
add_usr_id,
add_tmstmp,
lock_level_num)
VALUES (lc_am_key_id,
lc_am_ver_num,
lv_amvc.comment_num,
lc_tmstmp,
lv_amvc.comment_txt,
'N',
lc_usr_id,
lc_tmstmp,
lv_amvc.lock_level_num);
END IF;
END;
END LOOP; --- end loop for account maint comments
END;
COMMIT WORK;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
RAISE;
END iud_account_col; -
Ora-06531 reference to uninitialized collection
Hello,
I am getting this "ora-06531 reference to uninitialized collection" while executing the below procedure.
=======================
PROCEDURE iud_account_col
( pv_account_version IN account_version_t
AS
LC_USR_ID CONSTANT VARCHAR2(30) := pkg_util.get_usr_id ;
LC_TMSTMP CONSTANT TIMESTAMP /*WITH TIME ZONE*/ := pkg_util.get_tmstmp ;
lv_level VARCHAR2(100);
lv_am_key_id number;
lv_acct_cusip VARCHAR2(12);
LC_AM_KEY_ID number;
LC_AM_VER_NUM number;
BEGIN
DECLARE
lv_am account_version_t;
lv_amv account_maint_t;
lv_amvv account_maint_version_t;
cursor c_acct_cusip ( cv_am_key_id varchar2) is
select acct_cusip
from account_maintenance
where am_key_id = lv_amv.am_key_id;
BEGIN
lv_am := pv_account_version;
lv_level := 'ACCOUNT_MAINT' ;
lv_amv := pv_account_version.account_maint;
LC_AM_KEY_ID := lv_amv.am_key_id;
FOR acct_cusip_info in c_acct_cusip (lv_am_key_id)
LOOP
lv_acct_cusip := acct_cusip_info.acct_cusip;
END LOOP;
IF lv_amv.action = 'I'
THEN
INSERT
INTO
account_maintenance
( am_key_id
, acct_cusip
, am_orig_cre_tmstp
, am_orig_usr_id
, delete_ind
, add_usr_id
, add_tmstmp
, lock_level_num
VALUES
( lv_amv.am_key_id
, lv_amv.acct_cusip
, LC_TMSTMP
, LC_USR_ID
, lv_amv.delete_ind
, LC_USR_ID
, LC_TMSTMP
, lv_amv.lock_level_num
END IF;
lv_amvv := pv_account_version.account_maint.account_maint_version;
lv_level := 'ACCOUNT_MAINT_VERSION';
LC_AM_VER_NUM := lv_amvv.am_ver_num;
IF lv_amvv.action = 'I'
THEN
-- Insert issue maint version
INSERT
INTO
ACCOUNT_MAINTENANCE_VERSION
( AM_KEY_ID
, AM_VER_NUM
, ACCT_CUSIP
, LEGAL_ENTITY
, APPR_STATUS_REF_ID
, INACTIVE_IND
, ADD_USR_ID
, ADD_TMSTMP
, UPD_USR_ID
, UPD_TMSTMP
, LOCK_LEVEL_NUM
VALUES
( lv_amv.am_key_id
, lv_amvv.am_ver_num
, lv_acct_cusip
, lv_amvv.legal_entity
, lv_amvv.appr_status_ref_id
, 'N'
, LC_USR_ID
, LC_TMSTMP
, LC_USR_ID
, LC_TMSTMP
, lv_amvv.lock_level_num
END IF; --- end for account maint version.
FOR j IN lv_amv.account_maint_comment_col.FIRST
.. lv_amv.account_maint_comment_col.LAST
LOOP
DECLARE
lv_amvc account_maint_comment_t;
BEGIN
lv_amvc := lv_amv.account_maint_comment_col(j);
lv_level := 'ACCOUNT_MAINT_COMMENT';
IF lv_amvc.action = 'I'
THEN
--- Insert into account maintenance comment table
INSERT
INTO
ACCOUNT_MAINTENANCE_COMMENT
( AM_KEY_ID
, AM_VER_NUM
, COMMENT_NUM
, COMMENT_TMSTP
, COMMENT_TXT
, INACTIVE_IND
, ADD_USR_ID
, ADD_TMSTMP
, LOCK_LEVEL_NUM
VALUES
( LC_AM_KEY_ID
, LC_AM_VER_NUM
, lv_amvc.comment_num
, LC_TMSTMP
, lv_amvc.comment_txt
, 'N'
, LC_USR_ID
, LC_TMSTMP
, lv_amvc.lock_level_num
END IF;
END;
END LOOP; --- end loop for account maint comments
END;
COMMIT WORK;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
RAISE;
END iud_account_col;
====================
The UDT's are below:
CREATE OR REPLACE TYPE ACCOUNT_VERSION_T
AS OBJECT
PORTFOLIO PORTFOLIO_T
, ACCOUNT_MAINT ACCOUNT_MAINT_T
CREATE OR REPLACE TYPE ACCOUNT_MAINT_T
AS OBJECT
( AM_KEY_ID number
, ACCT_CUSIP varchar2(12)
, DELETE_IND varchar2(1)
, ADD_USR_ID varchar2(20)
, ADD_TMSTMP timestamp
, UPD_USR_ID varchar2(20)
, UPD_TMSTMP timestamp
, LOCK_LEVEL_NUM number
, ACTION VARCHAR2(1)
, ACCOUNT_MAINT_VERSION ACCOUNT_MAINT_VERSION_T
, ACCOUNT_MAINT_COMMENT_COL ACCOUNT_MAINT_COMMENT_COL_T
CREATE OR REPLACE TYPE ACCOUNT_MAINT_VERSION_T
AS OBJECT
( AM_KEY_ID number
, AM_VER_NUM number
, ACCT_CUSIP varchar2(12)
, LEGAL_ENTITY varchar2(100)
, APPR_STATUS_REF_ID number
, FUND_INACTIVE_TMSTMP timestamp
, ADD_USR_ID varchar2(20)
, ADD_TMSTMP timestamp
, UPD_USR_ID varchar2(20)
, UPD_TMSTMP timestamp
, LOCK_LEVEL_NUM number
, ACTION VARCHAR2(1)
CREATE OR REPLACE TYPE ACCOUNT_MAINT_COMMENT_T
AS OBJECT
( AM_KEY_ID number
, AM_VER_NUM number
, COMMENT_NUM number
, COMMENT_TXT varchar2(400)
, ADD_USR_ID varchar2(20)
, ADD_TMSTMP timestamp
, UPD_USR_ID varchar2(20)
, UPD_TMSTMP timestamp
, LOCK_LEVEL_NUM number
, ACTION VARCHAR2(1)
CREATE OR REPLACE TYPE ACCOUNT_MAINT_COMMENT_COL_T AS TABLE OF ACCOUNT_MAINT_COMMENT_T;
=====================================================
This is how I am trying to execute:
Declare
pv_account_version account_version_t := account_version_t(null
, account_maint_t ( 10041
, '11111111'
, 'N'
,'abc'
, NULL
, NULL
, NULL
, 1
,NULL-- 'I'
,ACCOUNT_MAINT_VERSION_T(10031
, 10001
, NULL
,'Legal entity'
,22
,NULL
,'abc'
,NULL
, NULL
,NULL
, 1
,NULL --'I'
,ACCOUNT_MAINT_COMMENT_COL_T(
10031
,10001
,1001
,'My first comment'
,'abc'
, NULL
, NULL
, NULL
, 1
, 'I')
Begin
pkg_cdm_process_v2.iud_account(pv_account_version);
END;
SQL> /
Declare
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at "ACEENG.PKG_CDM_PROCESS_V2", line 799
ORA-06512: at line 27
What am I doing wrong here....
Please help.Hi,
Here is the table structures, data is in my procedure call.
I get error only while testing for 'account_maintenance_comment' table, if I comment this part in my procedure, i won't get this error.
CREATE TABLE ACCOUNT_MAINTENANCE
AM_KEY_ID NUMBER(32) NOT NULL,
ACCT_CUSIP VARCHAR2(12) NOT NULL,
AM_ORIG_CRE_TMSTP TIMESTAMP(6) NOT NULL,
AM_ORIG_USR_ID VARCHAR2(20) NOT NULL,
DELETE_IND VARCHAR2(1) NULL,
ADD_USR_ID VARCHAR2(20) NOT NULL,
ADD_TMSTMP TIMESTAMP(6) NOT NULL,
UPD_USR_ID VARCHAR2(20) NULL,
UPD_TMSTMP TIMESTAMP(6) NULL,
LOCK_LEVEL_NUM NUMBER(32) NOT NULL
CREATE TABLE ACCOUNT_MAINTENANCE_VERSION
AM_KEY_ID NUMBER(32) NOT NULL,
AM_VER_NUM NUMBER(32) NOT NULL,
ACCT_CUSIP VARCHAR2(12) NOT NULL,
SNAME VARCHAR2(20) NULL,
LNAME VARCHAR2(40) NULL,
EXT_ACCT_NUM NUMBER NULL,
ADVISOR_NM VARCHAR2(40) NULL,
SUB_ADVISOR_NM VARCHAR2(40) NULL,
LEGAL_ENTITY VARCHAR2(100) NULL,
DISP_PWR_ADVISOR_NM VARCHAR2(40) NULL,
VOT_PWR_ADVISOR_NM VARCHAR2(40) NULL,
ACCT_TYP_CD VARCHAR2(10) NULL,
ACCT_PUBLIC_NM VARCHAR2(40) NULL,
CLIENT_TYP_CD VARCHAR2(1) NULL,
CUSTODIAN_NM VARCHAR2(40) NULL,
NATIONALITY VARCHAR2(40) NULL,
PORTF_TEST_IND VARCHAR2(1) NULL,
PILOT_PORTF_IND VARCHAR2(1) NULL,
ELIG_IND_13DG VARCHAR2(1) NULL,
RR_EXCLUDE_IND VARCHAR2(1) NULL,
APPR_STATUS_REF_ID NUMBER(32) NULL,
NEXT_REVIEW_TMSTMP TIMESTAMP(6) NULL,
FUND_INACTIVE_TMSTMP TIMESTAMP(6) NULL,
LAST_APPR_USR_ID VARCHAR2(20) NULL,
LAST_APPR_TMSTMP TIMESTAMP(6) NULL,
INACTIVE_IND VARCHAR2(1) NOT NULL,
ADD_USR_ID VARCHAR2(20) NOT NULL,
ADD_TMSTMP TIMESTAMP(6) NOT NULL,
UPD_USR_ID VARCHAR2(20) NULL,
UPD_TMSTMP TIMESTAMP(6) NULL,
LOCK_LEVEL_NUM NUMBER(32) NOT NULL,
CREATE TABLE ACCOUNT_MAINTENANCE_COMMENT
AM_KEY_ID NUMBER(32) NOT NULL,
AM_VER_NUM NUMBER(32) NULL,
COMMENT_NUM NUMBER(32) NOT NULL,
COMMENT_TMSTP TIMESTAMP(6) NOT NULL,
COMMENT_TXT VARCHAR2(400) NULL,
INACTIVE_IND VARCHAR2(1) NOT NULL,
ADD_USR_ID VARCHAR2(20) NOT NULL,
ADD_TMSTMP TIMESTAMP(6) NOT NULL,
UPD_USR_ID VARCHAR2(20) NULL,
UPD_TMSTMP TIMESTAMP(6) NULL,
LOCK_LEVEL_NUM NUMBER(32) NOT NULL) -
Could not get schema Object:java.sql.SQLSyntaxErrorException ora-904
All of a sudden I get
Could not get schema Object:java.sql.SQLSyntaxErrorException: ORA-00904: "SYS"."O"."NAME": ongeldige ID
when doing anything in the tables tree in the connections pane
The only thing I set recently is pga_aggregate_target
Environment
Oracle 11.2.0.1
OS Windows Vista Ultimate sp2
Sql developer 2.1.1.64.39 with its own JDK
As the download links on OTN are broken I can not upgrade, and I'd rather not work in command line sqlplus.
Help!!!
Sybrand Bakker
Senior Oracle DBAMy copy of sqldeveloper isn't located in that directory. Would that matter?
In the mean time I have disabled filtering the tables node. Opening the tables node doesn't result in exceptions anymore.
Now, when I click on any table in that node I get 4 identical ora-904 error messages for sys.o.name for any table.
Apparently it is querying either the all_objects view and it thinks it is querying sys.obj$.
I didn't yet enable sql_trace for the session, I'm more or less giving up on sqldeveloper. I can not use the space bar in any datagrid, sqldeveloper has always been extreemly unresponsive when navigating the schema browser (as opposed to Toad), etc, etc. Too bad I bought Sue Harpers book, but I think I will be de-installing sqldeveloper soon.
Sybrand Bakker
Senior Oracle DBA -
Problem in fetching varray of Object type
Below are the code,
where am calling an procedure which returns me Varray of object type test_obj(id number, name varchar2);
Am facing an problem in get the object(test_obj) from ARRAY object
the exception is java.lang.ClassCastException: java.lang.Object
at line number No 12..
Can anyone suggest me How handle this...
1. STRUCT test_objStruct ;
2. ARRAY test_arr;
3. OracleCallableStatement cs = (OracleCallableStatement)
4. con.prepareCall("{call test_data(?)}");
5. cs.registerOutParameter(1,oracle.jdbc.driver.OracleTypes.ARRAY,"TEST_ARR");
6. cs.execute();
7. test_arr = (ARRAY)cs.getObject(1);
8.System.out.println("array varible "+test_arr.getBaseTypeName());
9. System.out.println("length "+test_arr.length());
10. Map map = (Map)con.getTypeMap();
11. map.put("TEST_OBJ", Class.forName("oracle.sql.STRUCT"));
12. test_objStruct = (STRUCT)test_arr.getArray(1,1);
13.Object country_attrs[] = test_objStruct.getAttributes();
14.System.out.println ("ID: " country_attrs[0]);
15.System.out.println ("Name: " +country_attrs[1]);
the output is..
array varible TEST_OBJ
length 106
Error java.lang.ClassCastException: java.lang.ObjectHi,
The error occurs on line 12, the first time through the loop, when you try to execute:
vClient(iCounter).ename_obj:=i.ename;
At that point, vClient (1) is not an Employee object; it's NULL.
Try this:
DECLARE
TYPE tvrEmploy IS VARRAY(10) OF Employee;
vClient tvrEmploy;
iCounter integer := 1;
CURSOR client_cursor IS
SELECT ename, sal
, empno -- ADDED
FROM scott.emp
WHERE rownum < 11;
BEGIN
vClient := tvrEmploy (null,null,null,null,null,null,null,null,null,null) ;
FOR i IN client_cursor LOOP
vClient (iCounter) := Employee (i.ename, i.empno, i.sal); -- CHANGED
iCounter := iCounter + 1;
END LOOP;
FOR I IN REVERSE 1..10 LOOP
dbms_output.put_line(to_char(I) ||' '|| vClient(I).ename_obj ||' '|| vClient(I).empno_obj ||' '||
vClient(I).sal_obj);
END LOOP;
END ; -
Calling Stored Procedure(takes varray of objects as input) from jdeveloper
How can i call Stored Procedure which takes varray of objects as input from jdeveloper
My object is :
TYPE Entry IS Object (
Name VARCHAR2(1024),
Value VARCHAR2(1024)
& the varray is :
TYPE EntryArr IS varray(10) OF Entry ;
& the procedure is :
PROCEDURE myProc( myEntryArr IN EntryArr )
AS
s varchar2(1024);
BEGIN
for i in 1.. myEntryArr .COUNT loop
if myEntryArr(i).Name = 'Name1' then
s := myEntryArr(i).Value
end loop;
end;hi 429071
Maybe you can find some useful information in:
"Oracle Database Java Developer's Guide"
http://download-west.oracle.com/docs/cd/B14117_01/java.101/b12021.pdf
see "6 Publishing Java Classes With Call Specs" > "Writing Object Type Call Specs"
success
Jan Vervecken -
Error report: ORA-06531: Reference to uninitialized collection
I have Procedure like this
declare
CURSOR lcu_emp
IS
(SELECT *
FROM
emp);
ln_count PLS_INTEGER := 1;
TYPE emp_TBL_TYPE
IS
TABLE OF LCU_emp%ROWTYPE;
LT_emp emp_TBL_TYPE;
begin
FOR Lr_EMP IN LCU_EMP
LOOP
ln_count :=1;
Lr_EMP.EMP_NO:='1234'; -- updating the loop variable ... just for eg its 1234
--Transferring the loop variable to collection
lt_PREV_ASSIGN(ln_count):= Lr_PREV_ASSIGN; -- THis line its errorring it as Error report: ORA-06531: Reference to uninitialized collection
END LOOP;
FOR lr_emp IN lt_emp.FIRST..lt_emp.LAST
LOOP
-- printing records when LT_emp (lr_emp ).emp_no = 1234;
END LOOP;
end;Please help how to assign cursor record to collection...
Thanks
Vinoth.The realtime procedure is below... i thought it will be easy for u guys to understand
PROCEDURE MAIN(
P_ERRBUFF OUT VARCHAR2,
P_RETCODE OUT NUMBER,
P_BUSINESS_GROUP_ID IN NUMBER,
P_EFFECTIVE_DATE IN VARCHAR2,
p_debug_flag IN VARCHAR2 )
AS
LN_ELEMENT_LINK_ID pay_element_links_f.element_link_id%TYPE;
LN_INPUT_VALUE_ID1 pay_input_values_f.input_value_id%TYPE;
LN_INPUT_VALUE_ID2 pay_input_values_f.input_value_id%TYPE;
ld_effective_start_date pay_element_entries_f.effective_start_date%TYPE;
LD_EFFECTIVE_END_DATE PAY_ELEMENT_ENTRIES_F.EFFECTIVE_END_DATE%TYPE;
LN_ELEMENT_ENTRY_ID PAY_ELEMENT_ENTRIES_F.ELEMENT_ENTRY_ID%TYPE;
ln_object_version_number pay_element_entries_f.object_version_number%TYPE;
lc_create_warning BOOLEAN;
CURSOR lcu_prev_assign
IS
(SELECT *
FROM
(SELECT P_PAAF.ASSIGNMENT_ID PREV_ASSIGNMENT_ID,
C_PAAF.ASSIGNMENT_ID CURR_ASSIGNMENT_ID,
PAP.ACCRUAL_PLAN_NAME ACCRUAL_PLAN_NAME,
APPS.PER_UTILITY_FUNCTIONS.GET_NET_ACCRUAL ( P_PAAF.ASSIGNMENT_ID, P_PAAF.PAYROLL_ID , P_PAAF.BUSINESS_GROUP_ID, -1 , TRUNC(XPPOS.PREV_ACTUAL_TERMINATION_DATE) , PAP.ACCRUAL_PLAN_ID) NET_ACCRUAL,
XPPOS.PERIOD_OF_SERVICE_ID,
XPPOS.PERSON_ID,
XPPOS.CURRENT_DATE_START ,
XPPOS.PREVIOUS_DATE_START,
XPPOS.CURR_ACTUAL_TERMINATION_DATE,
XPPOS.PREV_ACTUAL_TERMINATION_DATE ,
XPPOS.PREV_LSP_DATE PREV_LSP_DATE,
P_PAAF.BUSINESS_GROUP_ID PREV_BG_ID ,
c_paaf.business_group_id curr_bg_id ,
'N' NEW_ASSIGNMENT_ELEIGIBLE ,
NULL PTO_ELIGBLE_DATE,
NULL status,
NULL ERROR_MESSAGE,
NULL PREV_ASS_ELEMENT_ENTRY_ID,
null curr_ass_element_entry_id
FROM
(SELECT PERIOD_OF_SERVICE_ID,
PERSON_ID,
DATE_START CURRENT_DATE_START,
LEAD(DATE_START,1,NULL) OVER(PARTITION BY PERSON_ID ORDER BY DMY_ORDER) PREVIOUS_DATE_START,
ACTUAL_TERMINATION_DATE CURR_ACTUAL_TERMINATION_DATE,
LEAD(ACTUAL_TERMINATION_DATE,1,NULL) OVER(PARTITION BY PERSON_ID ORDER BY DMY_ORDER) PREV_ACTUAL_TERMINATION_DATE,
lead(last_standard_process_date ,1,NULL) over(PARTITION BY person_id ORDER BY DMY_ORDER) prev_lsp_date,
row_number() over (PARTITION BY person_id ORDER BY date_start DESC) DMY_SLCT
FROM
(SELECT period_of_service_id ,
PERSON_ID ,
DATE_START,
ACTUAL_TERMINATION_DATE,
last_standard_process_date,
COUNT(PERSON_ID) OVER (PARTITION BY PERSON_ID) "CNT",
row_number() over (PARTITION BY person_id ORDER BY date_start DESC) "DMY_ORDER"
FROM PER_PERIODS_OF_SERVICE PPOS
WHERE CNT >=2
AND DMY_ORDER IN (1,2)
) XPPOS,
PER_ALL_ASSIGNMENTS_F C_PAAF ,
PER_ALL_ASSIGNMENTS_F P_PAAF,
PAY_ELEMENT_ENTRIES_F P_PEEF,
PAY_ACCRUAL_PLANS PAP,
PER_PERSON_TYPE_USAGES_F P_PPTUF,
PER_PERSON_TYPES P_PPT
WHERE XPPOS.DMY_SLCT =1
AND C_PAAF.PERSON_ID = XPPOS.PERSON_ID
AND TRUNC(CURRENT_DATE_START) BETWEEN C_PAAF.EFFECTIVE_START_DATE AND C_PAAF.EFFECTIVE_END_DATE
AND C_PAAF.PRIMARY_FLAG = 'Y'
AND P_PAAF.PERSON_ID = XPPOS.PERSON_ID
AND TRUNC(prev_actual_termination_date) BETWEEN P_PAAF.EFFECTIVE_START_DATE AND P_PAAF.EFFECTIVE_END_DATE
AND P_PAAF.PRIMARY_FLAG = 'Y'
AND P_PEEF.ASSIGNMENT_ID = P_PAAF.ASSIGNMENT_ID
AND TRUNC(PREV_ACTUAL_TERMINATION_DATE) BETWEEN P_PEEF.EFFECTIVE_START_DATE AND P_PEEF.EFFECTIVE_END_DATE
AND PAP.ACCRUAL_PLAN_ELEMENT_TYPE_ID = P_PEEF.ELEMENT_TYPE_ID
AND C_PAAF.BUSINESS_GROUP_ID = P_BUSINESS_GROUP_ID
AND TRUNC(PREV_ACTUAL_TERMINATION_DATE) BETWEEN P_PPTUF.EFFECTIVE_START_DATE AND P_PPTUF.EFFECTIVE_END_DATE
AND P_PPTUF.PERSON_ID = P_PAAF.PERSON_ID
AND P_PPTUF.PERSON_TYPE_ID = P_PPT.PERSON_TYPE_ID
AND P_PPT.SYSTEM_PERSON_TYPE IN ('EMP', 'EMP_APL')
AND P_PAAF.EMPLOYMENT_CATEGORY IN ('LOCAL' , 'FR')
AND C_PAAF.ASSIGNMENT_ID = 83528
AND APPS.PER_UTILITY_FUNCTIONS.GET_NET_ACCRUAL ( P_PAAF.ASSIGNMENT_ID, P_PAAF.PAYROLL_ID , P_PAAF.BUSINESS_GROUP_ID, -1 , TRUNC(XPPOS.PREV_ACTUAL_TERMINATION_DATE) , PAP.ACCRUAL_PLAN_ID) <> 0
ORDER BY NEW_ASSIGNMENT_ELEIGIBLE
CURSOR LCU_PTO_ELGIBLE(P_ASSIGNMENT_ID NUMBER , P_PLAN_NAME VARCHAR2 , P_EFF_DATE DATE)
IS
(SELECT MIN(peef.EFFECTIVE_START_DATE) pto_eligble_date
FROM PAY_ELEMENT_ENTRIES_F PEEF,
PAY_ELEMENT_TYPES_F PETF
WHERE PEEF.ASSIGNMENT_ID = P_ASSIGNMENT_ID
AND PETF.element_NAME = P_PLAN_NAME
AND TRUNC(p_eff_date) BETWEEN petf.effective_start_date AND petf.effective_end_date
CURSOR LCU_ELEMENT_LINK(p_plan_name VARCHAR2,p_eff_date DATE)
IS
(SELECT PIVF1.INPUT_VALUE_ID INPUT_VALUE_ID1,
PIVF2.INPUT_VALUE_ID INPUT_VALUE_ID2,
PELF.ELEMENT_LINK_ID
FROM PAY_ELEMENT_LINKS_F PELF ,
PAY_ELEMENT_TYPES_F PETF,
pay_input_values_f pivf1 ,
pay_input_values_f pivf2
WHERE PELF.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
AND PIVF1.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
AND PIVF2.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
AND TRUNC(P_EFF_DATE) BETWEEN PELF.EFFECTIVE_START_DATE AND PELF.EFFECTIVE_END_DATE
AND TRUNC(P_EFF_DATE) BETWEEN PETF.EFFECTIVE_START_DATE AND PETF.EFFECTIVE_END_DATE
AND TRUNC(P_EFF_DATE) BETWEEN PIVF1.EFFECTIVE_START_DATE AND PIVF1.EFFECTIVE_END_DATE
AND TRUNC(p_eff_date) BETWEEN pivf2.effective_start_date AND pivf2.effective_end_date
AND ELEMENT_NAME = p_plan_name
||' RollOver Adj'
AND PIVF2.NAME = 'Hours'
AND PIVF1.NAME = 'Effective Date'
AND petf.BUSINESS_GROUP_ID = P_BUSINESS_GROUP_ID
ln_count PLS_INTEGER := 1;
TYPE PREV_ASSIGN_TBL_TYPE
IS
TABLE OF LCU_PREV_ASSIGN%ROWTYPE;
LT_PREV_ASSIGN PREV_ASSIGN_TBL_TYPE;
--LR_PREV_ASSIGN LCU_PREV_ASSIGN%ROWTYPE;
--Lb_PREV_ASSIGN LCU_PREV_ASSIGN%ROWTYPE;
BEGIN
FOR Lr_PREV_ASSIGN IN LCU_PREV_ASSIGN
LOOP
ln_count :=1;
LN_ELEMENT_LINK_ID := NULL;
LN_INPUT_VALUE_ID1 := NULL;
LN_INPUT_VALUE_ID2 := NULL;
FOR LRU_ELEMENT_LINK IN LCU_ELEMENT_LINK (Lr_PREV_ASSIGN.ACCRUAL_PLAN_NAME,LR_PREV_ASSIGN.PREV_LSP_DATE )
LOOP
LN_ELEMENT_LINK_ID :=LRU_ELEMENT_LINK.ELEMENT_LINK_ID;
LN_INPUT_VALUE_ID1 := LRU_ELEMENT_LINK.input_value_id1;
LN_INPUT_VALUE_ID2 := LRU_ELEMENT_LINK.INPUT_VALUE_ID2;
BEGIN
apps.pay_element_entry_api.create_element_entry ( P_EFFECTIVE_DATE => LR_PREV_ASSIGN.PREV_LSP_DATE, P_BUSINESS_GROUP_ID => LR_PREV_ASSIGN.PREV_BG_ID ,p_assignment_id => Lr_PREV_ASSIGN.prev_assignment_id ,p_element_link_id => ln_element_link_id ,p_entry_type => 'E'
--,p_creator_type => 'F'
--,p_cost_allocation_keyflex_id => cost_keyflex_id
--,p_date_earned => l_week_ending_date
,p_input_value_id1 => LN_INPUT_VALUE_ID1 ,p_input_value_id2 => LN_INPUT_VALUE_ID2
--,p_input_value_id3 => l_inp_value3_id
--,p_input_value_id4 => l_inp_value4_id
,P_ENTRY_VALUE1 => LR_PREV_ASSIGN.PREV_ACTUAL_TERMINATION_DATE ,p_entry_value2 => (-1)* LR_PREV_ASSIGN.net_accrual
--,p_entry_value3 => l_constant_all_deductions
--,p_entry_value4 => l_constant_no
,p_effective_start_date => ld_effective_start_date ,p_effective_end_date => ld_effective_end_date ,p_element_entry_id => ln_element_entry_id ,p_object_version_number => ln_object_version_number ,P_CREATE_WARNING => LC_CREATE_WARNING );
LR_PREV_ASSIGN.STATUS :='P';
Lr_PREV_ASSIGN.prev_ass_element_entry_id := ln_element_entry_id;
EXCEPTION
WHEN OTHERS THEN
LR_PREV_ASSIGN.STATUS :='E';
Lr_PREV_ASSIGN.error_message := SQLERRM;
END;
END LOOP;
FOR LR_PTO_ELGIBLE IN LCU_PTO_ELGIBLE(LR_PREV_ASSIGN.CURR_ASSIGNMENT_ID ,LR_PREV_ASSIGN.ACCRUAL_PLAN_NAME , LR_PREV_ASSIGN.CURRENT_DATE_START )
LOOP
LR_PREV_ASSIGN.NEW_ASSIGNMENT_ELEIGIBLE := 'Y';
LR_PREV_ASSIGN.pto_eligble_date := LR_PTO_ELGIBLE.pto_eligble_date ;
END LOOP;
IF(LR_PREV_ASSIGN.STATUS = 'P')
then
BEGIN
apps.pay_element_entry_api.create_element_entry (
P_EFFECTIVE_DATE => LR_PREV_ASSIGN.pto_eligble_date ,
P_BUSINESS_GROUP_ID => LR_PREV_ASSIGN.CURR_BG_ID ,
P_ASSIGNMENT_ID => LR_PREV_ASSIGN.CURR_ASSIGNMENT_ID ,
P_ELEMENT_LINK_ID => LN_ELEMENT_LINK_ID ,
p_entry_type => 'E'
--,p_creator_type => 'F'
--,p_cost_allocation_keyflex_id => cost_keyflex_id
--,p_date_earned => l_week_ending_date
,P_INPUT_VALUE_ID1 => LN_INPUT_VALUE_ID1
,p_input_value_id2 => LN_INPUT_VALUE_ID2
--,p_input_value_id3 => l_inp_value3_id
--,p_input_value_id4 => l_inp_value4_id
,P_ENTRY_VALUE1 => LR_PREV_ASSIGN.PTO_ELIGBLE_DATE ,
p_entry_value2 => LR_PREV_ASSIGN.net_accrual
--,p_entry_value3 => l_constant_all_deductions
--,p_entry_value4 => l_constant_no
,P_EFFECTIVE_START_DATE => LD_EFFECTIVE_START_DATE ,
P_EFFECTIVE_END_DATE => LD_EFFECTIVE_END_DATE ,
P_ELEMENT_ENTRY_ID => LN_ELEMENT_ENTRY_ID ,
P_OBJECT_VERSION_NUMBER => LN_OBJECT_VERSION_NUMBER ,
P_CREATE_WARNING => LC_CREATE_WARNING );
LR_PREV_ASSIGN.STATUS :='S';
LR_PREV_ASSIGN.CURR_ASS_ELEMENT_ENTRY_ID := LN_ELEMENT_ENTRY_ID;
commit;
EXCEPTION
WHEN OTHERS THEN
rollback;
LR_PREV_ASSIGN.STATUS :='E';
LR_PREV_ASSIGN.ERROR_MESSAGE := SQLERRM;
END;
END IF;
lt_PREV_ASSIGN(ln_count):= Lr_PREV_ASSIGN;
ln_count:=ln_count+1;
END LOOP;
FOR lr_prev_assign IN lt_prev_assign.FIRST..lt_prev_assign.LAST
LOOP
IF(lt_prev_assign(lr_prev_assign).status = 'E')
THEN
FND_FILE.PUT_LINE(FND_FILE.LOG,lt_prev_assign(lr_prev_assign).error_message);
end if;
--print the error records here
END LOOP;
END MAIN;
Maybe you are looking for
-
SSRS 2008 - How to chnage the display axis title?
Hi all, I have a bubble chart. Currently the values shown on y axis are 1,2,3 and 4. Since it is mandatory to have a numeric value on y axis so i want to change the axis title just for display. I want to change the axis title to some string value j
-
I have Photoshop CC (English), and Kuler does not show up under the Windows/Extensions menu. Is there a download for Kuler that I need? How do I get it to show up?
-
1) Error: 1042006: Network Error [10061]: Unable To Connect To [TestServer:1423]. The client timed out waiting to connect to the Essbase Agent using TCP/IP. Check your network connections. Also please make sure that Server and Port values are cor
-
Hi can anybody know exactly no of tables in SAP ECC 6.0 . whats is their application? kaustubh
-
Refundable deposite value does not show in customer balance
User had created a miscellaniuos reciept in AR to record once of the customer refundable deposite. At the period end it was noticed that the amount remain in the cash clearing account. But user need to show the refundable depotice on the customer bal