ORU-10027: buffer overflow, limit of 20000 bytes 오류가 발생하였습니다. 오라클 예외는 보통 ORA, TNS, PLS와 같은 접두사로 시작하는 경우가 많은데, 버퍼 오버플로우 같은 경우에는 ORU-10027 이라는 코드와 함께 발생하는 특성이 있습니다.
해당 오류가 발생하는 예제와, 스택을 다음과 같이 안내해드리겠습니다. (예제 코드와 발생하는 오류 안내입니다.)
ORU-10027: buffer overflow, limit of 20000 bytes 예제 코드
SET SERVEROUTPUT ON;
BEGIN
FOR i IN 1 .. 4000
LOOP
DBMS_OUTPUT.PUT_LINE ('i : ' || i);
END LOOP;
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 4
이 오류는 프로시저 내에서 출력 패키지(SYS.DBMS_OUTPUT)를 다룰 때 발생하는 경우가 많습니다. 그리고 'buffer overflow, limit of 20000 bytes' 에서 말하는 바와 같이 오라클이 출력 버퍼에 한도를 초과하는 메모리를 사용하였을 때 발생할 것입니다.
ORU-10027 해결 방법 예시
문제를 해결하는 방법으로 2가지를 안내해드리겠습니다.
DBMS_OUTPUT.PUT_LINE 삭제 해결 방법
첫 번째 방법은 프로시저 내에서 DBMS_OUTPUT.PUT_LINE 명령문을 삭제하는 방법입니다. 출력 패키지를 사용하는 것이 필수가 아닌 경우라면 주석처리 등으로 쉽게 처리할 수 있는 방법이랍니다.
다음과 같이 주석처리 또는 해당하는 줄을 제거하여 해결하는 방법이 있습니다. 예외스택에서도 여러번 언급하였던, 문제가 일어날 가능성이 가장 높은 부분, [ ORA-06512: at "SYS.DBMS_OUTPUT" ] 패키지 부분을 정리하여 처리하는 것이지요.
하지만 출력 부분이 없어지기에 개발 중에 유용하게 사용할 수 있는 디버깅 정보가 손실될 수 있다는 아쉬운 점이 있습니다.
SET SERVEROUTPUT ON;
BEGIN
FOR i IN 1 .. 4000
LOOP
--DBMS_OUTPUT.PUT_LINE ('i : ' || i);
NULL;
END LOOP;
END;
/
버퍼 크기 변경하여 해결 방법
두 번째 방법은 출력 패키지의 버퍼 크기를 변경하는 방법입니다. ORU-10027 오류 메시지에서도 'limit of 20000 bytes'라고 안내를 하는데, 기본 버퍼 크기인 2만 바이트를 초과하였다는 것이지요? 이를 확장하여 처리하는 방법도 있답니다. 메모리 크기를 100만으로 늘리는 예제 명령어 코드는 다음과 같습니다. 필요에 따라 크기를 고려하면 될 것입니다.
EXEC DBMS_OUTPUT.ENABLE('1000000');
- 최대 줄 크기는 32767바이트입니다.
- 기본 버퍼 크기는 20000바이트입니다. 최소 크기는 2000바이트이고 최대 크기는 무제한입니다.
이러한 변경을 적용한 후에는, 버퍼 오버플로우로 인한 ORU-10027 오류 없이 펑션 및 프로시저를 실행할 수 있을 것입니다. 다만 이러한 처리를 진행한 후에는 코드를 충분히 확인하여 문제가 없이 올바르게 작동하는지 추가적으로 점검해 주십시오. 😘