안녕하세요.. 그간 평안 하셨사옵니까?..
LONG TYPE 관련 하여 원격으로 컨트롤을 하기 위해 고찰 중입니다.
질문의 요지는 하나 입니다.
---- 전제 요건----
DBA_TAB_COLUMNS 의 DATA_DEFAULT는 LONG 타입으로 되어 있습니다.
---- 처리내용 ----
1. LOCAL에 TAB_COL 테이블을 만들고, T_D VARCHAR2(4000)으로 컬럼을 지정합니다.
2. 원격 DB LINK을 HOYA로 만듭니다.
3. INSERT INTO TAB_COL(T_D)
SELECT DATA_DEFAULT
FROM USER_TAB_COLUMNS@HOYA
이런씩으로 DB링크를 이용하여, TAB_COL 테이블에 넣는 작업입니다.
---- 질문 ----
PL/SQL 및 프로그램을 쓰지 않고 INSERT INTO 문으로 4000자 씩 끊어서 DEFAULT의 내용을
가지고 올 수 있을까요?
PL/SQL을 사용한 해결 방안
CURSOR TS_LIST
IS
SELECT DATA_DEFAULT
FROM USER_TAB_COLUMNS@HOYA
WHERE OWNER = '스키마'
..
..
..
FOR TS_NM IN TS_LIST LOOP
INSERT INTO TAB_COL(T_D)
VALUES(TS_NM.TO_CHAR(SUBSTR(TS_NM.DATA_DEFAULT,1,4000)));
END LOOP;
COMMIT;
이렇듯 오라클이 힘들게 만들어 놨습니다.
좋은 방안이 있으시면 가르침을 주시옵소서...ㅠㅠ
PS . LONG 타입으로 가지고 오지 않고 VARCHAR2로 가지고 오는 것은
DB와 DB의 비교가 아니가 DB와 시스템의 비교 때문에 VARCHAR2로
가지고 오는 겁니다... LONG으로 빼오면 안된답니당~
-- 함수
create or replace FUNCTION F_CONVERT_LONG ( IN_TB IN VARCHAR2 , IN_COL IN VARCHAR2 ) RETURN VARCHAR2 IS V_LONG LONG := NULL; V_RESULT VARCHAR2(32767) := NULL; V_CNT NUMBER(4,0) := 0; V_STEP NUMBER(4,0) := 100; V_LIMIT NUMBER(4,0) := 4000; BEGIN SELECT DATA_DEFAULT INTO V_LONG FROM USER_TAB_COLUMNS where table_name = in_tb and column_name = in_col; V_RESULT := SUBSTR(V_LONG,V_LIMIT,1); WHILE LENGTHB(V_RESULT) > V_LIMIT LOOP V_CNT := V_CNT + 1; V_RESULT := SUBSTR(V_RESULT,1,LENGTH(V_RESULT)-(V_STEP*V_CNT)); END LOOP; V_RESULT := DBMS_LOB.SUBSTR(V_LONG,V_LIMIT-(V_STEP*(V_CNT-1)),1); WHILE LENGTHB(V_RESULT) > V_LIMIT LOOP V_RESULT := SUBSTR(V_RESULT,1,LENGTH(V_RESULT)-1); END LOOP; RETURN V_RESULT; END F_CONVERT_LONG;
-- select
select table_name , column_name , f_convert_long(table_name, column_name) as data_default from user_tab_columns;
함수 내에 data_default 조회 쿼리를 db link로 변경하여 사용 가능합니다.
select 시 바로 변환되게 하는건 못 찾아서 함수를 만들었어요.
함수의 IN 변수에 LONG을 바로 넣으면 ora-00997 에러가 나는데 방법 있을까요?