음머어's 까망별

블로그 이미지
무지 인간의 첫 걸음..
by 까망별 음머어
  • 10,233Total hit
  • 9Today hit
  • 28Yesterday hit


꺄악~
동적 쿼리를 이용한 커서 선언 방법~

[문제]
[대상이 될 테이블명과 읽어올 필드가 프로시져의 시작부분에서 정해지지 않는다면, 과연 커서를 선언할 수 있을까?]

[방법]
이걸 해결하는 방법이 REF CURSOR를 이용한 커서 참조형 만들기랄까.....

DECLARE

     v_tabname  NUMBER;                -- 대상이될 테이블
     v_fldname VARCHAR2(100);        -- 대상에서 읽을 필드명
     v_val        VARCHAR2(100);        -- 읽은 값을 저장할 변수

    TYPE type_cur is REF CURSOR;  -- 리퍼런스 커서 타입 선언
    cur_test    type_cur;                    -- 커서타입으로 커서 선언

OPEN
   SELECT tabname, fldname
   INTO v_tabname, v_fldname   -- id 가 2871인 로우에서 테이블명과 대상 필드를 읽어온다
   FROM tw_test
   WHERE id = 2871;

  OPEN cur_test FOR 'SELECT '||v_fldname ||' FROM '||v_tabname;       
   --  읽어온 값들을 가지고 동적 쿼리를 완성한다.

  LOOP
    FETCH  cur_test INTO v_val;

        INSERT INTO tw_test2(val) VALUES(v_val);        -- 하고 싶은 일을 한다.
        COMMIT;

    EXIT WHEN cur_test%NOTFOUND;
  END LOOP;
  CLOSE cur_test;
END;

흐흐.. 햇갈리죵 -0-?
레퍼런스는 : http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg09dyn.htm

저작자 표시 비영리
TRACKBACK 0 AND COMMENT 1
현재 테이블은 드랍해야겠고, 인덱스는 그대로 생성해야겠는데,
어떤 방법이 있을깡?

1. CREATE TABLE test.testtbl  LIKE test.testtbl;
-> 이 방법은 동일한 구조의 테이블을 만들어 준다.
    
2. 기존 인덱스 생성쿼리만 뽑아오기
-> 이게 왜 필요하냐면, 프로그램에 의해 테이블의 드랍/생성이 발생할 경우
    인덱스를 그대로 가져오려면 하드코딩할 수 밖에 없는데,
    그럴 경우 인덱스를 별도로 생성하는 작업을 수행하기 위해 필요하다.
    뭐...... 좀더 심도있는 이유는... 귀찮아서? -_-;;

SELECT CONCAT_WS('', 'alter table ',
      table_name,
      IF( index_name ='PRIMARY',
       ' add primary key',
       IF( non_unique =1, 
        CONCAT_WS('',' add index ', index_name ),
        CONCAT_WS('',' add unique index ', index_name )
       )
       ),
      '(',
      GROUP_CONCAT(column_name ORDER BY seq_in_index SEPARATOR ','),
      ');' ) AS idxqry
FROM information_schema.statistics
WHERE table_schema = 'test' -- table_name = 'testtbl'
GROUP BY table_name, index_name;
저작자 표시 비영리
TRACKBACK 0 AND COMMENT 0

오라클 세션에서 Lock을 확인하고, 그것을 죽이고자 할때 아래와 같이 사용하면 땡큐다.
물론, 중간에 죽는 넘들에 대한 안정성은 보장하지 못하지만.......

그래도 죽일넘은 죽여야 않겄어?

-- 락 걸린 쿼리 확인 및 sid, serial# 를 추출하기 위한 쿼리
select b.osuser, b.sid, b.serial#, c.sql_text, a.*
from  V$lock a, v$session b, v$sql c
where a.sid = b.sid
      and b.sql_id = c.sql_id;

-- 위의 결과에 나오는 sid, serial# 를 가지고 아래 쿼리를 수행하면....
-- 그토록 죽이고 싶던 넘을 잔인하게 죽일 수 있다. -0-/

alter system kill session 'sid, seraial#';


참고로, 시스템 운영함에 있어 v$lock, v$session, v$sql 과 같은 뷰는 상당히 유용하므로,
필요할 때 마다 한번씩 조인해보고 살펴보는 센스를 발휘한다면,
이역시 땡큐라눙~

난,.. 그래서 sql developer 에 저 같은 쿼리들을 , 사용자 정의 보고서에 등록해 놓고 5초 갱신으로 자주 살펴보고 있돵~
저작자 표시 비영리
TRACKBACK 0 AND COMMENT 0

ARTICLE CATEGORY

모든 이야기 (67)
독백 (20)
MySQL (24)
Oracle (5)
영화 (6)
Linux (3)
DW(Data Wareho.. (0)
(7)
음악 (1)

ARCHIVE