[PR]
Posted on Thursday, Apr 24, 2025 18:58
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
DBMS_OUTPUTで255文字以上の文字を表示する関数
Posted on Thursday, May 20, 2010 17:29
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プロシージャが正常に完了しました。
Comment