현상
tbexport로 추출한 object ddl script에서 wrapped 된 package ddl이 unwapped 되어 추출 되지 않고 skip 처리되는 문제 현상에 대해 설명합니다.
아래와 같은 package DDL 미추출 현상이 발생합니다.
$ tbexport username=sys password=tibero sid=tibero port=8629 file=export.dat log=export_ddl.log script=y rows=n full=y
the entire database: Fri May 09 15:40:46 KST 2025
Export character set: UTF-8
Export national character set: UTF-16
exporting tablespaces
exporting roles
exporting directories
exporting sys privileges
exporting public synonyms
Packing the file...
Export completed successfully : Fri May 09 15:40:48 KST 2025
$ cat export_ddl.log
...
BEGIN
-- skipping wrapped PSM object : "TIBERO".WRAPPED_PACKAGE
null;
END;
...
SQL
복사
원인
•
Tibero 5 버전에서는 sys.tool_utility.get_unwrapped_src(object_id) 함수를 통해 wrapped된 package DDL을 unwrapped할 수 있습니다.
그러나 해당 함수의 반환값이 최대 4000 BYTE(varchar2)로 제한되어 있어, unwrapped된 DDL이 4000 byte를 초과하는 경우에는 unwrapped에 실패하게 됩니다.
이로 인해 tbexport 실행 시 해당 DDL은 skip으로 표기되며, unwrapped된 package DDL을 확인할 수 없습니다.
•
즉, Tibero 5에서는 tbexport를 통해 wrapped package의 DDL이 unwrapped되어 추출되어야 하나, unwrapped 과정에서 반환 길이 제한으로 인해 오류가 발생하고, 이로 인해 unwrapped 된 package ddl을 확인 하지 못하는 문제가 발생합니다.
해결
tool_utility.get_unwrapped_src 수행 시 반환값의 크기 제한으로 인해 발생하는 문제를 해결하기 위해, 적당한 크기의 변수에 담아 출력될 수 있도록 우회하여 unwapped 된 ddl을 직접 추출 진행하여 해결합니다.
SQL> set serveroutput on;
SQL> declare a varchar2(32767);
begin a := tool_utility.get_unwrapped_src(skip 된 object id);
dbms_output.put_line(a);
end;
/
CREATE OR REPLACE PACKAGE BODY WRAPPED_PACKAGE WRAPPING
AS
PROCEDURE w(p_text IN VARCHAR2
)IS
v_file UTL_FILE.FILE_TYPE;
BEGIN
v_file := UTL_FILE.FOPEN('DB_LOG','DBLOG_'||TO_CHAR(SYSDATE,'YYYYMMDD')||'.log','A',32767);
UTL_FILE.PUT_LINE(v_file, TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS')|| ' I: '|| p_text);
UTL_FILE.FCLOSE(v_file);
END;
PROCEDURE d(p_text IN VARCHAR2
)IS
...추출 성공
SQL
복사