忍者ブログ

[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

ORACLEのSTORED FUNCTIONを作成しSQLPLUS上で単体実行をする場合

ORACLEのSTORED FUNCTIONを作成しSQLPLUS上で単体実行をする場合は
下記を参考にしてください。

-------------------------------------
-- 関数名: FUNC_SAMPLE
-- 引数:  なし
-- 戻り値:  NUMBER
-------------------------------------

set serveroutput on

declare
     a number;
begin
     dbms_output.enable(1000000);
     a := FUNC_SAMPLE();
     dbms_output.put_line('RET: ' || TO_CHAR(a) );
     dbms_output.put_line('正常に実行しました。');
exception
     when others then
           dbms_output.put_line(SQLERRM(SQLCODE) || ' : ' ||SQLCODE);
end;

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



KEYWORD :  ORACLE STORED FUNCTION SP Oracle Stored Function

0 comments

サンプル: 文字列を1文字ずつ抽出し表示する

------------------------------------------------------------------
■ SOURCE
------------------------------------------------------------------
set serveroutput on

DECLARE
    vOrgChar varchar2(50);
    nIndex   number(10);
    vCurChar varchar2(10);
BEGIN
    vOrgChar:= 'aiueoかきくけこ';
    FOR nIndex IN 1..length(vOrgChar) LOOP
        vCurChar:=substr(vOrgChar, nIndex, 1);
        dbms_output.put_line(vCurChar);
    END LOOP;
END;

------------------------------------------------------------------
■ 実行結果
------------------------------------------------------------------
a
i
u
e
o






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

SQL>
------------------------------------------------------------------
■ 関数
------------------------------------------------------------------
 FOR
 SUBSTR
 LENGTH
 DBMS_OUTPUT.PUT_LINE

0 comments