全部,
虽然我对 SQL 并不陌生,但已经有很长一段时间了,而且我对 Oracle 还是很陌生。另请注意,我知道我这样做的方式可能是最慢的解决方案,但正如我所说,我是新手,它适用于我需要测试的 1000 个左右的项目。问题是它确实有效,所以我想扩展它以测试 1,000,000 个,我知道这是一头驴而不是赛马。
有一个“标准化”公司名称列表的小任务,所以我创建了一个包含已知缩写的表
Col1 Col2 Col3 Col4 …. Col14
Company Co Cmpy
Limited Ltd Lim LMT
Etc
然后我写了一个函数来选择这个表到一个游标中,并为每个发送给它的名称循环遍历它,并使用第 1 列中的名称替换任何“NON”标准缩写,使用以下内容:
我一直在考虑的是重写代码(显然)并将其放入一个包中,因为我相信与现在相比,这应该会带来相当大的速度和清晰度。
我遇到的问题并不是真正改进函数的循环部分,而是我需要从调用此函数的 Select 中做些什么,以确保它只加载一次 STD_GBR_CO_SUFFIX 并重新使用游标。
我一直在阅读 O'Reilly 的一些文章,我认为我想做的事情是可能的,但我不知道该怎么做。
我想我需要把它放在一个包中,并使用 REF 光标,BULK LOAD 看起来是一个竞争者,但我读得越多,我就越困惑。如果那里有人可以为我指出正确的方向,我可以从那里继续。我不希望有人只写解决方案,我想学习如何更好地做到这一点,而不是为我完成。
提前感谢大家的帮助。
所以如果我做一个
Select Standardise_Company_Suffix(company_name) AS STD_Company_Name
From VERY_LARGE_TABLE
CREATE OR REPLACE Function Standardise_Company_Suffix(Co_Name IN VARCHAR2)
RETURN varchar2 IS
stg_Co_Name varchar2(400 byte);
fmt_S varchar2(20 byte);
fmt_E varchar2(20 byte);
parse_Str varchar2(2400 byte);
parse_char varchar2(4 byte);
CURSOR C1 IS
-- Populate Cursor with Table of Suffixes
select * from STD_GBR_CO_SUFFIX;
BEGIN
parse_char := "s";
Fmt_S := '(^|\'||parse_char||')';
Fmt_E := '(\'||parse_char||'|$)';
stg_Co_Name := upper(co_name);
parse_str := ' ';
FOR c1pass IN C1 LOOP
parse_str :='';
If c1pass.column14 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column14)||Fmt_E; End If;
If c1pass.column13 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column13)||Fmt_E; End If;
If c1pass.column12 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column12)||Fmt_E; End If;
If c1pass.column11 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column11)||Fmt_E; End If;
If c1pass.column10 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column10)||Fmt_E; End If;
If c1pass.column9 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column9)||Fmt_E; End If;
If c1pass.column8 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column8)||Fmt_E; End If;
If c1pass.column7 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column7)||Fmt_E; End If;
If c1pass.column6 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column6)||Fmt_E; End If;
If c1pass.column5 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column5)||Fmt_E; End If;
If c1pass.column4 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column4)||Fmt_E; End If;
If c1pass.column3 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column3)||Fmt_E; End If;
If c1pass.column2 is not null then parse_str := parse_str||'|'||Fmt_S||Upper(c1pass.column2)||Fmt_E; End If;
Parse_str := substr(parse_str,2);
If regexp_instr(stg_Co_Name,parse_str) <> 0 Then
stg_Co_Name := regexp_REPLACE(stg_Co_Name,parse_str,
' $'||UPPER(c1pass.column1||'$ '));
Else
stg_Co_Name := stg_Co_Name;
End if;
END LOOP;
return stg_Co_Name;
End;
/