LONG 타입의 일부를 원격으로 끌어 오기 0 7 14,018

by 호야 [PL/SQL] LONG DBLINK [2010.07.26 15:49:01]


안녕하세요.. 그간 평안 하셨사옵니까?..
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으로 빼오면 안된답니당~

by 마농 [2010.07.26 16:13:11]
COPY 명령어를 이용해서 테이블을 복사하는 방법
http://www.gurubee.net/lecture/1404

by 호야 [2010.07.26 16:21:07]
COPY 한 후
LONG TYPE -> VARCHAR2 타입으로 변환은 어떻게 해야 될까요?ㅠㅠ

by 현 [2010.07.26 17:15:15]
호야님...
원격으로 long를 셀렉트 하지 마시고,
로컬에서 long 형을 select 한 후 VARCHAR2로 밀어 넣는 방식으로 하면 어떻게 되나요?

즉, db link를 걸은 시스템을 바꿔 보시는 것은....

by 호야 [2010.07.26 20:55:50]
SELECT LONG형컬럼 FROM 테이블
-> 정상 출력

SELECT SUBSTR(LONG형컬럼,1,1000) FROM 테이블
-> ORA-00932 ERROR : 일관성 에러

SELECT SUBSTR(TO_LOB(LONG형컬럼),1,1000) FROM 테이블
-> 또다시 ORA-00932

CREATE TABLE TMP_테이블 AS
SELECT SUBSTR(TO_LOB(LONG형컬럼),1,1000) FROM 테이블
-> 또 또 다시 ORA-00932

CREATE TABLE TMP_테이블 AS
SELECT TO_LOB(data_default) T
FROM 테이블;
-> CLOB타입으로 컬럼이 만들어 지고 테이블 생성

INSERT INTO TMP_테이블
SELECT LOB(data_default) T
FROM 테이블;
-> 정상 인서트

정상 인서트 된 것을 SUBSTR하면 정상 출력...

한방에는 안되나 봅니다...ㅠㅠ

이건 LOCAL 테스트입니다.

by 현 [2010.07.26 21:05:43]
왜 저는 무슨 말인지 이해를 못할까요?
이해력이 떨어지는건가요?

누구 이해하신 분 게시면 대신 좀 알려주실래요?

by 마농 [2010.07.27 08:06:49]
long 을 varchar2로 변환하고 싶다는 말이죠.
그런데 한방에 되는 방법이 없다는 말인거죠.
1. pl/sql을 통한 건건 입력
2. crob으로 생성후 varchar2로 변환
요렇게 돌아가는 방법 외에 직접 가는 방법을 찾는건데...방법이 없는듯...

by 소금나무 [2021.03.14 12:52:10]

-- 함수

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 에러가 나는데 방법 있을까요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입