ORA-20000: ORU-10027: Buffer Overflow, Limit Of 1000000 Bytes淺析

業(yè)務(wù)自動化任務(wù)報出:

DECLARE
*
ERROR at line 1:
ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 97
ORA-06512: at "SYS.DBMS_OUTPUT", line 112
ORA-06512: at line 157

一般情況下可以通過

exec dbms_output.enable(size)
size:2000 .. 1000000

最大輸出結(jié)果長度不能超過1000000。

根據(jù)文檔姑荷,從Oracle 10g開始盒延,支持無限輸出,可以采用如下設(shè)置:

exec dbms_output.enable(buffer_size=>null)

對于Oracle 10g之前的版本鼠冕,也可以通過一個小技巧來繞過最大1000000的限制添寺。
測試如下:
錯誤模擬,設(shè)置buffer_size=>20000:

SQL> 
SQL> set serveroutput on
SQL> DECLARE
  2     y1 varchar2(80);
  3     y2 number;
  4  BEGIN
  5     dbms_output.enable(buffer_size => 20000);
  6     --DBMS_OUTPUT.ENABLE (buffer_size => NULL);
  7     SELECT to_char(sysdate, 'hh-mi-ss')into y1 from dual;
  8  
  9     DBMS_OUTPUT.PUT_LINE(y1);
 10  
 11     y2 := 0;
 12     LOOP
 13        IF mod(y2,30) = 0 THEN
 14           --dbms_output.enable(20000);
 15           null;
 16       END IF;
 17  
 18        IF y2 > 100 THEN
 19           exit;
 20        END IF;
 21        y2 := y2 + 1;
 22       dbms_output.put_line(rpad(to_char(y2)||'-->',200,'s'));
 23     END LOOP;
 24  
 25     SELECT to_char(sysdate, 'hh-mi-ss') into y1 from dual;
 26  
 27     DBMS_OUTPUT.PUT_LINE(y1);
 28     --dbms_output.disable;
 29  
 30  END;
 31  /

11-13-56
1-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
2-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
3-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
...省略4-->~97-->行內(nèi)容...
98-->sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
99-->sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
DECLARE
   y1 varchar2(80);
   y2 number;
BEGIN
   dbms_output.enable(buffer_size => 20000);
   --DBMS_OUTPUT.ENABLE (buffer_size => NULL);
   SELECT to_char(sysdate, 'hh-mi-ss')into y1 from dual;

   DBMS_OUTPUT.PUT_LINE(y1);

   y2 := 0;
   LOOP
      IF mod(y2,30) = 0 THEN
          --dbms_output.enable(20000);
          null;
      END IF;

      IF y2 > 100 THEN
         exit;
      END IF;
      y2 := y2 + 1;
      dbms_output.put_line(rpad(to_char(y2)||'-->',200,'s'));
   END LOOP;

   SELECT to_char(sysdate, 'hh-mi-ss') into y1 from dual;

   DBMS_OUTPUT.PUT_LINE(y1);
   --dbms_output.disable;

END;

ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 97
ORA-06512: at "SYS.DBMS_OUTPUT", line 112
ORA-06512: at line 22

解決方法1:設(shè)置buffer_size=>null

SQL> set serveroutput on
SQL> DECLARE
  2     y1 varchar2(80);
  3     y2 number;
  4  BEGIN
  5     --dbms_output.enable(buffer_size => 20000);
  6     DBMS_OUTPUT.ENABLE (buffer_size => NULL);
  7     SELECT to_char(sysdate, 'hh-mi-ss')into y1 from dual;
  8  
  9     DBMS_OUTPUT.PUT_LINE(y1);
 10  
 11     y2 := 0;
 12     LOOP
 13        IF mod(y2,30) = 0 THEN
 14           --dbms_output.enable(20000);
 15           null;
 16       END IF;
 17  
 18        IF y2 > 100 THEN
 19           exit;
 20        END IF;
 21        y2 := y2 + 1;
 22       dbms_output.put_line(rpad(to_char(y2)||'-->',200,'s'));
 23     END LOOP;
 24  
 25     SELECT to_char(sysdate, 'hh-mi-ss') into y1 from dual;
 26  
 27     DBMS_OUTPUT.PUT_LINE(y1);
 28     --dbms_output.disable;
 29  
 30  END;
 31  /

11-13-01
1-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
2-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
3-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
...省略4-->~97-->行內(nèi)容...
98-->sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
99-->sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
100-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
101-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
11-13-01

PL/SQL procedure successfully completed

