我有一个默认值表,其中包含列名和默认值。在PL/SQL中是否有一种方法可以根据默认表游标中的值设置关联列?
我的真实案例有60个字段,显然比下面的结构更复杂,但维护起来很繁琐。
create table test_defaults (default_type varchar2(20), column_name varchar2(30), column_value varchar2(10));
insert into test_defaults values ('homo sapien','leg_count', '2');
insert into test_defaults values ('homo sapien','animal_class', 'mammal');
insert into test_defaults values ('homo sapien','arm_count', '2');
insert into test_defaults values ('koi','leg_count', '0');
insert into test_defaults values ('koi','animal_class', 'fish');
insert into test_defaults values ('koi','arm_count', '0');
insert into test_defaults values ('horse','leg_count', '4');
insert into test_defaults values ('horse','animal_class', 'mammal');
insert into test_defaults values ('horse','arm_count', '0');
commit;
drop table my_critters;
create table my_critters(my_type varchar2(20),leg_count varchar2(10),animal_class varchar2(10),arm_count varchar2(10));
create or replace procedure build_defaults(critter_type varchar2)
as
critter_rec my_critters%rowtype;
cursor curs_defaults
is
select * from test_defaults where default_type = critter_type;
begin
for default_rec in curs_defaults
loop
critter_rec := null;
case default_rec.column_name
when 'leg_count'
then critter_rec.leg_count := default_rec.column_value;
when 'animal_class'
then critter_rec.animal_class := default_rec.column_value;
when 'arm_count'
then critter_rec.arm_count := default_rec.column_value;
end case;
critter_rec.my_type := critter_type;
end loop;
insert into my_critters values critter_rec;
end;
我想要的是一个简单的方法来分配值的字段,如;
critter_rec[default_rec.column_name] := default_rec.column_value;
当我最后一次看Oracle PL/SQL时,我找不到任何支持这个。我希望新版本能支持它。我的数据库版本是19.11。
编辑:
这个例程是一个更大的例程的一部分,它在一个超过300列的表上工作。大约有90列具有由defaults例程设置的默认值。其中大约60个是根据上面描述的表格设置的。其余的使用离散逻辑设置。
作为一个帧挑战,不要使用游标或记录类型,使用单个INSERT ... SELECT
语句和PIVOT
:
CREATE PROCEDURE build_defaults(
critter_type MY_CRITTERS.MY_TYPE%TYPE
)
AS
BEGIN
INSERT INTO my_critters(my_type, leg_count, animal_class, arm_count)
SELECT default_type, leg_count, animal_class, arm_count
FROM test_defaults
PIVOT (
MAX(column_value)
FOR column_name IN (
'leg_count' AS leg_count,
'animal_class' AS animal_class,
'arm_count' AS arm_count
)
)
WHERE default_type = critter_type;
END;
/
db<此处小提琴>此处小提琴>