posted by 구름너머 2004. 12. 13. 21:15

테이블명, 컬럼명 변경 방법?

테이블명은 2가지 방식으로 고칠 수 있습니다.

SQL * PLUS 의 RENAME A TO B 명령이 하나 있고여..

SQL 문법에서 ALTER TABLE A RENAME TO B 가 있습니다.

컬럼명을 바꾸는게 문제일 텐데, 예전 같으면 컬럼명을 잘못 만들면, 쑈를 많이 했져... 테이블 하나 더 생성해 놓고 데이터 옮긴 다음 테이블 바꾸고, 다른 테이블 삭제하고...^^

근데 Oracle 9i R2에 이르러서 드디어 컬럼명 바꾸는 기능이 추가되었군여...

ALTER TABLE A RENAME COLUMN COL1 TO COL2 ; 임당...

'ORACLE' 카테고리의 다른 글

PREDEFINED EXCEPTION의 종류  (0) 2004.12.20
Process죽이기...  (0) 2004.12.16
NVL과 NVL2 함수에 대하여  (0) 2004.12.03
PL/SQL 에서 NULL 체크하기  (0) 2004.11.30
SQL*Plus AUTOTRACE  (0) 2004.10.15
posted by 구름너머 2004. 12. 3. 09:23
문법
NVL2(expr,expr1,expr2);


expr의 값이 null이 아닐 경우에는 expr1의 값을 반환 하고요 null일 경우에는 expr2의 값을 반환 합니다.



예제)

-- 보통 SQL문을 실행 했을 경우
SQL> SELECT ename, comm FROM emp;

ENAME COMM
---------------- ----------
SMITH
ALLEN 300
WARD 500
JONES
MARTIN 1400
BLAKE
CLARK
SCOTT
KING
TURNER 0
ADAMS



-- NVL함수를 사용 했을 경우

SQL>SELECT ename, NVL(comm, 0) comm FROM emp;

ENAME COMM
---------------- ----------
SMITH 0
ALLEN 300
WARD 500
JONES 0
MARTIN 1400
BLAKE 0
CLARK 0
SCOTT 0
KING 0
TURNER 0
ADAMS 0



-- NVL2함수를 사용 했을 경우

SQL>SELECT ename, NVL2(comm, 1, 0) FROM emp;


ENAME COMM
--------------- ----------
SMITH 0
ALLEN 1
WARD 1
JONES 0
MARTIN 1
BLAKE 0
CLARK 0
SCOTT 0
KING 0
TURNER 1
ADAMS 0

'ORACLE' 카테고리의 다른 글

Process죽이기...  (0) 2004.12.16
테이블명, 컬럼명 변경 방법?  (0) 2004.12.13
PL/SQL 에서 NULL 체크하기  (0) 2004.11.30
SQL*Plus AUTOTRACE  (0) 2004.10.15
EXPLAIN PLAN(실행계획  (0) 2004.10.15
posted by 구름너머 2004. 11. 30. 11:06

프로그램을 하다보면 막히는 문제가 가끔있죠?

Oracle에서 함수나 프로시져를 만들어 보았을것입니다.

그때 인수로 받는 값이 null로 들어오는 경우,

즉 해당 값을 입력하지 않는 경우는 에러 처리나

특별한 처리를 해야 하는데

이경우에 체크로직을 어떻게 해야 할까요?

1.이경우는 null이 검사가 안되고 if문을 빠져나가더군요!! ㅠㅠ

if( v_tel_no=null OR v_tel_no = '') then
dbms_output.put_line('is not a tel number!!');
end if ;

===============================================================

2. 해결한 방법 : 이렇게 하면 NULL이 검사가 되어 IF문을 탑니다.

if( v_tel_no is null ) then
dbms_output.put_line('is not a tel number!!');
end if ;

'ORACLE' 카테고리의 다른 글

테이블명, 컬럼명 변경 방법?  (0) 2004.12.13
NVL과 NVL2 함수에 대하여  (0) 2004.12.03
SQL*Plus AUTOTRACE  (0) 2004.10.15
EXPLAIN PLAN(실행계획  (0) 2004.10.15
Oracle Hint사용  (0) 2004.10.15
posted by 구름너머 2004. 10. 15. 11:21

'ORACLE' 카테고리의 다른 글

NVL과 NVL2 함수에 대하여  (0) 2004.12.03
PL/SQL 에서 NULL 체크하기  (0) 2004.11.30
EXPLAIN PLAN(실행계획  (0) 2004.10.15
Oracle Hint사용  (0) 2004.10.15
제약조건의 확인(테이블,컬럼)  (0) 2004.10.15
posted by 구름너머 2004. 10. 15. 11:19

'ORACLE' 카테고리의 다른 글

PL/SQL 에서 NULL 체크하기  (0) 2004.11.30
SQL*Plus AUTOTRACE  (0) 2004.10.15
Oracle Hint사용  (0) 2004.10.15
제약조건의 확인(테이블,컬럼)  (0) 2004.10.15
계층구조 쿼리의 예제  (0) 2004.10.15
posted by 구름너머 2004. 10. 15. 10:20


<<Optimization Approaches and Goals - Optimization 접근과 목적>>


/*+ ALL_ROWS */

ALL_ROWS는 Full Table Scan을 선호하며 CBO(Cost Based Optimization)는 default로
ALL_ROWS를 선택 합니다.

SQL>SELECT /*+ ALL_ROWS */ ename, hiredate FROM emp WHERE ename like '%%%'

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=1 Card=5 Bytes=80)
1 0 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=5 Bytes=80)



/*+ CHOOSE */

Hint Level의 CHOOSE는 RBO(Rule Based Optimization)인지 CBO(Cost Based Optimization)
인지를 선택 합니다.

만약 주어진 table의 통계 정보가 없다면 Rule Based 접근 방식을 사용 합니다.



/*+ FIRST_ROWS */

Full Table Scan보다는 index scan을 선호하며
Interactive Application인 경우 best response time을 제공 합니다.

또한 sort merge join보다는 nested loop join을 선호 합니다.

SQL>SELECT /*+ FIRST_ROWS */ ename FROM emp WHERE empno=7876

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=1 Card=1 Bytes=20)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=1 Card=1 Bytes=20)
2 1 INDEX (RANGE SCAN) OF 'PK_EMP' (UNIQUE) (Cost=1 Card=1)



