If you really do want an associative array...
Write an anonymous PL/SQL block to call it:
SQL Fiddle
Oracle 11g R2 Schema Setup:
CREATE TABLE test (
my_id VARCHAR2(10),
id VARCHAR2(50),
key NUMBER(8,0)
)
/
CREATE PACKAGE my_pkg AS
TYPE USER_ID_TYPE IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
PROCEDURE my_proc(my_id varchar2, ids USER_ID_TYPE);
END;
/
CREATE PACKAGE BODY my_pkg AS
PROCEDURE my_proc(my_id varchar2, ids USER_ID_TYPE)
IS
i BINARY_INTEGER;
BEGIN
i := ids.FIRST;
WHILE i IS NOT NULL LOOP
INSERT INTO test VALUES ( my_id, ids(i), i );
i := ids.NEXT(i);
END LOOP;
END;
END;
/
Query 1:
DECLARE
ids MY_PKG.USER_ID_TYPE;
BEGIN
ids(111) := '222';
ids(42) := 'The Meaning of Life, The Universe and Everything.';
MY_PKG.MY_PROC( '1010', ids );
END;
Query 2:
SELECT * FROM TEST
Results:
| MY_ID | ID | KEY |
|-------|---------------------------------------------------|-----|
| 1010 | The Meaning of Life, The Universe and Everything. | 42 |
| 1010 | 222 | 111 |
However, you probably just want a collection (array) not an associative array...
... then you can create the array and populate it in the constructor.
So, remove the INDEX BY BINARY_INTEGER from your type declaration:
SQL Fiddle
Oracle 11g R2 Schema Setup:
CREATE TABLE test (
my_id VARCHAR2(10),
id VARCHAR2(50),
key NUMBER(8,0)
)
/
CREATE PACKAGE my_pkg AS
TYPE USER_ID_TYPE IS TABLE OF VARCHAR2(50);
PROCEDURE my_proc(my_id varchar2, ids USER_ID_TYPE);
END;
/
CREATE PACKAGE BODY my_pkg AS
PROCEDURE my_proc(my_id varchar2, ids USER_ID_TYPE)
IS
BEGIN
FOR i IN 1 .. ids.COUNT LOOP
INSERT INTO test VALUES ( my_id, ids(i), i );
END LOOP;
END;
END;
/
Query 1:
BEGIN
MY_PKG.MY_PROC( '1010', MY_PKG.USER_ID_TYPE( '111', '222' ) );
END;
Query 2:
SELECT * FROM TEST
Results:
| MY_ID | ID | KEY |
|-------|-----|-----|
| 1010 | 111 | 1 |
| 1010 | 222 | 2 |
TABLE OF) by just using the constructor (sort of) like that but not a PL/SQL associative array (TABLE OF ... INDEX BY).