posted by 구름너머 2005. 3. 22. 15:01
Direct-Load Insert의 사용방법(Oracle8)

Direct-Load Insert의 사용방법(Oracle8)
======================================

Direct-Load Insert 는 SGA의 buffer cache를 거치지 않고 직접
Oracle data를 구성하고 입력하는 방법이다. 이 기능은 SQL*Loader의
Direct load와 비슷한 기능이다. 이 방법은 undo entry를 생성하지 않으므로
기본 insert보다 속도가 빠르다.
Direct-Load insert는 serial과 parallel mode를 둘 다 사용할 수 있다.


1. Serial, Parallel Insert

Direct-Load Insert는 parititioned와 non-partitioned table에 대해
사용할 수 있으며, 이 명령문 직후에는 반드시 commit이나 rollback이
필요하다.

(1) Serial Direct-Load Insert - data는 해당 segment의 HWM(high
water mark) 다음에 입력되며 commit이 실행되면 hwm이 바뀌면서
data를 볼 수 있게 된다.

(2) Parallel Direct-Load Insert into a nonpartitioned table
- 각 parallel server process는 새로운 temporary segment를
할당하고 데이타를 입력한 후에 commit이 실행되면 parallel
coordinator가 모든 temporary segment를 기존의 segment와 합친다.

(3) Parallel Direct-Load Insert into a partitioned table
- 각 partition마다 하나의 parallel server process를 할당받아서
hwm다음에 data를 입력하고 commmit이 일어나면 hwm이 바뀌게 된다.

2. Direct-Load Insert의 사용방법

Serial Direct-Load Insert는 APPEND hint를 통해 사용할 수 있다.
Parallel Direct-Load Insert는 APPEND 없이 PARALLEL hint만으로도
사용할 수 있다. 즉 Insert 시에 PARALLEL을 지정하면 무조건 Direct-Load로
작동하게 된다.

[예제1] APPEND hint의 사용

SQL> insert /*+ APPEND */ into emp select * from t_emp;
SQL> commit;
(direct insert후에 바로 select를 하기 전에 먼저 commit;을 해야
data를 확인할 수 있다.)

[예제2] PARALLEL hint의 사용

SQL> alter session enable parallel dml;
SQL> insert /*+ PARALLEL(emp,10) */ into emp
select /*+ PARALLEL(t_emp,10) */ * from t_emp;
SQL> commit;

위와 같이 Direct-Load Insert는 대량의 데이타를 한꺼번에 입력하는
경우에 사용하는 것이 좋으므로 일반 insert into .. values 구문에서의
사용은 지양된다.

3. Logging mode의 사용

Direct-Load Insert 방법은 Logging과 no-Logging mode를 둘 다 사용할
수 있다. no-logging mode로 하면 추가된 extent에 대한 정보 등 최소한의
data dictionary의 변경 사항만이 redo log에 적용된다.
그러나, 입력되는 data에 대한 정보는 발생하지 않으므로 속도는 훨씬 빨라진다.
no-logging mode는 table, index, tablespace 등에 지정할 수 있다.

SQL> alter table emp nologging;
SQL> alter session enable parallel dml;
SQL> insert /*+ PARALLEL(emp,10) */ into emp
select /*+ PARALLEL(t_emp,10) */ * from t_emp;
SQL> commit;

4. Space에 대한 고려사항

Direct-Load Insert는 기존의 segment 영역에 있는 입력 가능한 공간을
무시하고 Insert하므로 기존의 Insert보다 더 많은 space가 필요하다.
nonpartitioned table에 parallel insert를 할 경우에는 기존의 extent 영역에
있는 hwm 다음의 free space도 무시하고 새로운 segment를 생성하므로 insert하기
전에 이러한 추가적인 space를 고려해 두어야 한다.
nonparititoned table에 parallel insert 시에는 지정한 parallel server
process의 수만큼 새로운 extent를 생성하는데, 그 크기는 table에 지정한
next + next*pctincrease를 고려하여 만든다. 그러므로 이 작업을 하기 전에는
next와 pctincrease를 적합한 크기로 바꾸어 줄 필요가 있다.

from oracle.com

'ORACLE' 카테고리의 다른 글

Pro*C 에서 COMMIT 에 대하여  (0) 2005.03.23
오라클 Document  (0) 2005.03.23
Pro*C 강좌 파일이 잘되어 있는곳.  (0) 2005.03.22
내장함수 trunc 사용하기...  (0) 2005.03.04
[Oracle] 날자 오류 ORA-01839 피해가기...  (0) 2005.02.01
posted by 구름너머 2005. 3. 22. 13:37

http://cafe.naver.com/flyoracle.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=72

