【发布时间】:2011-10-06 00:27:01
【问题描述】:
在下面的示例中,我为每个pls_integer 子类型编写了一个to_str() 函数和一个set() 过程。除了类型之外,功能和过程几乎相同。
如何在不放弃子类型提供的约束的情况下消除为新子类型编写另一个 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
【问题讨论】:
-
基于到目前为止的响应(18 个赞成票、4 个最爱和两个不太精确的答案),我认为这是 PL/SQL 的痛点,而子类型可能不可能。也许我必须使用更大的锤子:Using PL/SQL With Object Types?
标签: oracle plsql oracle11g oracle11gr2 subtype