음머어's 까망별

블로그 이미지
무지 인간의 첫 걸음..
by 까망별 음머어
  • 303,486Total hit
  • 137Today hit
  • 147Yesterday hit

'Oracle'에 해당되는 글 7건

  1. 2014.01.03
    [oracle] impdb 복원
  2. 2013.05.02
    [Oracle] 공간 인덱스 생성시 꼭 필요한것
  3. 2009.11.18
    [Oracle] 동적 쿼리를 이용한 커서 선언방법 (2)
  4. 2009.09.14
    [Oracle] 세션 죽이기~
  5. 2008.11.17
    [Oracle] MySQL의 Limit처럼 사용해보자.
  6. 2008.07.10
    [Oracle] DECODE 너는 누구냐!!
  7. 2008.07.04
    [Oracle] Updatable Join View

[oracle] impdb 복원


impdb 사용자/암호 directory=백업이 되어있는 현재 디렉토리(절대 주소 말고) dumpfile=덤프 파일명(파티션 된 경우 , 구분자로 전체를 적어줌) tables=복원할 테이블명 table_exists_action=테이블이 이미 존재할 경우의 옵션 (skip/drop/truncate/append);

저작자 표시 비영리
신고
TRACKBACK 3 AND COMMENT 0

user_sdo_geom_metadata 에 공간 인덱스를 생성하는 테이블명과, 해당 컬럼명이 들어가야 한다.


저작자 표시 비영리
신고
TRACKBACK 0 AND COMMENT 0


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

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

[방법]
이걸 해결하는 방법이 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 2

오라클 세션에서 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

내가 지식이 얕은 건지, 어떻게든 돌아가게는 만든다는 주먹구구식 마인드 때문인지,
Oracle DB에 입력되어 있는 순차적인 데이터의 선택적 추출은
이 방법밖에 알지 못한다..

자, 이제 그 방법에 대해 알아보자.

먼저 MySQL 에서는
# [MySQL]
SELECT a.love_id
FROM love a
LIMIT 1000, 2000;


하면, 실제 입력된 데이터의 순서에 맞추어 1000번 부터 2000번까지의 데이터가 나온다.

하지만.... 망할 ORACLE 에는 없다는 거....

어떤 분들은 'rownum으로  WHERE rownum BETWEEN 1000 AND 2000 하면 되지 않느냐??'
라고 하는데..... 잘 찾아보면, rownum 은 결과 값에 매겨지는 상대적인 값이므로,
절대적인 신뢰감이 없고, 위의 수식도 먹지 않는다.....
뭐.. 안 믿으시면 한 번 해보시라.. --;;

그럼.. 어떻게 해야할까?
우리의 친구 꼼수를 한 번 발동 시켜볼까?

* 해법 *
************************************************************************************************
# [Oracle]
1. 아래 쿼리는, 데이터가 실제적으로 들어간 순서에 맞게 rownum을 부여 하여,
그 값을 하나의 컬럼으로 출력될 수 있게 해준다.
SELECT a.rownum as rnum, a.love_id
FROM love a;

2. 1에서 만들어진 쿼리를 아래와 같이 서브쿼리화 하여, between 사용이 가능해진다.
SELECT b.love_id
FROM (SELECT a.rownum as rnum, a.love_id FROM love a) as b
WHERE b.rnum BETWEEN 1000 AND 2000;

************************************************************************************************

자, 그럼,, 저 위의 방식을 이용하여 마음껏(???) limit 인 척 해보자.



저작자 표시 비영리
신고
TRACKBACK 0 AND COMMENT 0

Oracle에는 DECODE라는 함수가 있다.
이 DECODE라는 녀석은 우리가 평소 프로그래밍 할 때 쓰던,
SWITCH CASE 문과 동일한 효과를 낸다.

오라클 11g DECODE 링크 :
http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/dml_functions_1058.htm


뭐. 위의 링크를 따라 가서 봐도 되지만,
간략히 DECODE의 양식을 보자면,

########### DECODE 양식 ####################################

DECODE (expr , search, result [, search , result]... [, default])

###########################################################

와 같다.


자, 이제 개나 소나 다 이해할 수 있는 쉬운 예를 살펴보도록 하자.

EX)
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

평소 우리가 쓰던 C나 C++ (다른 언어는 잘 안 써봐서 모른다.. ㅠ,.ㅠ)에서
=========================== C++ =======================================
struct tbl &a;
switch(a.value) {
case 1: printf("아도겐\n");
           break;
case 2: printf("소류겐\n");
           break;
case 3: printf("요가파이어\n");
           break;
case 4: printf("카오오오~\n"); /* (블랑카 ^^;;) */
           break;
default: printf("아따따뿌우겐!\n");
           break;
}
=======================================================================

를 oracle 에서 표현한다면,

========================= Oracle ======================================
SELECT DECODE(a.value, 1, '아도겐', 2, '소류겐', 3, '요가파이어', \
                          4, '카오오오~', '아따따뿌우겐')
FROM tbl a;
======================================================================

와 같이 표현 할 수 있을 것이다.

그럼 MySQL은?
아쉽게도 MySQL에서는 DECODE 함수가 없다.

아니, 실제적으로 말하면, MySQL의 DECODE함수는 있지만,
암호화와 관련된 함수이므로,
현재 말하고 있는 오라클의 DECODE와는 완전히 다른 존재이다.


