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
最新の画像もっと見る
最近の「PL/SQL」カテゴリーもっと見る
最近の記事
カテゴリー
- Node.js(14)
- VBScript(2)
- Weblog(314)
- お仕事ツール(0)
- Saloon(1099)
- HTA(32)
- 決め・分け論(55)
- 映画・ドラマ(37)
- EXCEL VBA(35)
- PL/SQL(10)
- Java(11)
- 詩(自作)(5)
- 詩(塚原将)(298)
- 短歌(200)
- 題詠100首鑑賞(96)
- 題詠100首(109)
- ALIAS SMITH and JONES エピソード(1)
- 題詠100首2010(11)
- 読書(73)
- プロスポーツ(プロ野球、格闘技)(27)
- 日常・育児とか(88)
- 仕事(IT関係)(61)
- とほほ(33)
- 夢(32)
- 勝手にバトン(7)
- 写真(36)
- スタートレック視聴日誌草稿(24)
- 旅行(25)
- 嫌いな言葉(6)
- 好きな言葉(4)
バックナンバー
人気記事