/* This file contains custom type definitions and helper functions.
 */

/* For some reason CREATE OR REPLACE TYPE does not work on Oracle 10.2. */
BEGIN
  BEGIN
    EXECUTE IMMEDIATE 'DROP TYPE Numbers';
  EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE != -4043 THEN RAISE; END IF;
  END;
END;
/

CREATE TYPE Numbers AS VARRAY(100) OF NUMBER(10);
/

CREATE OR REPLACE FUNCTION string_to_numbers(in_str IN VARCHAR2) RETURN Numbers
IS
  ret          Numbers := Numbers();
  s_pos        NUMBER := 1;
  e_pos        NUMBER := 0;
BEGIN
   IF in_str IS NOT NULL THEN
     LOOP
       e_pos := INSTR(in_str, ',', s_pos);
       EXIT WHEN e_pos = 0;
       ret.extend;
       ret(ret.COUNT) := CAST(SUBSTR(in_str, s_pos, e_pos - s_pos) AS NUMBER);
       s_pos := e_pos + 1;
     END LOOP;
     ret.extend;
     ret(ret.COUNT) := CAST(SUBSTR(in_str, s_pos) AS NUMBER);
   END IF;
   RETURN ret;
END;
/

CREATE OR REPLACE FUNCTION numbers_to_string(in_nums IN Numbers) RETURN VARCHAR2
IS
  ret          VARCHAR2(1500);
BEGIN
  IF in_nums.COUNT != 0 THEN
    FOR i IN in_nums.FIRST .. in_nums.LAST LOOP
      IF i != in_nums.FIRST THEN
        ret := ret || ',';
      END IF;
      ret := ret || in_nums(i);
    END LOOP;
  END IF;
  RETURN ret;
END;
/