全て、
私は SQL は初めてではありませんが、長い間、Oracle は初めてです。また、私がこれを行った方法がおそらく最も遅い解決策であることを知っていることに注意してください。問題は、それが機能したことです。これを拡張して 1,000,000 をテストしたいのですが、これは競走馬ではなくロバであることがわかっています。
会社名のリストを「標準化」する小さなタスクがあったので、既知の略語を含む表を作成しました
Col1 Col2 Col3 Col4 …. Col14
Company Co Cmpy
Limited Ltd Lim LMT
Etc
次に、このテーブルをカーソルに選択し、それに送信された名前ごとにループして、「非」標準の略語を列 1 の略語に置き換える関数を作成しました。次を使用します。
私が考えているのは、コードを書き直して (明らかに) パッケージに入れることです。これにより、現在と比較してかなりの速度と明確さが得られるはずです。
私が抱えている問題は、関数のループ部分を実際に改善することではありませんが、この関数を呼び出す Select から実行して、STD_GBR_CO_SUFFIX を 1 回だけロードし、カーソルを再利用するようにする必要があります。
私は O'Reilly のいくつかを読んでいて、やりたいことは可能だと思いますが、方法がわかりません。
これをパッケージに入れ、REF Cursor を使用する必要があると思います。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;
/