Using a Sequentially-Filled Integer-Indexed Collection
CREATE OR REPLACE PACKAGE string_tracker
IS
SUBTYPE variable_name_t IS VARCHAR2 (32767);
PROCEDURE clear_used_list;
FUNCTION string_in_use (value_in IN variable_name_t) RETURN BOOLEAN;
PROCEDURE mark_as_used (value_in IN variable_name_t);
END string_tracker;
/
CREATE OR REPLACE PACKAGE BODY string_tracker
IS
TYPE used_aat IS TABLE OF variable_name_t INDEX BY PLS_INTEGER;
g_names_used used_aat;
PROCEDURE clear_used_list
IS
BEGIN
g_names_used.delete;
END clear_used_list;
PROCEDURE mark_as_used (value_in IN variable_name_t)
IS
BEGIN
g_names_used (g_names_used.COUNT + 1) := value_in;
END mark_as_used;
FUNCTION string_in_use (value_in IN variable_name_t)
RETURN BOOLEAN
IS
c_count CONSTANT PLS_INTEGER := g_names_used.COUNT;
l_index PLS_INTEGER := g_names_used.FIRST;
l_found BOOLEAN DEFAULT FALSE;
BEGIN
IF l_index IS NOT NULL
THEN
WHILE (NOT l_found AND l_index <= c_count)
LOOP
l_found := value_in = g_names_used (l_index);
l_index := l_index + 1;
END LOOP;
END IF;
RETURN l_found;
END string_in_use;
END string_tracker;
/
CREATE OR REPLACE PACKAGE string_tracker
IS
SUBTYPE variable_name_t IS VARCHAR2 (32767);
PROCEDURE clear_used_list;
PROCEDURE mark_as_used (variable_name_in IN variable_name_t);
FUNCTION string_in_use (variable_name_in IN variable_name_t)
RETURN BOOLEAN;
END string_tracker;
CREATE OR REPLACE PACKAGE BODY string_tracker
IS
/* Note: Datatype of collection is irrelevant.
We never look at the contents of an index value. */
SUBTYPE who_cares_t IS BOOLEAN;
c_does_not_matter CONSTANT who_cares_t DEFAULT NULL;
TYPE used_aat IS TABLE OF who_cares_t
INDEX BY variable_name_t;
g_names_used used_aat;
PROCEDURE clear_used_list
IS
BEGIN
g_names_used.delete;
END clear_used_list;
PROCEDURE mark_as_used (variable_name_in IN variable_name_t)
IS
BEGIN
g_names_used (variable_name_in) := c_does_not_matter;
END mark_as_used;
FUNCTION string_in_use (variable_name_in IN variable_name_t)
RETURN BOOLEAN
IS
BEGIN
RETURN g_names_used.EXISTS (variable_name_in);
END string_in_use;
END string_tracker;