FOR절의 사용

    INSERT, EXECUTE, FETCH, DELETE, OPEN, UPDATE 등에서 ARRAY호스트 변수를 사용할
    경우 선택적으로 "FOR"절을 사용할 수 있다.
    특히 INSERT, DELETE, UPDATE문에서는 유용하다.
    char emp_name[100];
    short salary [100];
    int rows_to_insert;

    rows_to_insert = 25;
    EXEC SQL FOR :rows_to_insert INSERT INTO emp (ename, salary)
    VALUES (:emp_name, :salary);
    /* 100개의 row중에 25개만 insert했다. */

    "FOR"절은 UPDATE와 INSERT가 동시에 발생되는 TRANSACTION에서는 구현하기가 쉽다.
    ARRAY호스트 변수를 사용하면서 선택적으로 INSERT, UPDATE해야 하는 프로그램에서는
    "FOR"절이 유용하게 사용된다.

'ORACLE' 카테고리의 다른 글

오라클 Document  (0) 2005.03.23
Direct-Load Insert의 사용방법(Oracle8)  (0) 2005.03.22
내장함수 trunc 사용하기...  (0) 2005.03.04
[Oracle] 날자 오류 ORA-01839 피해가기...  (0) 2005.02.01
Oracle 기동/정지  (0) 2005.01.10
posted by 구름너머 2005. 3. 4. 16:36

oracle 내장함수중에 trunc란 함수가 있습니다.

날자를 trunc하면 아래와 같은 사용이 가능하므로

참고하여 유용하게 사용하세요.

select *

from테이블명 a
where reg_date >= trunc(sysdate,'dd') --오늘자 자료 조회
--where reg_date >= trunc(sysdate,'dd')-1 --어제이후 자료 조회

select sysdate,
to_char(trunc(sysdate,'dd'),'yyyy-mm-dd hh24:mi:ss') as DD, -- 오늘 정각 0시
to_char(trunc(sysdate,'dd')-1,'yyyy-mm-dd hh24:mi:ss') as DD, -- 어제 정각 0시
to_char(trunc(sysdate,'mm'),'yyyy-mm-dd hh24:mi:ss') as MM, --이달 1일 정각 0시
to_char(trunc(sysdate,'yyyy'),'yyyy-mm-dd hh24:mi:ss') as YYYY, --금년 1월 1일 정각 0시
to_char(trunc(sysdate,'hh24'),'yyyy-mm-dd hh24:mi:ss') as HH24, --오늘 현재 시간 정각
to_char(trunc(sysdate,'mi'),'yyyy-mm-dd hh24:mi:ss') as MI, --오늘 현재 시간 분의 정각
sysdate - 1 as sysdate_day, --하루전 현재시간(24시간전)
sysdate - 3/24 as sysdate_time, --오늘 3시간 전(3*60분전)
sysdate - 365 as yester_year , --작년 현재시간
to_char(sysdate,'yyyymmdd') - '10000' ---텍스트에서 작년 오늘.
from dual

posted by 구름너머 2005. 2. 1. 15:55

오라클 9i에서 날자변환시 에러가 납니다.

쿼리 ==> select to_date('19850431','yyyymmdd') from dual

결과 ==>ORA-01839: date not valid for month specified

피해갈 좋은 방법이 없어서 일단 아래와 같이 했는데

좋은 방법이 있으면 멘트 달아 주세요...

피해가기 쿼리 ==>

select to_date(least('19850431',to_char( last_day(to_date('198504','yyyymm')),'yyyymmdd')), 'yyyymmdd') from dual

결과 ==> 1985-04-30

'ORACLE' 카테고리의 다른 글

Pro*C 강좌 파일이 잘되어 있는곳.  (0) 2005.03.22
내장함수 trunc 사용하기...  (0) 2005.03.04
Oracle 기동/정지  (0) 2005.01.10
listener 패스워드를 설정하기  (0) 2005.01.10
PREDEFINED EXCEPTION의 종류  (0) 2004.12.20
posted by 구름너머 2005. 1. 10. 20:01

<기동하기>

서버 구동후...

1. su - oracle

2. sqlplus /nolog

3. 접속이 되면
connect /as sysdba

4.DB 기동
startup

5. 리스너 기동

lsnrctrl start

<정지하기>

1.리스너 정지

lsnrctrl stop

2.su-oracle

3. connect /as sysdba

4. shutdown immediate

'ORACLE' 카테고리의 다른 글

내장함수 trunc 사용하기...  (0) 2005.03.04
[Oracle] 날자 오류 ORA-01839 피해가기...  (0) 2005.02.01
listener 패스워드를 설정하기  (0) 2005.01.10
PREDEFINED EXCEPTION의 종류  (0) 2004.12.20
Process죽이기...  (0) 2004.12.16
posted by 구름너머 2005. 1. 10. 11:25

