2017年05月24日

[PL/SQL] 大量のSQL構文の記述ミスを一気に点検したい。

それら SQL 自体を DB に取り込み、順次 読み込んでは実際に SQL を実行させ、エラーコード、エラーメッセージを取りまくりましょう。



[入力テーブル]
1. DML_ID
   VRCHAR2(16 byte)
   (例) 「SEL01」「SEL02」「UPD03」「DEL04」「INT05」

2. SQL_TEXT
   VRCHAR2(4000 byte)
   (例) 「SELECT AAA02 FROM BBB.CCC WHERE AAA01 = 100;」




[出力テーブル]
1. DML_IDX
   VRCHAR2(16 byte)
   (入力の「DML_ID」を設定する)

2. SYSDATEX
   VRCHAR2(19 byte)
   (システム日時を設定する)
   (例) 「2017/06/09 15:26:41」

3. SQLCODEX
   NUMBER
   (入力の「SQL_TEXT」を実行した結果を設定する)
   (例 : 正常の場合) 「0」
   (例 : エラーの場合) 「-1」「-913」「-942」「-1861」「-30005」

4. SQLERRMX
   VRCHAR2(2048 byte)
   (入力の「SQL_TEXT」を実行した結果を設定する)
   (例 : 正常の場合) 「ORA-0000: normal, successful completion」
   (例 : エラーの場合)
    「ORA-00001: 一意制約(スキーマ名.テーブル名)に反しています。」
    「ORA-00913: 値の個数が多すぎます。」
    「ORA-00942: 表またはビューが存在しません。」
    「ORA-01861: リテラルが書式文字列と一致しません」
    「ORA-30005: WAIT間隔が指定されていないか無効です。」




[PL/SQL の コード]

create or replace
PROCEDURE BBBZ AS
BEGIN
DECLARE
Cursor Cur000 IS
SELECT dml_id, SQL_TEXT FROM (スキーマ名).(入力テーブル名);

vCur000 Cur000 %ROWTYPE;

BEGIN
delete from (スキーマ名).(出力テーブル名);
for vCur000 in Cur000 LOOP
BEGIN
EXIT WHEN Cur000%NOTFOUND;
execute IMMIDIATE vCur000.SQL_TEXT;
dbms_output.put_line('DML-ID     :' || vCur000.dml_id);
dbms_output.put_line('日時      :' || to_char(sysdate, 'YYYY/mm/dd hh24:mi:ss'));
dbms_output.put_line('エラーコード  :' || sqlcode);
dbms_output.put_line('エラーメッセージ:' || sqlerrm);
insert into (スキーマ名).(出力テーブル名) values(
vCur000.dml_id,
to_char(sysdate, 'YYYY/mm/dd hh24:mi:ss'),
sqlcode,
sqlerrm);
exception
when others then
dbms_output.put_line('DML-ID     :' || vCur000.dml_id);
dbms_output.put_line('日時      :' || to_char(sysdate, 'YYYY/mm/dd hh24:mi:ss'));
dbms_output.put_line('エラーコード  :' || sqlcode);
dbms_output.put_line('エラーメッセージ:' || sqlerrm);
insert into (スキーマ名).(出力テーブル名) values(
vCur000.dml_id,
to_char(sysdate, 'YYYY/mm/dd hh24:mi:ss'),
sqlcode,
sqlerrm);
END;
END LOOP;
END;
END BBBZ;




[特記]
  環境によって、ココで実行エラーが起きるかもしれません。
   ↓ 
  「dbms_output.put_line('エラーメッセージ:' || sqlerrm);」
   ↑ 
  表示バイト数が大き過ぎるためです。デバッグ用ですので、なくて構いませんので、コメント化してください。



[どーでもよい追記]
  ついでに、オラクル社さんの 表記ゆれ まで発見してしもうた。
  これ。
   ↓ 
  「ORA-01861: リテラルが書式文字列と一致しません」
   ↑ 
  このエラーメッセージだけ、句点 (文末のマル) がないですねー。



[関連する日記たち]
 ↓ 
[テーマ「コンピュータ」のブログ記事一覧]
http://hinden.at.webry.info/theme/c80af9e721.html

[項目の中に改行のあるcsvデータをDBにロードしたい。]
http://hinden.at.webry.info/201705/article_27.html

プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義)
SBクリエイティブ
アシスト教育部

amazon.co.jpで買う
Amazonアソシエイト by プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義) の詳しい情報を見る / ウェブリブログ商品ポータル


hinden Takahashi, Hideki ひんでん 高橋 秀樹 | facebookひんでん (ユリコ暴走)(@Gemini_hinden)さん | Twitter


hinden Takahashi, Hideki / ひんでん 高橋 秀樹--------
about me
--------
hinden Takahashi, Hideki
ひんでん 高橋 秀樹
http://hinden.at.webry.info/200002/article_1.html

[events]
イベント情報一覧
http://www2u.biglobe.ne.jp/~hinden/live/
posted by hinden (まほまほファミリー) at 13:32| 東京 ☁| Comment(0) | TrackBack(0) | コンピュータ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/450185510
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック