"как мы можем изменить эту процедуру, чтобы пользователь мог одновременно ввести n чисел во вложенную таблицу?"
Вопрос в том, сколькодетали реализации вы хотите показать потребителю вашей процедуры?Вы можете защитить их от типов объектов в целом, но это позволит им добавлять только один город за раз ...
CREATE OR REPLACE PACKAGE pkg_country AS
PROCEDURE add_country (o_countryname IN varchar2
, o_continent IN varchar2
, p_town_name in varchar2
, p_town_pop in varchar2
, p_town_descr in varchar2 );
PROCEDURE add_town (o_countryname IN varchar2
, p_town_name in varchar2
, p_town_pop in varchar2
, p_town_descr in varchar2 );
END;
/
CREATE OR REPLACE PACKAGE BODY pkg_country AS
PROCEDURE add_country (o_countryname IN varchar2
, o_continent IN varchar2
, p_town_name in varchar2
, p_town_pop in varchar2
, p_town_descr in varchar2 )
IS
BEGIN
INSERT INTO country_objtab VALUES
( NEW country_objtyp (o_countryname,
o_continent,
NEW town_nestedtyp (
new town_objtyp(p_town_name ,
p_town_pop ,
p_town_descr )
)
)
);
END add_country;
PROCEDURE add_town (o_countryname IN varchar2
, p_town_name in varchar2
, p_town_pop in varchar2
, p_town_descr in varchar2 )
IS
BEGIN
insert into the
(select t.town_nested from Country_objtab t
where t.countryname = o_countryname)
values ( new town_objtyp(p_town_name ,
p_town_pop ,
p_town_descr ));
END add_town;
END pkg_country;
/
Чтобы создать страну с несколькими городами одновременно, вы можете изменить подпись напринять несколько городских объектов:
CREATE OR REPLACE PACKAGE pkg_country AS
PROCEDURE add_country (o_countryname IN varchar2
, o_continent IN varchar2
, p_town_1 in town_objtyp := null
, p_town_2 in town_objtyp := null
, p_town_3 in town_objtyp := null );
PROCEDURE add_town (o_countryname IN varchar2
, p_town in town_objtyp );
END;
/
CREATE OR REPLACE PACKAGE BODY pkg_country AS
PROCEDURE add_country (o_countryname IN varchar2
, o_continent IN varchar2
, p_town_1 in town_objtyp := null
, p_town_2 in town_objtyp := null
, p_town_3 in town_objtyp := null )
IS
l_towns town_nestedtyp := new town_nestedtyp();
BEGIN
if p_town_1 is not null then
l_towns.extend();
l_towns(l_towns.count()) := p_town_1;
end if;
if p_town_2 is not null then
l_towns.extend();
l_towns(l_towns.count()) := p_town_2;
end if;
if p_town_3 is not null then
l_towns.extend();
l_towns(l_towns.count()) := p_town_3;
end if;
INSERT INTO country_objtab VALUES
( NEW country_objtyp (o_countryname,
o_continent,
l_towns
)
);
END add_country;
PROCEDURE add_town (o_countryname IN varchar2
, p_town_name in varchar2
, p_town_pop in varchar2
, p_town_descr in varchar2 )
IS
BEGIN
insert into the
(select t.town_nested from Country_objtab t
where t.countryname = o_countryname)
values ( new town_objtyp(p_town_name ,
p_town_pop ,
p_town_descr ));
END add_town;
END pkg_country;
/
Это явно неуклюжий интерфейс и неуклюжая реализация.Также это накладывает искусственное и нежелательное ограничение на количество городов, которые могут быть включены в первый звонок.Итак, что вам нужно сделать, это перенести массив в вызывающую программу:
CREATE OR REPLACE PACKAGE pkg_country AS
PROCEDURE add_country (o_countryname IN varchar2
, o_continent IN varchar2
, p_towns in town_nestedtyp);
PROCEDURE add_town (o_countryname IN varchar2
, p_town in town_objtyp );
END;
/
CREATE OR REPLACE PACKAGE BODY pkg_country AS
PROCEDURE add_country (o_countryname IN varchar2
, o_continent IN varchar2
, p_town_1 in town_objtyp := null
, p_town_2 in town_objtyp := null
, p_town_3 in town_objtyp := null )
IS
BEGIN
INSERT INTO country_objtab VALUES
( NEW country_objtyp (o_countryname,
o_continent,
p_towns
)
);
END add_country;
PROCEDURE add_town (o_countryname IN varchar2
, p_town_name in varchar2
, p_town_pop in varchar2
, p_town_descr in varchar2 )
IS
BEGIN
insert into the
(select t.town_nested from Country_objtab t
where t.countryname = o_countryname)
values ( new town_objtyp(p_town_name ,
p_town_pop ,
p_town_descr ));
END add_town;
END pkg_country;
/