꺄악~
동적 쿼리를 이용한 커서 선언 방법~
[문제]
[대상이 될 테이블명과 읽어올 필드가 프로시져의 시작부분에서 정해지지 않는다면, 과연 커서를 선언할 수 있을까?]
[방법]
이걸 해결하는 방법이 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
어떤 방법이 있을깡?
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;
오라클 세션에서 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초 갱신으로 자주 살펴보고 있돵~
PREV