I'm facing one problem with Varrays. I have to use Varrays as input
and output parameters in a procedure. When I assign a value to
Varray, Oracle errored out as and asking for Initialize the Varray.
SQLcreate type acct_obj as object (acct_num varchar2(20),
2 name1 varchar2(20)
3 )
4 /
Type created.
SQL>
SQLcreate type acct_arr is VARRAY(6) OF acct_obj
2 /
Type created.
SQL>
SQLcreate type addr_obj as object (
2 name1 varchar2(20),
3 addr_line1 varchar2(30),
4 addr_line2 varchar2(30),
5 addr_line3 varchar2(30),
6 city varchar2(20),
7 state varchar2(2),
8 zip varchar2(7)
9 )
10 /
Type created.
SQL>
SQLcreate type addr_arr is VARRAY(6) OF addr_obj
2 /
Type created.
SQL>
SQLcreate type return_arr is VARRAY(6) of number(6)
2 /
Type created.
SQL>
SQL--=============== =============== ========
SQL--Package Creation
SQL--=============== =============== ========
SQLCREATE OR REPLACE PACKAGE acct_retr AS
2
3 PROCEDURE find_addr (
4 i_number IN NUMBER,
5 i_name1 IN acct_arr,
6 o_addr OUT addr_arr,
7 o_return_code OUT return_arr
8 );
9 END acct_retr;
10 /
Package created.
SQL>
SQLCREATE OR REPLACE PACKAGE BODY acct_retr AS
2
3 error_in_input NUMBER(2) := 2;
4
5 PROCEDURE find_addr (
6 i_number IN NUMBER,
7 i_name1 IN acct_arr,
8 o_addr OUT addr_arr,
9 o_return_code OUT return_arr
10 )
11 IS
12 Invalid_range EXCEPTION;
13 BEGIN
14 IF (NVL(i_number,0 ) <= 0 or i_number 6) THEN
15 RAISE invalid_range;
16 END IF;
17 --
18 -- Retrieve from database and fill address array and send account
address
19 -- array to the calling program
20 -- ............
21 EXCEPTION
22 WHEN invalid_range THEN
23 o_return_code(1 ) := error_in_input;
24 o_addr := NULL;
25 END find_addr;
26
27 END acct_retr;
28 /
Package body created.
SQLdeclare
2 i_number NUMBER(2):= NULL;
3 i_name1 acct_arr;
4 o_addr addr_arr;
5 o_return_code return_arr;
6 begin
7 acct_retr.find_ addr(i_number, i_name1,
8 o_addr, o_return_code);
9 dbms_output.put _line(NVL(o_add r(1).name1, 'No Issuer'));
10 dbms_output.put _line('Return Code '||o_return_cod e(1));
11 end;
12 /
declare
*
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at "OPS$UBTDEV.ACC T_RETR", line 23
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at line 7
Thanks for all helping me.
and output parameters in a procedure. When I assign a value to
Varray, Oracle errored out as and asking for Initialize the Varray.
SQLcreate type acct_obj as object (acct_num varchar2(20),
2 name1 varchar2(20)
3 )
4 /
Type created.
SQL>
SQLcreate type acct_arr is VARRAY(6) OF acct_obj
2 /
Type created.
SQL>
SQLcreate type addr_obj as object (
2 name1 varchar2(20),
3 addr_line1 varchar2(30),
4 addr_line2 varchar2(30),
5 addr_line3 varchar2(30),
6 city varchar2(20),
7 state varchar2(2),
8 zip varchar2(7)
9 )
10 /
Type created.
SQL>
SQLcreate type addr_arr is VARRAY(6) OF addr_obj
2 /
Type created.
SQL>
SQLcreate type return_arr is VARRAY(6) of number(6)
2 /
Type created.
SQL>
SQL--=============== =============== ========
SQL--Package Creation
SQL--=============== =============== ========
SQLCREATE OR REPLACE PACKAGE acct_retr AS
2
3 PROCEDURE find_addr (
4 i_number IN NUMBER,
5 i_name1 IN acct_arr,
6 o_addr OUT addr_arr,
7 o_return_code OUT return_arr
8 );
9 END acct_retr;
10 /
Package created.
SQL>
SQLCREATE OR REPLACE PACKAGE BODY acct_retr AS
2
3 error_in_input NUMBER(2) := 2;
4
5 PROCEDURE find_addr (
6 i_number IN NUMBER,
7 i_name1 IN acct_arr,
8 o_addr OUT addr_arr,
9 o_return_code OUT return_arr
10 )
11 IS
12 Invalid_range EXCEPTION;
13 BEGIN
14 IF (NVL(i_number,0 ) <= 0 or i_number 6) THEN
15 RAISE invalid_range;
16 END IF;
17 --
18 -- Retrieve from database and fill address array and send account
address
19 -- array to the calling program
20 -- ............
21 EXCEPTION
22 WHEN invalid_range THEN
23 o_return_code(1 ) := error_in_input;
24 o_addr := NULL;
25 END find_addr;
26
27 END acct_retr;
28 /
Package body created.
SQLdeclare
2 i_number NUMBER(2):= NULL;
3 i_name1 acct_arr;
4 o_addr addr_arr;
5 o_return_code return_arr;
6 begin
7 acct_retr.find_ addr(i_number, i_name1,
8 o_addr, o_return_code);
9 dbms_output.put _line(NVL(o_add r(1).name1, 'No Issuer'));
10 dbms_output.put _line('Return Code '||o_return_cod e(1));
11 end;
12 /
declare
*
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at "OPS$UBTDEV.ACC T_RETR", line 23
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at line 7
Thanks for all helping me.