그러나! CASE문을 사용하면,
동일한 효과를 볼 수 있다는 거~

========================= MySQL ======================================
SELECT (CASE a.value WHEN 1 THEN '아도겐'
                                 WHEN 2 THEN '소류겐'
                                 WHEN 3 THEN '요가파이어'
                                 WHEN 4 THEN '카오오오~'
                                 ELSE '아따따뿌우겐' END)
FROM tbl a;

-- 괄호는 안 쳐도 되지만, 치는 게 보기 좋다.
-- 또한 이 기능은 Oracle에서도 적용된당. ^0^/
======================================================================


☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

흠.... Oracle이 훨씬 짧군..

이번 게임은 Oracle, You Win..... Perfect....... 해라 -0-;;;;

짧은 게 좋은거여....



저작자 표시 비영리
신고
TRACKBACK 0 AND COMMENT 0

MySQL에서의 Sub Query의 더러운 진면목을 경험해 본 기억이 있기에,
(하루 온종일 돌려도 결과가 안 나와서 걷어찰 뻔 했다는...-_-;;)
요즘 모든 Sub Query들을 JOIN을 이용하여 해결하기 위해 노력한다.

그런데!!! 두둥!!
이런 뒌장.... 평소에 잘 돌아가던 코드가 Oracle에서는 안 돌아가더라....
'!$!@%$%!#$ㅆㄲㄸㅎㄹㅇㅎ!#!@#' 라고 욕을 잔뜩 하고 난 다음..
고민이 들더라..

많은 양의 데이터를 Migration 하기 위해 미리 짜 놓은 Query가,
쓰레기가 되는 상황이 벌어졌으니....
'뭐.. 아직은 시간이 남았으니 해결책을 마련해 보자.'
라고 하다가,

언제나처럼, 내 옆에 계시는 '고수'님의 파워를  빌어 내었다..

물론, 설명을 듣고 난 후에 오라클을 향해 다시 한 번
'*@$@#$@ㅎㅎㄲㄸㅎㅃㅎㄸㄲㅎ#$!$'
라고 해주는 것 또한 잊지 않았다눙~~

아.. 그런데 욕하다 보니 생각났다....
'내가 무식한 거구나 --;; !$%!$#%#$#!@#ㅇㅀㄶㄸ'

뭐 각설하고, 본론으로 가보장.

********************************************************************
[MySQL 에서의 사용 예]
UPDATE table_a a INNER JOIN table_b b ON (a.id = b.id)
SET       a.value = 'MySQL이 아직 공짜라 좋다!!'
WHERE  a.check_point = 'N';
********************************************************************
요럴 경우, 우리의 훌륭한 MySQL은 별다르게 다른 작업을 해주지 않아도,
참 일을 잘해준다.
즉, 쪼인을 건 상태임에도 불구하고, 알아서 해당 테이블의 값을 잘 넣어준다는 말씀.

그런데, 오라클을 함 보장.
********************************************************************
[Oracle 에서의 사용 예]
UPDATE table_a a INNER JOIN table_b b ON (a.t_id = b.t_id)
SET       a.t_value = 'Oracle 아따따 뿌우겐!!'
WHERE  a.t_check_point = 'N';
********************************************************************
요러면... 에러난다..
왜? UPDATE 구문에 들어갈 녀석의 JOIN이 되지 않기 때문이다.
Oracle 曰... 'SET 어딨냐?' --;;

그럼... 일보 후퇴하여, 궁극 병기 서브쿼리의 형식으로 쥐어짜 보자.
********************************************************************
[Oracle 에서의 사용 예]
UPDATE (SELECT a.t_value, a.t_check_point
             FROM table_a a INNER JOIN table_b b ON (a.t_id = b.t_id)
             ) x
SET       x.t_value = 'Oracle 아따따 뿌우겐!!'
WHERE  x.t_check_point = 'N';
********************************************************************
쓰읍... 결과는?  당근 된다..

그럼 한 가지 더...

저번에 오라클 10g AdminWorkshop 과정 때 강사님께,
'혹시 위와 같은 상황에서, 실제로 업데이트가 가능한 컬럼들을 알 수 있을까요?'
라고 여쭈어보니, 하루 있다 말씀 주신 것이...

'오라클에는 ALL_UPDATABLE_COLUMNS, USER_UPDATABLE_COLUMNS 라는 테이블이 있다.'

ALL_UPDATABLE_COLUMNS는 생성된 VIEW의 속성값 변경 가능 여부를
표시하는 시스템 테이블이고, USER_UPDATABLE_COLUMNS는 유저에게 종속된 VIEW의
속성 변경 가능 여부를 표시해준다.


하지만, 저것만으로는 매번 뷰를 생성해서 확인해 봐야 하는 중노동(?)이 필요하다.
뭔가 다른 방법은 없을까?

http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/views001.htm#i1006232

상기 링크를 보면, Updatable Join View 가 되기 위해서는 반드시 해당 View가
Key-preserved Table이여야 하다고 한다.

흠... 그거만 있으면 되는건가?





저작자 표시 비영리
신고
TRACKBACK 0 AND COMMENT 0

ARTICLE CATEGORY

모든 이야기 (77)
독백 (22)
MySQL (25)
Oracle (7)
영화 (6)
Linux (3)
DW(Data Warehouse) (0)
(7)
음악 (1)
Python (3)
Postgresql (2)

ARCHIVE