以下の例では、pls_integer
サブタイプごとに1つのto_str()
関数と1つのset()
プロシージャを書きました。関数とプロシージャは、型を除いてほぼ同じです。サブタイプの依存関係を解消するにはどうすればいいですか?
サブタイプによって提供されている制約を諦めることなく、新しいサブタイプの別のto_str()
とset()
を書き込む必要性をどのように排除できますか?
procedure set(list in varchar2, prefix in varchar2)
よう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
これまでの回答では、これはPL/SQLの痛みであり、おそらくサブタイプでは可能ではないと考えています。たぶん私はより大きなハンマーを使用する必要があります:[PL/SQL With Object Types](http://download.oracle.com/docs/cd/E11882_01/appdev.112/e11822/adobjplsql.htm)? – user272735