我认为最干净的解决方案是使用 PL/SQL 函数“规范化”您的错误代码表。这样,您可以保留当前(损坏的)表格设计,但仍可以访问其内容,就好像它已正确规范化一样。
create type error_code_type as object (id integer, code varchar(2))
/
create or replace type error_table as table of error_code_type
/
create or replace function unnest_errors
return error_table pipelined
is
codes_l integer;
i integer;
one_row error_code_type := error_code_type(null, null);
begin
for err_rec in (select id, errorcodes from errors) loop
codes_l := length(err_rec.errorcodes);
i := 1;
while i < codes_l loop
one_row.id := err_rec.id;
one_row.code := substr(err_rec.errorcodes, i, 2);
pipe row (one_row);
i := i + 2;
end loop;
end loop;
end;
/
现在使用此功能,您可以执行以下操作:
select er.id, er.code, el.description
from table(unnest_errors) er
join errorlookup el on el.codes = er.code;
您还可以基于该函数创建一个视图,以使语句更易于阅读:
create or replace view normalized_errorcodes
as
select *
from table(unnest_errors);
然后您可以简单地引用真实语句中的视图。
(我在 11.2 上对此进行了测试,但我相信它也应该在 10.x 上工作)