Re:SALOON & VBA

郵便番号を更新する(分割する)

ダンマリが辛いので、県単位(47)に分割しました。
BATファイルで起動します。
これで県単位でログが出るので、どこまで実行しているか分かる。
入力データが14000行くらいあり、1000件で1分ぐらいかかるので・・・(汗)
でも、EXCEL VBAよりは速いでしょう。

起動バッチ YUBIN_SET.bat は、↓

CD %^dp0
for /l %%K in (1,1,47) do sqlplus ユーザー名/パスワード@SID @YUBIN_SET.sql %%K

てな感じで。
PL/SQLの方も以下↓のように訂正

/******************************************************************/
/* 郵便番号更新                   YUBIN_SET.sql */
/*  住所.jpの住所データCSVを元に郵便番号を更新する        */
/*  http://jusyo.jp/csv/new.php                 */
/*  パラメータ1:県コード(数字)                 */
/******************************************************************/
-- パスの設定
SET TERMOUT OFF
DEFINE CURRENT_PATH=C:\Users\umebocy_ataru\Oracle
DEFINE EXECUTE_LOG=&CURRENT_PATH\YUBIN_SET_&1.sql.log
SET SERVEROUTPUT ON SIZE 999999
SET LINESIZE 1000
SET TRIMSPOOL ON
SET PAGESIZE 0
SPOOL &EXECUTE_LOG
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') 開始 FROM DUAL;
SHOW USER;
SET TERMOUT ON
PROMPT ===========================================================
PROMPT ADRS3_郵便番号を更新します。 KENCD = &1
PROMPT ===========================================================
PROMPT
SET TERMOUT OFF
DECLARE
 CURSOR csr IS
  SELECT KENCD,SIKUCD - (KENCD * 1000) AS SIKUCD,YUBIN,CYOMEI,NVL(CYOME || TOURINA,'?') AS CYOME
   FROM ZIP_DATA
   WHERE CYOMEI IS NOT NULL
    AND JIGFLG = 0
    AND HAISIFLG = 0
    AND HOSOKU IS NULL
    AND KENCD = &1
   ORDER BY SIKUCD,CYOCD;
 ICntSel  NUMBER;
 ICntUpdate NUMBER;
 ICntSkip  NUMBER;
 WkMojiSu  NUMBER;
 WkOazaMei VARCHAR2(50);
 WkKoazaMei VARCHAR2(50);
 i     NUMBER;
 stSQL   VARCHAR2(200);
 HenFlg   BOOLEAN;