解決方法2:小技巧

SQL> set serveroutput on
SQL> DECLARE
  2     y1 varchar2(80);
  3     y2 number;
  4  BEGIN
  5     dbms_output.enable(buffer_size => 20000);
  6     --DBMS_OUTPUT.ENABLE (buffer_size => NULL);
  7     SELECT to_char(sysdate, 'hh-mi-ss')into y1 from dual;
  8  
  9     DBMS_OUTPUT.PUT_LINE(y1);
 10  
 11     y2 := 0;
 12     LOOP
 13        IF mod(y2,30) = 0 THEN
 14           dbms_output.enable(20000);
 15           null;
 16       END IF;
 17  
 18        IF y2 > 100 THEN
 19           exit;
 20        END IF;
 21        y2 := y2 + 1;
 22       dbms_output.put_line(rpad(to_char(y2)||'-->',200,'s'));
 23     END LOOP;
 24  
 25     SELECT to_char(sysdate, 'hh-mi-ss') into y1 from dual;
 26  
 27     DBMS_OUTPUT.PUT_LINE(y1);
 28     --dbms_output.disable;
 29  
 30  END;
 31  /

11-35-45
1-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
2-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
3-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
...省略4-->~97-->行內(nèi)容...
98-->sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
99-->sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
100-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
101-->ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
11-35-45

PL/SQL procedure successfully completed

方法2的小技巧為什么也能實現(xiàn)正常輸出懈费,基于dbms_output.enable中會對一些變量做初始化计露,通過跟蹤dbms_output包內(nèi)部實現(xiàn)可窺探一二:

--dbms_output.enable
    IF BUFFER_SIZE < 2000 THEN
      BUF_SIZE := 2000;
    ELSIF BUFFER_SIZE > 1000000 THEN
      BUF_SIZE := 1000000;
    ELSIF BUFFER_SIZE IS NULL THEN
      BUF_SIZE := -1;   
    ELSE
      BUF_SIZE := BUFFER_SIZE;
    END IF;
    BUFLEFT := BUF_SIZE;
  
--dbms_output.put_line
      STRLEN := NVL(LENGTHB(A), 0);
      IF ((STRLEN + LINEBUFLEN) > 32767) THEN
        LINEBUFLEN := 0; BUF(PUTIDX) := '';
        RAISE_APPLICATION_ERROR(-20000, 'ORU-10028: line length overflow, ' ||
          'limit of 32767 bytes per line');
      END IF;

      IF (BUF_SIZE <> -1) THEN   
        IF (STRLEN > BUFLEFT) THEN
            RAISE_APPLICATION_ERROR(-20000, 'ORU-10027: buffer overflow, ' ||
              'limit of ' || TO_CHAR(BUF_SIZE) || ' bytes');
        END IF;
        BUFLEFT := BUFLEFT - STRLEN;
      END IF;

在解決方法2中,在代碼LOOP中根據(jù)一定條數(shù)設(shè)置dbms_output.enable(20000)憎乙,可以讓BUFLEFT滿足輸出要求票罐,避免觸發(fā)ORU-10027錯誤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泞边,一起剝皮案震驚了整個濱河市该押,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阵谚,老刑警劉巖蚕礼,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梢什,居然都是意外死亡奠蹬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門绳矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罩润,“玉大人,你說我怎么就攤上這事翼馆「钜裕” “怎么了金度?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長严沥。 經(jīng)常有香客問我猜极,道長,這世上最難降的妖魔是什么消玄? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任跟伏,我火速辦了婚禮,結(jié)果婚禮上翩瓜,老公的妹妹穿的比我還像新娘受扳。我一直安慰自己,他們只是感情好兔跌,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布勘高。 她就那樣靜靜地躺著,像睡著了一般坟桅。 火紅的嫁衣襯著肌膚如雪华望。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天仅乓,我揣著相機與錄音赖舟,去河邊找鬼。 笑死夸楣,一個胖子當(dāng)著我的面吹牛宾抓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裕偿,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼洞慎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘿棘?” 一聲冷哼從身側(cè)響起劲腿,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸟妙,沒想到半個月后焦人,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡重父,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年花椭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房午。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡矿辽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袋倔,我是刑警寧澤雕蔽,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站宾娜,受9級特大地震影響批狐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜前塔,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一嚣艇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧华弓,春花似錦食零、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凑保,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涌攻,已是汗流浹背欧引。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恳谎,地道東北人芝此。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像因痛,于是被迫代替她去往敵國和親婚苹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容