255桁以下になるようにDBMS_OUTPUTする

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。