Как устранить зависимость подтипов?

В приведенном ниже примере я написал одну функцию to_str () и одну процедуру set () для каждого подтипа pls_integer . Функции и процедуры почти идентичны, за исключением типа.

Как я могу избавиться от необходимости писать еще один to_str () и set () для нового подтипа без отказа ограничение, предоставляемое подтипом?

Возвращение к varchar2 , например

procedure set(list in varchar2, prefix in varchar2)

, а затем вызов его как

set(to_str(list), 'foos:')

, не кажется слишком хорошей идеей, и мне все равно нужно предоставить to_str ( ) для каждого подтипа.

Я открыт для всевозможных предложений, так как я новичок в Oracle, и новые функции Oracle удивляют меня почти ежедневно.

Я использую 11.2.0.1.0.

create table so1table (
  id number,
  data varchar(20)
);

create or replace package so1 as
  subtype foo_t is pls_integer range 0 .. 4 not null;
  type foolist is table of foo_t;
  procedure set(id_ in number, list in foolist default foolist(1));

  subtype bar_t is pls_integer range 5 .. 10 not null;
  type barlist is table of bar_t;
  procedure set(id_ in number, list in barlist default barlist(5));
end;
/
show errors

create or replace package body so1 as
  /* Do I have always to implement these very similar functions/procedures for
  every single type ? */
  function to_str(list in foolist) return varchar2 as
    str varchar2(32767);
  begin
    for i in list.first .. list.last loop
      str := str || ' ' || list(i);
    end loop;
    return str;
  end;

  function to_str(list in barlist) return varchar2 as
    str varchar2(32767);
  begin
    for i in list.first .. list.last loop
      str := str || ' ' || list(i);
    end loop;
    return str;
  end;

  procedure set(id_ in number, list in foolist default foolist(1)) as
    values_ constant varchar2(32767) := 'foos:' || to_str(list);
  begin
    insert into so1table (id, data) values (id_, values_);
  end;

  procedure set(id_ in number, list in barlist default barlist(5)) as
    values_ constant varchar2(32767) := 'bars:' || to_str(list);
  begin
    insert into so1table (id, data) values (id_, values_);
  end;
end;
/
show errors

begin
  so1.set(1, so1.foolist(0, 3));
  so1.set(2, so1.barlist(5, 7, 10));
end;
/

SQLPLUS> select * from so1table;

        ID DATA
---------- --------------------
         1 foos: 0 3
         2 bars: 5 7 10
20
задан Mouna Cheikhna 9 August 2011 в 21:00
поделиться