忍者ブログ

≪ 前の記事

次の記事 ≫

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

comments

DBMS_OUTPUTで255文字以上の文字を表示する関数

DBMS_OUTPUT.PUT_LINE()は、255文字以上の文字列を表示させようとすると
 ORU-10028: line length overflow, limit of 255 chars per line
とエラーが発生して中身が見れません。

それでもデバッグで出力で見たい場合は、
下記を参考に分割して表示させちゃいましょう。

---------------------------------------------------------------------------------

set serveroutput on


DECLARE
 -- 関数パラメータ宣言
    P_DATE          DATE    DEFAULT SYSDATE;

 -- 変数宣言
    sSTRING         VARCHAR2(4000);

 PROCEDURE DISP( m VARCHAR2, d BOOLEAN DEFAULT FALSE )
 /*----------------------------------------------------------
 --
 -- 関数名: DISP
 -- 引数1 :   m  VARCHAR2    表示させたい文字列
 -- 引数2 :   d  BOOLEAN     デバッグ用出力フラグ
 --
 -- 概要  :   255文字以上の文字列をコンソールに表示する
 --           DBMS_OUTPUT.PUT_LINEで出力制限が255文字のため
 --           文字列を表示可能文字数に分割して全て表示する
 -- 例    :   表示したい26文字を1回7文字ずつ表示を例とする
 --           よって7文字を4回に分けて表示する。
 --           ABCDEFG HIJKLMN OPQRSTU VWXYZ
 --           1234567 1234567 1234567 12345
 --           1回目: ABCDEFG
 --           2回目: HIJKLMN
 --           3回目: OPQRSTU
 --           4回目: VWXYZ
 ----------------------------------------------------------*/
 IS
     sWK   VARCHAR2(255);  -- 分割文字列格納
     nLEN  NUMBER;         -- 表示したい文字数
     nMAX  NUMBER;         -- 分割する文字数
     nMOD  NUMBER;         -- 分割回数
     nST   NUMBER;         -- 表示したい文字の開始位置
     i     NUMBER;         -- FOR分用
 BEGIN
     --------------------------------------------------------
     -- 初期設定
     --------------------------------------------------------
     IF d THEN
     -- DEBUG出力
         DBMS_OUTPUT.PUT_LINE( '----------------------------------DEBUG.START' );
     END IF;
     nMAX := 250;
     nLEN := LENGTH(m);
     nMOD := TRUNC(nLEN / nMAX);
     IF nMAX * nMOD < nLEN THEN
         nMOD := nMOD + 1;
     END IF;
     IF d THEN
     -- DEBUG出力
         DBMS_OUTPUT.PUT_LINE( '--------- nLEN: ' || TO_CHAR(nLEN) );
         DBMS_OUTPUT.PUT_LINE( '--------- nMAX: ' || TO_CHAR(nMAX) );
         DBMS_OUTPUT.PUT_LINE( '--------- nMOD: ' || TO_CHAR(nMOD) );
     END IF;
     --------------------------------------------------------
     -- 表示した文字を表示
     -- 分割する文字数で区切って表示し
     -- 表示したい文字を全て表示する
     --------------------------------------------------------
     -- 分割回数分ループする
     FOR i IN 1..nMOD LOOP
         -- 表示したい文字の開始位置を取得
         nST := ( i - 1 ) * nMAX + 1;
         IF d THEN
             -- DEBUG出力
             DBMS_OUTPUT.PUT_LINE( '---------    i: ' || TO_CHAR(i)    );
             DBMS_OUTPUT.PUT_LINE( '---------  nST: ' || TO_CHAR(nST)  );
             DBMS_OUTPUT.PUT_LINE( '--------- nMAX: ' || TO_CHAR(nMAX) );
         END IF;
         -- 表示する文字を区切り表示する
         sWK := SUBSTR( m, nST, nMAX );
         DBMS_OUTPUT.PUT_LINE( sWK );
     END LOOP;
     IF d THEN
     -- DEBUG出力
         DBMS_OUTPUT.PUT_LINE( '----------------------------------DEBUG.END' );
     END IF;
 EXCEPTION
     WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE('PROC: DISP()  SQLCODE: ' || TO_CHAR(SQLCODE) );
         DBMS_OUTPUT.PUT_LINE('PROC: DISP()  SQLERRM: ' || SQLERRM(SQLCODE) );
 END;
   
BEGIN

 dbms_output.enable(10000000);
 sSTRING := 'qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm';
 DISP(sSTRING);

EXCEPTION
 WHEN OTHERS THEN
   dbms_output.put_line('SQLCODE: ' || SQLCODE);
   dbms_output.put_line('SQLERRM: ' || SQLERRM(SQLCODE) );
END;
 
----実行結果サンプル ----
qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfgh
jklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm

PL/SQLプロシージャが正常に完了しました。
 

PR

0 comments

Comment

Trackback