FUNCTION 에서,
USER_VIEWS 테이블의 TEXT를 한 변수에 담으려합니다.
LONG으로 선언했는데,, (TEXT가 LONG입니다.)
확인해보니 32767보다크면 LONG으로 읽을수가 없군요,,
CLOB를 써보려했는데 잘되지않네요
USER_VIEWS의 컬럼 TEXT속성을 LOB로 바꿀수있나요?
그리고, 이런경우 다른 해답은 없는지요?
구글링하다가,
http://nilriri.blogspot.kr/2012/11/plsql-long-select.html
이곳을 찾았습니다.
이곳의 내용을 아래처럼 쓰려는데,, 이것도 아시는분 좀 도와주세요 ,,
CREATE OR REPLACE FUNCTION f_viewsrc (a_index INT, a_pos INT)
RETURN VARCHAR2
IS
-- v_sql VARCHAR2 (32767) := 'SELECT LONG컨텐츠컬럼 FROM 테이블명 WHERE PK컬럼 = :변수1 ';
v_sql VARCHAR2 (32767) := 'SELECT TEXT FROM USER_VIEW WHERE VIEW_NAME = :변수1 ';
v_csr BINARY_INTEGER;
v_piece VARCHAR2 (32767);
v_clob CLOB;
v_plen INTEGER := 32767;
v_tlen INTEGER := 0;
v_rows INTEGER;
BEGIN
v_csr := DBMS_SQL.open_cursor;
DBMS_SQL.parse (v_csr, v_sql, DBMS_SQL.native);
DBMS_SQL.bind_variable (v_csr, ':변수1', a_index);
DBMS_SQL.define_column_long (v_csr, 1);
v_rows := DBMS_SQL.execute_and_fetch (v_csr);
LOOP
DBMS_SQL.column_value_long (v_csr, 1, 32767, v_tlen, v_piece, v_plen);
-- 조회된 결과값을 CLOB컬럼에 담는다.
v_clob := v_clob || v_piece;
-- 다음 조회 시작 위치를 계산한다.
v_tlen := v_tlen + 32767;
EXIT WHEN v_plen < 32767;
END LOOP;
RETURN SUBSTR (v_clob, a_pos, 2000);
END;
|