ORACLE 10g R1 以下のバージョンの場合、DBMS_OUTPUT.PUT_LINEできるバイト数は255までになっている。
255バイトずつSUBSTRBすると、全角文字は途中で切れてしまう。
255文字ずつSUBSTRすると、全角文字を含んできた場合に255バイトを超えてしまう。
以下は全角文字を削らず、255バイト以下の最大文字数を出力する方法。
SET SERVEROUTPUT ON
SET LINESIZE 300
DECLARE
c$linefeed_code CONSTANT VARCHAR2(2) := CHR(10);
c$line_size CONSTANT NUMBER := 255;
t$end_of_line NUMBER;
t$position NUMBER;
t$sql_string VARCHAR2(32767); -- 定義可能な最大長
t$temp_string VARCHAR2(32767); -- 定義可能な最大長
t$output_string VARCHAR2(765);
BEGIN
/* 改行があり、桁数が255以上で全角を含む[[文字列]]を取得 */
SELECT
REPLACE(TO_CHAR(DBMS_METADATA.GET_DDL('TABLE', 'EMP')),
' ',
'あいうおえかきくけこさしすせそたちつてとなにぬねの')
INTO t$sql_string
FROM DUAL;
/* 最初のWHILEで改行コードごとに処理をする */
t$position := 1;
WHILE t$position <> 0 LOOP
t$position := INSTR(t$sql_string, c$linefeed_code);
IF t$position = 0 THEN
t$temp_string := t$sql_string;
ELSE
t$temp_string := SUBSTR(t$sql_string, 1, t$position-1);
t$sql_string := SUBSTR(t$sql_string, t$position+LENGTHB(c$linefeed_code));
END IF;
/* 次のWHILEは255バイト(未満)ごとに出力するループ */
WHILE t$temp_string IS NOT NULL LOOP
t$end_of_line := c$line_size;
t$output_string := SUBSTR(t$temp_string, 1, t$end_of_line);
/* 最後のWHILEで255バイトを超えない最大の文字数を取得する */
WHILE LENGTHB(t$output_string) > c$line_size LOOP
/* 255バイト未満になるまで1文字ずつ切り出し桁数を減らす */
t$end_of_line := t$end_of_line - 1;
t$output_string := SUBSTR(t$temp_string, 1, t$end_of_line);
END LOOP;
t$temp_string := SUBSTR(t$temp_string, t$end_of_line+1);
DBMS_OUTPUT.PUT_LINE(t$output_string);
END LOOP;
END LOOP;
END;
/
タブ文字を含まず、DBをSJISで作成してあると結構きれいに出力される。
最終更新:2011年04月08日 11:02