/*+ RULE */

Rule Based 접근 방식을 사용하도록 지정 합니다.



<<Access Methods - 접근 방법>>


/*+ CLUSTER(table_name) */

Cluster Scan을 선택하도록 지정한다. 따라서 clustered object들에만 적용 됩니다.



/*+ FULL(table_name) */

Table을 Full Scan하길 원할 때 사용 합니다.



/*+ HASH(table) */

Hash scan을 선택하도록 지정한다.
이 hint는 HASHKEYS parameter를 가지고 만들어진 cluster내에 저장된 table에만 적용이 됩니다.



/*+ INDEX(table_name index_name) */

지정된 index를 강제적으로 쓰게끔 지정 합니다.



/*+ INDEX_ASC(table_name index_name) */

지정된 index를 오름차순으로 쓰게끔 지정 합니다.
Default로 Index Scan은 오름차순 입니다



/*+ INDEX_DESC(table_name index_name) */

지정된 index를 내림차순으로 쓰게끔 지정 합니다.


SQL>SELECT /*+ index_desc(emp pk_emp) */ empno
FROM emp
WHERE rownum = 1 ;

위 문장은 제일 큰 것 하나만 조회되므로, max function의 기능을 대신할 수 있습니다.



/*+ INDEX_FFS(table index) */

Full table scan보다 빠른 Full index scan을 유도 합니다.



/*+ ROWID(table) */

Rowid로 Table Scan을 하도록 지정 합니다.



<<Join Orders>>


/*+ ORDERED */

From절에 기술된 테이블 순서대로 join이 일어나도록 유도 합니다.



<<Join Operations>>


/*+ USE_HASH (table_name) */

각 테이블간 HASH JOIN이 일어나도록 유도 합니다.



/*+ USE_MERGE (table_name) */

지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도 합니다.



<<Parallel Execution>>


/*+ NOPARALLEL(table_name) */

NOPARALLEL hint를 사용하면, parallel query option을 사용하지 않도록 할 수 있다.

SQL>SELECT /*+ NOPARALLEL */ * FROM emp;



/*+ PARALLEL(table_name, degree) */

PARALLEL hint를 사용하면 query에 포함된 table의 degree를 설정할 수 있습니다.

예를 들어, 다음과 같이 hint를 적어 degree 4로 parallel query option을 실행하도록 할 수 있습니다.
이 때 parallel이란 글자와 괄호( '(' )사이에 blank를 넣지 않도록 주의해야 합니다.

SQL>SELECT /*+ PARALLEL(emp, 4) */ * FROM emp;



* DEGREE의 의미 및 결정

Parallel Query에서 degree란 하나의 operation 수행에 대한 server process의 개수 입니다.
이러한 degree 결정에 영향을 주는 요인들에는 다음과 같은 것들이 있습니다.

(1) system의 CPU 갯수
(2) system의 maximum process 갯수
(3) table이 striping되어 있는 경우, 그 table이 걸쳐있는 disk의 갯수
(4) data의 위치 (즉, memory에 cache되어 있는지, disk에 있는지)
(5) query의 형태 (예를 들어 sorts 혹은 full table scan)

한 사용자만이 parallel query를 사용하는 경우, sorting이 많이 필요한
작업과 같은 CPU-bound 작업의 경우는 CPU 갯수의 1 ~ 2배의 degree가 적당하며,
sorting보다는 table scan과 같은 I/O bound 작업의 경우는 disk drive 갯수의 1 ~ 2배가 적당합니다.

동시에 수행되는 parallel query가 많은 경우에는 위의 각 사용자의 degree를
줄이거나 동시에 사용하는 사용자 수를 줄여야 합니다.

'ORACLE' 카테고리의 다른 글