다음과 같은 절차에 의해 listener 패스워드를 설정하여야 한다.

1. 'lsnrctl' 명령을 수행시킨다. 그리고 LISTENER 프롬프트 상태로 들어간다.

2. 'change_password'를 타이프하고 LISTENER의 패스워드를 바꾼다. 이 명령은 listener의 패스워드를 바꿀 수 있게 해 준다.

3. 'set password'를 타이프하고 2번에서 설정한 패스워드를 입력한다. 이 명령은 단지 인증 목적으로 LSNRCTL 유틸리티에서 listener 프로세스에 보내게 되는 패스워드를 설정해 준다.

4. 'save_config'를 타이프한다. 이 명령은 listener 설정파일의 백업 (LISTENER.BAK 파일)을 생성하고 실제 설정파일 (LISTERNER.ORA) 자체에 변경된 내용을 업데이트 한다.

5. 'exit'를 타이프하여 프롬프트에서 빠져 나온다.

'ORACLE' 카테고리의 다른 글

[Oracle] 날자 오류 ORA-01839 피해가기...  (0) 2005.02.01
Oracle 기동/정지  (0) 2005.01.10
PREDEFINED EXCEPTION의 종류  (0) 2004.12.20
Process죽이기...  (0) 2004.12.16
테이블명, 컬럼명 변경 방법?  (0) 2004.12.13
posted by 구름너머 2004. 12. 20. 22:05
DECLARE SECTION에서 선언할 필요가 없습니다.
ORACLE8 Server 에러 중에서 자주 발생되는 20가지 에러에 대해 미리 정의되어 있는
EXCEPTION입니다.
해당 EXCEPTION 처리 루틴에서 미리 정의된 EXCEPTION명을 참조하여 에러를
처리합니다.

PREDEFINED EXCEPTION의 종류에는 다음과 같은 것들이 있습니다.

EXCEPTION명 에러번호 설명
NO_DATA_FOUND ORA-01403 데이터를 반환하지 않은 SELECT문
TOO_MANY_ROWS ORA-01422 두 개 이상을 반환한 SELECT문
INVALID_CURSOR ORA-01001 잘못된 CURSOR 연산 발생
ZERO_DIVIDE ORA-01476 0으로 나누기
DUP_VAL_ON_INDEX ORA-00001 UNIQUE COLUMN에 중복된 값을 입력할 때
CURSOR_ALREADY_OPEN ORA-06511 이미 열러 있는 커서를 여는 경우
INVALID_NUMBER ORA-01722 문자열을 숫자로 전환하지 못한 경우
LOGIN_DENIED ORA-01017 유효하지 않은 사용자로 LOGON 시도
NOT_LOGGED_ON ORA-01012 PL/SQL 프로그램이 오라클에 연결되지
않은 상태에서 호출
PROGRAM_ERROR ORA-06501 PL/SQL 내부에 오류
STORAGE_ERROR ORA-06500 PL/SQL에 메모리 부족
TIMEOUT_ON_RESOURCE ORA-00051 오라클이 자원을 기다리는 동안 시간 초과
발생
VALUE_ERROR ORA-06502 산술, 절단 등에서 크기가 다른 오류 발생

'ORACLE' 카테고리의 다른 글

Oracle 기동/정지  (0) 2005.01.10
listener 패스워드를 설정하기  (0) 2005.01.10
Process죽이기...  (0) 2004.12.16
테이블명, 컬럼명 변경 방법?  (0) 2004.12.13
NVL과 NVL2 함수에 대하여  (0) 2004.12.03
posted by 구름너머 2004. 12. 16. 16:52

$>sqlplus '/as sysdba'

SQL> oradebug setospid 21629
Oracle pid: 19, Unix process pid: 21629, image: oracle@pops (TNS V1-V3)
SQL> oradebug suspend
Statement processed.

SELECT /*+ CHOOSE */
S.SERIAL# "Serial#",
p.spid, p.pid, si.sid, s.audsid
FROM V$SESSION S, V$PROCESS P, sys.V_$SESS_IO si
WHERE S.paddr = P.addr(+)
and si.sid(+)=s.sid
AND (s.username IS NOT NULL) AND (NVL (s.osuser, 'x') <> 'SYSTEM') AND (s.TYPE <> 'BACKGROUND');

--세션 죽이기
--형식: alter system kill session 'sid, serial#'
alter system kill session '165, 34399' ;

'ORACLE' 카테고리의 다른 글

listener 패스워드를 설정하기  (0) 2005.01.10
PREDEFINED EXCEPTION의 종류  (0) 2004.12.20
테이블명, 컬럼명 변경 방법?  (0) 2004.12.13
NVL과 NVL2 함수에 대하여  (0) 2004.12.03
PL/SQL 에서 NULL 체크하기  (0) 2004.11.30