नीचे दिए गए उदाहरण में मैंने प्रत्येक सबटाइप के लिए एक to_str()
फ़ंक्शन और एक set()
प्रक्रिया लिखा है। कार्य और प्रक्रियाएं प्रकार को छोड़कर लगभग समान हैं।उप प्रकार निर्भरता को कैसे खत्म करें?
मैं कैसे उप प्रकार द्वारा प्रदान की बाधा को देने के बिना अभी तक एक और to_str()
और set()
एक नया उप-प्रकार के लिए लिखने के लिए की आवश्यकता को समाप्त कर सकते हैं?
तरह
procedure set(list in varchar2, prefix in varchar2)
varchar2
पर वापस गिरने और फिर
set(to_str(list), 'foos:')
यह बुला भी बहुत अच्छा विचार नहीं लग रहा है और मैं अभी भी एक उप-प्रकार के लिए to_str()
प्रदान करने के लिए की जरूरत है।
मैं सभी प्रकार के विभिन्न प्रस्तावों के लिए खुला हूं क्योंकि मैं ओरेकल नौसिखिया हूं और नई ओरेकल सुविधाओं में मुझे लगभग दैनिक लगता है।
मैं 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 पसंदीदा और दो सटीक उत्तर नहीं) अब तक मुझे लगता है कि यह एक पीएल/एसक्यूएल का दर्द बिंदु है और शायद उपप्रकारों के साथ संभव नहीं है। शायद मुझे एक बड़ा हथौड़ा का उपयोग करना होगा: [ऑब्जेक्ट प्रकारों के साथ पीएल/एसक्यूएल का उपयोग करना] (http://download.oracle.com/docs/cd/E11882_01/appdev.112/e11822/adobjplsql.htm)? – user272735