SQL*Plus AUTOTRACE  (0) 2004.10.15
EXPLAIN PLAN(실행계획  (0) 2004.10.15
제약조건의 확인(테이블,컬럼)  (0) 2004.10.15
계층구조 쿼리의 예제  (0) 2004.10.15
계층 구조의 조회(Hierarchical Queries)  (0) 2004.10.15
posted by 구름너머 2004. 10. 15. 10:18

--1. 테이블에 걸려있는 제약 조건의 확인
-- USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있습니다.
-- USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건을 불 수 있습니다.
--이 두개의 데이터사전을 참조 하면 됩니다.
SELECT SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,   -- 컬럼명
     DECODE(B.CONSTRAINT_TYPE,
'P','PRIMARY KEY',
           'U','UNIQUE KEY',
           'C','CHECK OR NOT NULL',
'R','FOREIGN KEY') CONSTRAINT_TYPE,   -- 제약조건 TYPE
     A.CONSTRAINT_NAME   CONSTRAINT_NAME   -- 제약 조건 명
FROM  USER_CONS_COLUMNS  A,  USER_CONSTRAINTS  B  
WHERE  A.TABLE_NAME = UPPER('TB_CODECD')  
AND  A.TABLE_NAME = B.TABLE_NAME  
AND  A.CONSTRAINT_NAME = B.CONSTRAINT_NAME  
ORDER BY 1   

--2. 테이블의 특정 컬럼에 걸려있는 제약 조건의 확인
--USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있습니다.
--SQL>SET LINESIZE 300
SELECT SUBSTR(TABLE_NAME,1,15)    TABLE_NAMES,  
     SUBSTR(COLUMN_NAME,1,15)   COLUMN_NAME,  
       SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME  
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = UPPER('TB_CODECD')
AND COLUMN_NAME = UPPER('CD_CODE')  

'ORACLE' 카테고리의 다른 글

EXPLAIN PLAN(실행계획  (0) 2004.10.15
Oracle Hint사용  (0) 2004.10.15
계층구조 쿼리의 예제  (0) 2004.10.15
계층 구조의 조회(Hierarchical Queries)  (0) 2004.10.15
EXECUTE IMMEDIATE를 이용한 Dynamic SQL  (0) 2004.10.15
posted by 구름너머 2004. 10. 15. 10:12


아래 강좌에서 START WITH와 CONNECT BY절을 이용해서 계층 구조로 쿼리를 해오는것을 살펴봤습니다.

이번에는 계층구조를 이용해서 역순으로 쿼리를 해오는것을 보겠습니다.

SQLPLUS scott/tiger
-- 조금 깔끔하게 보기 위해서.. 셋팅 먼저 하고요..
SQL> SET LINESIZE 100
SQL> SET PAGESIZE 100
SQL> COL ename FORMAT A20

SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno, mgr, job
FROM emp
START WITH EMPNO=7839
CONNECT BY PRIOR empno=mgr;
ENAME EMPNO MGR JOB
-------------------- ---------- ---------- ---------
KING 7839 PRESIDENT
JONES 7566 7839MANAGER
SCOTT 7788 7566 ANALYST
ADAMS 7876 7788 CLERK
FORD 7902 7566 ANALYST
SMITH 7369 7902 CLERK


위 SQL문은 EMPNO가 7839인 것을 기준으로 EMPNO와 MGR컬럼을 가지고 계층구조로 비교해서 결과값을 반환 합니다.

위 SQL문의 CONNECT BY PRIOR empno=mgr 이 부분을..한번 바꺼 볼까요..

아래처럼.. CONNECT BY empno=PRIOR mgr 이렇게 바꺼서 한번 실행해 보세요..
그럼..역순으로.. 쿼리를 해서 결과값을 반환 합니다


SQL>SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno, mgr, job
FROM emp
START WITH EMPNO=7369
CONNECT BY empno=PRIOR mgr;



ENAME EMPNO MGR JOB
-------------------- ---------- ---------- ---------
SMITH 7369 7902 CLERK
FORD 7902 7566 ANALYST
JONES 7566 7839 MANAGER
KING 7839 PRESIDENT


위에 결과값과 비교해 보세요..

이 SQL문은 실제로..실무에서 카테고리의 Depth를 표현할때 아주 많이 사용 합니다.

컴퓨터/소프트웨어>모니터>일반CRT모니터

이런 카테고리 구조를 하나의 SQL문으로 쉽게 가져 올수가 있죠..
- 김정식 [2004-03-16]
이렇게 하면 한줄로 나오겠지..
SELECT lvl3||' > '||lvl2||' > '||lvl1 lvl
FROM
(SELECT MAX(DECODE(lvl, 3, category_name)) lvl3,
MAX(DECODE(lvl, 2, category_name)) lvl2,
MAX(DECODE(lvl, 1, category_name)) lvl1
FROM
(SELECT LEVEL lvl, category_name
FROM wp_category
WHERE category_id > 0
START WITH category_id=1913
CONNECT BY category_id=PRIOR parent_id))