• ベストアンサー

PL/SQL ORA-06502エラーに関して(動的SQL)

こんにちは、いつもお世話になっております。 現在、会社で動的SQLを使用してとある開発をおこなっているのですが、 どうしても上手くいかないので、どなたか教えて下さいm(__)m 下記の動的SQL文で最後から2行目のSQL:DBMS_OUTPUT.PUT_LINE(varDel); を実行するとORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。のエラーが 発生します、過去ログやgoogleで検索をかけてみたのですが、 どうにも解決方法がわからず困っています・・・・ お知恵のある方、教えて下さいませm(__)m ※多分、sql文が長いせいだとは思うのですが、どうしても これ以上は短くできず、静的ではなく、動的で動かさなければならない という条件付きなんですが、宜しく御願いします。 DECLARE numkeepD NUMBER := 0; -- データ保管期間格納用 varAST VARCHAR2(4) := '**'; -- アクセス区分定義外格納用 varkeepD VARCHAR2(2000); -- KEEP_DAYS取得SQL文格納用 varDel VARCHAR2(2000); -- DELETE文格納用 BEGIN varkeepD := 'SELECT KEEP_DAYS FROM SMCI4T910 WHERE ACC_KBN = '''||varAST||''''; DBMS_OUTPUT.PUT_LINE(varkeepD); EXECUTE IMMEDIATE (varkeepD) INTO numkeepD; DBMS_OUTPUT.PUT_LINE(numkeepD); -- アクセスログデータ削除SQL文格納 varDel := 'DELETE FROM '||cTABLE_STCI1T910||' ST910 ' ||'WHERE ' ||'ST910.DELETE_FLG = SCIS_CTS.cDEL_NO AND ' ||'EXISTS(' ||'SELECT 1 ' ||'FROM SMCI4T910 SM910 ' ||'WHERE ' ||'ST910.ACC_KBN = SM910.ACC_KBN AND ' ||'ST910.ACC_CYMD < TO_CHAR(SYSDATE - SM910.KEEP_DAYS,''YYYYMMDD'') AND ' ||'ST910.ACC_KBN <> varAST AND ' ||'SM910.DELETE_FLG = SCIS_CTS.cDEL_NO)'; DBMS_OUTPUT.PUT_LINE(varDel); --EXECUTE IMMEDIATE (varDel) END;

質問者が選んだベストアンサー

  • ベストアンサー
  • neko_jiji
  • ベストアンサー率53% (21/39)
回答No.2

ごめんなさい、"SUBSTRB"の方がいいですね。 文字数ではなくバイトで切り出しです。

nozda
質問者

お礼

すみません、お蔭様で無事に解決できましたm(__)m本当に、ありがとうございます。また、返信が遅れて申し訳ありませんでした・・・・・

その他の回答 (2)

回答No.3

DBMS_OUTPUTでエラーになるような気がしないんですが・・ DBMS_OUTPUTの部分をコメントにすると、エラーが無くなるんですかね? ちなみに、組み立てている動的SQL文が間違っているので、もう一度確認された方が良いですよ。 動的SQLをEXECUTEしたところでエラーになるはずです。

nozda
質問者

お礼

返信と御指摘ありがとうございますm(__)m、確かにSQL文が間違っていました・・・・ちなみになんですが、私が調べた範囲内ではDBMS_OUTPUTを使用する際に255バイト(?文字?と言った方がいいのでしょうか)以上の際にエラーが出ました・・・間違っていたらすみません・・ 完成したものは下記のような感じになりました。 varDel := 'DELETE FROM '||cTABLE_STCI1T910||' ST910 ' ||'WHERE ' ||'EXISTS(' ||'SELECT 1 ' ||'FROM '||cTABLE_SMCI4T910||' SM910 ' ||'WHERE ' ||'SM910.KEEP_DAYS > 0 AND ' ||'ST910.ACC_KBN = SM910.ACC_KBN AND ' ||'ST910.ACC_CYMD < TO_CHAR(SYSDATE - SM910.KEEP_DAYS,''YYYYMMDD'') AND ' ||'ST910.ACC_KBN <> '''||varAst||''' AND ' ||'SM910.DELETE_FLG = '''||SCIS_CTS.cDEL_NO||''')'; ※御回答いただいた方、本当にありがとうございました。

  • neko_jiji
  • ベストアンサー率53% (21/39)
回答No.1

SUBSTRを使って、2~3回に分けてOUTPUTしてみてはどうでしょう。