BEGIN
 ICntSel  := 0;
 ICntUpdate := 0;
 ICntSkip  := 0;
 FOR rec IN csr LOOP
   ICntSel := ICntSel + 1;
 -- 大字名の編集
   WkMojiSu := LENGTH(rec.CYOMEI)
        - LENGTH(REPLACE(TRANSLATE(rec.CYOMEI,'0123456789','@@@@@@@@@@'),'@',''));
   WkOazaMei := rec.CYOMEI;
   IF WkMojiSu = 1 THEN
    WkOazaMei := TRANSLATE(rec.CYOMEI,'123456789','一二三四五六七八九');
   END IF;
   IF WkMojiSu > 1 THEN
    WkOazaMei := TRANSLATE(rec.CYOMEI,'0123456789','@@@@@@@@@@');
    WkOazaMei := REPLACE(WkOazaMei,'@@','@十@');
    i     := INSTR(WkOazaMei,'@十');
    WkOazaMei := TRANSLATE(rec.CYOMEI,'0123456789','○一二三四五六七八九');
    IF i > 0 then
      WkOazaMei := SUBSTR(WkOazaMei,1,i) || '十' || SUBSTR(WkOazaMei,i + 1,LENGTH(WkOazaMei) - i);
      WKOazaMei := REPLACE(WKOazaMei,'一十','十');
      WKOazaMei := REPLACE(WKOazaMei,'十○','十');
    END IF;
   END IF;
 -- 小字名の編集
   WkMojiSu := LENGTH(rec.CYOME)
        - LENGTH(REPLACE(TRANSLATE(rec.CYOME,'0123456789','@@@@@@@@@@'),'@',''));
   WkKoazaMei := rec.CYOME;
   IF WkMojiSu = 1 THEN
    WkKoazaMei := TRANSLATE(rec.CYOME,'123456789','一二三四五六七八九');
   END IF;
   IF WkMojiSu > 1 THEN
    WkKoazaMei := TRANSLATE(rec.CYOME,'0123456789','@@@@@@@@@@');
    WkkoazaMei := REPLACE(WkKoazaMei,'@@','@十@');
    i     := INSTR(WkKoazaMei,'@十');
    WkKoazaMei := TRANSLATE(rec.CYOME,'0123456789','○一二三四五六七八九');
    IF i > 0 then
      WkKoazaMei := SUBSTR(WkKoazaMei,1,i) || '十' || SUBSTR(WkKoazaMei,i + 1,LENGTH(WkKoazaMei) - i);
      WKKoazaMei := REPLACE(WKKoazaMei,'一十','十');
      WKKoazaMei := REPLACE(WKKoazaMei,'十○','十');
    END IF;
   END IF;
   WkOazaMei := REPLACE(REPLACE(WkOazaMei,'大字',''),'字','');
   WKKoazaMei := REPLACE(WKKoazaMei,'字','');
   IF WkKoazaMei = '?' THEN
    UPDATE MST_ADRS3 SET YUBIN = rec.YUBIN
     WHERE KEYKENCD = rec.KENCD
      AND KEYSIKUCD = rec.SIKUCD
      AND REPLACE(REPLACE(OAZAMEI,'大字',''),'字','') = WkOazaMei
      AND NVL(YUBIN,'000-0000') <> rec.YUBIN;
   ELSE
    UPDATE MST_ADRS3 SET YUBIN = rec.YUBIN
     WHERE KEYKENCD = rec.KENCD
      AND KEYSIKUCD = rec.SIKUCD
      AND REPLACE(REPLACE(OAZAMEI,'大字',''),'字','') = WkOazaMei
      AND REPLACE(KOAZAMEI,'字','') = WkKoazaMei
      AND NVL(YUBIN,'000-0000') <> rec.YUBIN;
   END IF;
   IF SQL%ROWCOUNT > 0 then
    ICntUpdate := ICntUpdate + SQL%ROWCOUNT;
    DBMS_OUTPUT.PUT_LINE( '更新1: ' || rec.YUBIN || ' (' || rec.KENCD || rec.SIKUCD || ':' || WkOazaMei || REPLACE(WkKoazaMei,'?','% ') || ')' );
   ELSE
    HenFlg := FALSE;
    IF INSTR(WkOazaMei,'ケ') > 0 THEN
      WkOazaMei := REPLACE(WkOazaMei,'ケ','ヶ');
      HenFlg := TRUE;
    END IF;
    IF HenFlg = FALSE AND INSTR(WkOazaMei,'ヶ') > 0 THEN
      WkOazaMei := REPLACE(WkOazaMei,'ヶ','ケ');
      HenFlg := TRUE;
    END IF;
    IF HenFlg = FALSE AND INSTR(WkOazaMei,'塚') > 0 THEN
      WkOazaMei := REPLACE(WkOazaMei,'塚','');
      HenFlg := TRUE;
    END IF;
    IF HenFlg = FALSE AND INSTR(WkOazaMei,'') > 0 THEN
      WkOazaMei := REPLACE(WkOazaMei,'','塚');
      HenFlg := TRUE;
    END IF;
    IF HenFlg = TRUE THEN
      IF WkKoazaMei = '?' THEN
       UPDATE MST_ADRS3 SET YUBIN = rec.YUBIN
        WHERE KEYKENCD = rec.KENCD
         AND KEYSIKUCD = rec.SIKUCD
         AND REPLACE(REPLACE(OAZAMEI,'大字',''),'字','') = WkOazaMei
         AND NVL(YUBIN,'000-0000') <> rec.YUBIN;
      ELSE
       UPDATE MST_ADRS3 SET YUBIN = rec.YUBIN
        WHERE KEYKENCD = rec.KENCD
         AND KEYSIKUCD = rec.SIKUCD
         AND REPLACE(REPLACE(OAZAMEI,'大字',''),'字','') = WkOazaMei
         AND REPLACE(KOAZAMEI,'字','') = WkKoazaMei
         AND NVL(YUBIN,'000-0000') <> rec.YUBIN;
      END IF;
      IF SQL%ROWCOUNT > 0 then
       ICntUpdate := ICntUpdate + SQL%ROWCOUNT;
       DBMS_OUTPUT.PUT_LINE( '更新2: ' || rec.YUBIN || ' (' || rec.KENCD || rec.SIKUCD || ':' || WkOazaMei || REPLACE(WkKoazaMei,'?','% ') || ')' );
      END IF;
    ELSE
      ICntSkip  := ICntSkip + 1;
    END IF;
   END IF;
 END LOOP;
 DBMS_OUTPUT.PUT_LINE( '結果==============' );
 DBMS_OUTPUT.PUT_LINE( '検索件数:' || ICntSel );
 DBMS_OUTPUT.PUT_LINE( '更新件数:' || ICntUpdate );
 COMMIT;
EXCEPTION
 WHEN OTHERS THEN
   DBMS_OUTPUT.PUT_LINE( 'エラーが発生しました。:' || SQLERRM);
END;
/
SPOOL OFF
SET TERMOUT ON
SPOOL &EXECUTE_LOG APPEND
PROMPT ===========================================================
PROMPT ADRS3_郵便番号の更新が完了しました。
PROMPT ===========================================================
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') 終了 FROM DUAL;
SET HEADING ON
SET FEEDBACK 6
SET VERIFY ON
SPOOL OFF
EXIT
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「PL/SQL」カテゴリーもっと見る

最近の記事
バックナンバー
2024年
2023年
人気記事