2012-11-22

오라클 PL/SQL에서 LONG타입 SELECT 하기.


DECLARE
   src      VARCHAR2 ( 32767 );
   len      INT;
   idx      INT;
BEGIN
   SELECT v.text, v.text_length
     INTO src, len
     FROM sys.user_views v
    WHERE 1 = 1
      AND v.view_name = UPPER ( 'V_gbyo' );

   idx := 1;
   FOR p IN 1 .. ( len / 250 ) LOOP
      DBMS_OUTPUT.put_line ( 'TEXT=' || SUBSTR ( src, idx, 250 ) );
      idx := idx + 250;
   END LOOP;
END;


substr함수에서 한번에 잘라서 사용하는 제약은 각 시스템의 운영 환경에 따라 다르다..^^

상기 예제는 dbms_output에서 라인당 최대 출력 가능한 버퍼 크기가 250으로 설정되어 있어서 저렇게 했다..ㅡㅡ; (물로 조정 가능하다..)

함수를 만들어 DML문장에 바로 사용하는것도 가능할까?


<오라클 9i>


아래는 뷰 소스를 조회하는 방법 ^^;


CREATE OR REPLACE FUNCTION f_viewsrc ( a_viewname VARCHAR2, a_pos INT )
   RETURN VARCHAR2 IS
   src      VARCHAR2 ( 32767 );
   len      INT;
   idx      INT;
BEGIN
   SELECT v.text, v.text_length
     INTO src, len
     FROM sys.user_views v
    WHERE 1 = 1
      AND v.view_name = UPPER ( a_viewname );

   RETURN SUBSTR ( src, a_pos, 4000 );
END;


SELECT *
  FROM ( SELECT f_viewsrc ( v.view_name, t.pos * 4000 + 1 ) AS src_text
           FROM sys.user_views v CROSS JOIN ( SELECT ROWNUM - 1 pos
                                                FROM all_objects
                                               WHERE ROWNUM <= 9 ) t
          WHERE 1 = 1
            AND v.view_name = 'V_GBYO' )
 WHERE src_text IS NOT NULL







32767byte를 초과하는 Long타입의 컬럼 내용을 select문에서 조회하려면...
다음과 같은 방식으로 함수를 작성해야 한다.


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_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;





댓글 없음:

댓글 쓰기

-------------------------------------------------------
스마트폰 기종 :
OS버젼 :
-------------------------------------------------------
문제점 및문의 :