반응형
[참고문헌 : export one-on-one ORACLE]

* 전역 임시 테이블
임시테이블을 생성하는 동작은 공간 할당까지 포함하지 않으며, 다른 종류의 테이블들과는 다르게 initial 익스텐트가 할당되지 않는다. 런타임에 세션이 처음으로 임시 테이블에 데이터를 삽입하면 그 세션을 위한 임시 세그먼트가 생설될 것이다. 
각 세션은 자신만의 임시 세그먼트(존재하는 세그먼트의 익스텐트가 아니다)를 가지기 때문에 모든 사용자들은 임시 테이블을 위한 공간을 서로 다른 테이블 영역에서 할당할 수 있을 것이다.

*임시 테이블은 트리거, 체크 제약조건, 인덱스 등과 같은 영구 테이블의 많은 속성들을 갈질 수 있다.
임시 테이블에서 지원되지 않는 영구 테이블의 특성은 다음과 같다.

1. 참조 무결성 제약조건을 가질 수 없다. 임시 테이블들은 외래 키의 대상이 될 수 없고, 임시 테이블에 대해 선언된 외래 키를 가질 수도 없다.
2 .VARRAY 혹은 NESTED TABLE 유형의 열을 가질 수 없다.
3. 인덱스 구조 테이블이 될 수 없다.
4. 인덱스나 해시 클러스터 안에 있을 수 없다.
5. 분할될 수 없다.
6. ANAYLYZE 명령어를 통해 생성된 통계 정보를 가질 수 없다.

SQL> create global temporary table temp_table_session
  2  on commit preserve rows
  3  as select * from dept where 1=2;

Table created.

SQL> create global temporary table temp_table_transaction
  2  on commit delete rows
  3  as
  4  select * from dept where 1=2;

Table created.

SQL> create global temporary table temp_table_default  -- 아무것도 지정하지 않음.
  2  as select * from dept where 1=2;

Table created.

SQL> insert into temp_table_session values(70,'SCOTT','TIGER');

1 row created.

SQL> insert into temp_table_transaction values(70,'SCOTT','TIGER');

1 row created.

SQL> insert into temp_table_default values(70,'SCOTT','TIGER');

1 row created.

SQL> select session_cnt, transaction, default_cnt
  2  from (select count(*) session_cnt from temp_table_session) a,
  3  (select count(*) transaction from temp_table_transaction) b,
  4  (select count(*) default_cnt from temp_table_default) c
  5  /

SESSION_CNT TRANSACTION DEFAULT_CNT
-------------- -------------- -------------
                    1                    1                   1

SQL> commit;

Commit complete.

SQL> select session_cnt, transaction, default_cnt
  2  from (select count(*) session_cnt from temp_table_session) a,
  3  (select count(*) transaction from temp_table_transaction) b,
  4  (select count(*) default_cnt from temp_table_default) c
  5  /

SESSION_CNT TRANSACTION DEFAULT_CNT
-------------- -------------- --------------
                   1                     0                    0

SQL>

나의 의견 : 
아무것도 지정해 주지 않은 것은 transaction 설정을 default로 가지고 있는가가 저는 궁금합니다.
위 테스트의 결과를 보면 default 값으로 가지고 있지 않나 하는 생각이 듭니다.
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

set echo on & set feedback off  (0) 2010.02.16
Data Dictionary  (0) 2010.02.02
alert file 에서 error 개수 확인 방법  (0) 2010.01.14
number(p,s) : precision, scale ora-01438  (0) 2009.12.10
Oracle Default DB 내 맘대로 바꾸기.  (0) 2009.11.19
반응형
처 : [http://ukja.tistory.com/240 욱짜님 블로그]
         평소 자주 찾아보는 욱짜님 블로그에 있는 설명 그대로를 테스트 해본 결과 입니다.

1. bdump의 경로를 알아보고 지정.

SQL> col value new_value back_dump
SQL> select value from v$parameter where name = 'background_dump_dest';

VALUE
--------------------------------------------------------------------------------
/oracle/oradata/PROD/admin/bdump

SQL> create or replace directory back_dump_dir as '&back_dump';
old   1: create or replace directory back_dump_dir as '&back_dump'
new   1: create or replace directory back_dump_dir as '/oracle/oradata/PROD/admin/bdump'

Directory created.

SQL>

2. get_trace_file3생성. -> 불러올 파일을 읽는 함수 같군요.

http://sites.google.com/site/ukja/sql-scripts-1/c/get_trace_file 참조.

SQL> create or replace type varchar2_array as table of varchar2(4000);
  2  /

Type created.

SQL> create or replace function get_trace_file3(dir_name in varchar2, file_name in varchar2)
  2  return varchar2_array
  3  pipelined
  4  as
  5    v_handle  utl_file.file_type;
  6    v_line      varchar2(2000);
  7  begin
  8  v_handle := utl_file.fopen(dir_name, file_name, 'R', 32767);
  9   loop    
 10     begin 
 11       utl_file.get_line(v_handle, v_line); 
 12     exception when no_data_found then      
 13       exit;        
 14     end;           
 15   pipe row(v_line);
 16       end loop;    
 17                    
 19      utl_file.fclose(v_handle);
 18           
 20    return;
 21  end;     
 22  /

Function created.

SQL>

3. global temporary table 생성 -> commit 또는 섹션종료시에 데이터가 삭제되는 전역임시테이블생성

SQL> create global temporary table t_alert_analyze
  2  (
  3     reg_date date,
  4     error_code varchar2(10),
  5     message varchar2(4000)
  6  );

Table created.

SQL>

4. alert_analyze.sql script 실행

SQL>@alert_analyze.sql (or @alert_analyze.sql alert_PROD.log % % %)

* alert_analyze.sql 의 파일 내용.

define __ALERT_LOG = "&1"  -> alert 파일 명(ex. alert_PROD.log)
define __START_DT = "&2"  -> 검색 시작 날짜(2009/07/01 or %(default)) : sysdate - 100000
define __END_DT = "&3"    -> 검색 끝 날짜(2009/07/01 or %(default)) : sysdate + 1
define __PATTERN = "&4"  -> alert 파일에 대한 특정 패턴 (default 설정 '%')

set serveroutput on

delete from t_alert_analyze;

declare
 v_date date;
 v_start_dt date;
 v_end_dt date;
 v_err_code varchar2(10);
 v_message varchar2(4000);
 b_include boolean := false;
begin
 select decode('&__START_DT', '%', sysdate - 100000,
    to_date('&__START_DT', 'yyyy/mm/dd')) into v_start_dt from dual;
    
 select decode('&__END_DT', '%', sysdate + 1,
    to_date('&__END_DT','yyyy/mm/dd')) into v_end_dt from dual;

 for r in (select column_value as txt
    from table(get_trace_file3('BACK_DUMP_DIR', '&__ALERT_LOG'))) loop
--  dbms_output.put_line(r.txt);
  if regexp_like(r.txt, '[0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]') then
  v_date := to_date(r.txt, 'Dy Mon dd hh24:mi:ss yyyy');
  if b_include = false then
   if v_date between v_start_dt and v_end_dt then
    b_include := true;
   end if;
  end if;
 end if;
 
   if b_include then
    if r.txt like '%&__PATTERN%' then
     if r.txt like 'ORA-%' then -- error code exists
      v_err_code := substr(r.txt, 1, 9);
      v_message := substr(r.txt, 12);
     else
      v_err_code := '-';
      v_message := r.txt;
     end if;
     
     insert into t_alert_analyze(reg_date, error_code, message)
      values(v_date, v_err_code, v_message);
    end if;
   end if;
 end loop;
end;
/

select to_char(reg_date,'yyyy/mm/dd') as "when", error_code, count(*)
from t_alert_analyze
where error_code like '%ORA%'
group by to_char(reg_date,'yyyy/mm/dd'), error_code
order by 1 desc, 3 desc
;

나의 의견 : 
설명이 잘 나와있었음에도 불구하고 내공이 부족하여, 많은 시행착오로 드디어 성공하였습니다.
위 쿼리문들을 보고 공부를 해두어야 할 것이 몇 가지가 생겨나서 적어봅니다.
1. 전역 임시 테이블에 관하여...
   (기본적인 사항은 알고 있었지만, 좀 더 세밀하게 파악을 해보도록 하겠습니다.)

2. 중첩테이블에 대해서...
  (이런 것이 있다는 것만 알았지 명령어가 무엇인지, 어떤 기능을 가지고 있는지, 등등 
   현재로써는 아는 것이 하나도 없습니다.)

3. regexp_like에 대해서...
  (음.. 이건 오라클에서 정규화를 쓸수있는 함수라고는 알고 있었고, 예전부터 이에 대해 공부를
   해야겠다고 마음만 갖고 있었는데 이 함수가 이곳에 또 나와있어서 하루 빨리 공부를 
   해야하지 않을까라는 생각이 들었습니다.)

추후 위 사항들에 대해서 글을 남기도록 하겠습니다.
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Data Dictionary  (0) 2010.02.02
전역 임시 테이블(temporary table)  (0) 2010.01.29
number(p,s) : precision, scale ora-01438  (0) 2009.12.10
Oracle Default DB 내 맘대로 바꾸기.  (0) 2009.11.19
Partition Table(2) - Management  (0) 2009.06.17
반응형
number(p,s) : 전체 p자리 중 소수점 이하 s자리(p:1~38, s:-84~127)

number 형식 컬럼에 대한 length를 지정하지 않고 사용되는 경우가 있습니다.
예를 들자면 create table num_test (num1 number); 라고 지정을 해놓는데,
데이터가 일정치 않을 경우 엄청난 값의 길이가 들어갈 수 있는 상황이 발생하겠죠.

그래서 흔히들 number(10) 같이 길이를 지정해 주고 사용되고 있습니다.
소수점을 넣을려고 한다면 number(10,2) 이런 식으로 format을 설정해 줍니다.

제가 하고 싶은 말은 얼마전 우연히 number(3,8) 에 대해서 의문을 가지게 되었습니다.
즉, p가 s보다 작을 경우 어떻게 되는가 입니다.
아직까지도 정확하게 잘 모르겠습니다.

테스트를 해본 결과 p가 s보다 작을경우 값이 0을 제외하고는 들어가지 않는다는 거죠!
제 생각으로는 소수점 8자리까지 표시를 가능하게 했으나 길이가 3으로 설정되어, 너무 짧게 
잡아 놓아서 들어가지 않는다고 일단은 결론을 지웠습니다.

그러나 또 다른 의문이 생겼습니다.
그렇다면 insert into num_test values(1.5); 들어가야 하지 않나? 입니다.
저 값의 길이는 2가 되고 소수점도 한자리밖에 차질하지 않으니 들어가야하지 않을까요?
역시나 들어가지 않더군요.
이것 또한 제가 지은 결론은
number(3,8)은 소수점 자리를 제외한 나머지 길이값이 정수값이 된다 입니다.
3-8 = -5가 되니 정수값은 넣어주질 못하는 것이고..
number(6,5) 일 경우는
6-5 = 1 이 되는 한자리의 정수값은 들어가게 됩니다.

여기서 또 다른 의문!! 
number(3,8) 일때는 정수값은 못들어간다 해도 소수점 자리는 3자리까지는 들어가야지 않나? 입니다.
그러나 들어가질 않습니다.

최종 결론을 내리자면 p값이 s보다 작을 경우는 값이 들어가질 않는다 입니다.
애초에 format을 설정할때 만들어지지 않게 했다면 이해를 했겠건만 설정이 되니, 무엇인가가 되는게 아닌가 의심을 해봅니다.

여기저기 찾아봐도 저의 궁금증을 풀어줄 만한 자료는 찾질 못햇습니다.
좀 더 확인 작업을 하고 확실하게 알아봐야 할 것 같습니다.
뭔가 확실한 이유를 찾아서..ㅎㅎ

참고로 아래 사항은 제가 테스트 해본 결과 입니다.

SQL> create table num_test (a number);

Table created.

SQL> alter table num_test modify a number(3,5);

Table altered.

SQL> insert into num_test values(1.1);
insert into num_test values(1.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> alter table num_test modify a number(4,5);

Table altered.

SQL> insert into num_test values(1.1);
insert into num_test values(1.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> alter table num_test modify a number(5,5);

Table altered.

SQL> insert into num_test values(1.1);
insert into num_test values(1.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> insert into num_test values(.1);

1 row created.

SQL> select * from num_test;

         A
----------
         0
         0
        .1

SQL> alter table num_test modify a number(6,5);

Table altered.

SQL> insert into num_test values(0.1);

1 row created.

SQL> insert into num_test values(1.1);

1 row created.

SQL> insert into num_test values(10.1);
insert into num_test values(10.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> insert into num_test values(1.12);

1 row created.

SQL> insert into num_test values(1.12123141);

1 row created.

SQL> drop table num_test;

Table dropped.

반응형
반응형
오라클을 설치할 때 기본적으로 깔리는 DB를 수정해 보았습니다.
데이터 파일 이동, 리두로그파일 추가, 아카이브 모드 변경, 풀백업 등등
예전에 배웠던 것들을 조금씩 조금씩 기억해 나가면서..변환을 하였습니다.

좀 길긴하지만 차근차근히 보시면 금방 눈에 쏘옥 들어올겁니다.

참고로 울트라에디트에서 편집을 하였습니다.(그냥 단순히 긁어다가 복사한 것 뿐이지만요~)
파일을 참조 해 주세요.

※ 작업한 내역

1. 데이터 파일 이동
2. temporary temp tablespace 생성 및 삭제.
3. redo logfile 이동 및 member 추가
4. control file 경로 수정 및 폴더 생성, admin 경로에 대한 pfile 수정
  - 예전 alert file, trace file 등 전부 이동.
5. pfile 구동후 spfile로 복사
6. 기존 데이터 파일 삭제
7. archive mode 변경
8. index tablespace 생성
9. full backup

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

alert file 에서 error 개수 확인 방법  (0) 2010.01.14
number(p,s) : precision, scale ora-01438  (0) 2009.12.10
Partition Table(2) - Management  (0) 2009.06.17
Partition Table(1) - Create  (0) 2009.06.17
Row Migration  (0) 2008.11.30
반응형
이번에는 Partition Table에 대한 기본적인 관리에 대해서 정리하고자 합니다.

dba_tab_partitions, all_tab_partitions, user_tab_partitions (partition table에 대한 정보가 나와요)

* 파티션 테이블 스페이스 추가.
SQL> alter table range_emp add partition range_p4 values less than(5000) tablespace tbs4;
SQL> alter table range_emp add partition range_p5 values less than(maxvalue) tablespace tbs5;

위와 같이 추가해 줄수 있으며 maxvalue가 설정이 되었을 경우는 더이상 추가를 해줄수가 없습니다.
그러나 maxvalue 파티션 부분을 분할 해 줄수 있습니다.

* 파티션 테이블 스페이스 분할.
SQL> alter table range_emp split partition range_p5 at(6000) 
2 into (partition range_p6 tablespace p6, partition range_p5 tablespace p5);
  -- range_p5 파티션을 range_p6으로 split(분할) 한다.

* 파티션 테이블 스페이스 삭제.
SQL> alter table range_emp drop partition range_p5;

* 파티션 테이블 데이터 삭제.
SQL> delete from range_emp partition (range_p1);
SQL> alter table range_emp truncate partition range_p1;

* 파티션 테이블 스페이스 이름 변경
SQL> alter table range_emp rename partition range_p6 to range_p7;

* 파티션 테이블 스페이스 옮기기
SQL> alter table range_emp move partition range_p7 tablespace tbs7;

위 명령어들을 하나씩 실행시키면서 object를 확인해보면 어떻게 변경이 되는지 이해하실겁니다.



※참고 url

----------------------------------------------------------------------------------
아래 사항은 너무 오래전에 했던거라 다시한번 해봐야 될것같아 확실히 말을 못하겠습니다.
예전 제가 요약한건데..이해를 못한다는..ㅋㅋㅋㅋ

*partition table의 물리적인 속성 변경하기.
alter table part_tbl storage(next 10M); : part_tbl의 모든 partition의 next 값이 변경된다.
alter table part_tbl modify partition part_tbl_200805 storage (maxextents 1000);
: part_tbl_200805 partition의 maxextents 값만 변경한다.

*파티션 상태 확인
select index_name,partiton_name,high_value,status,tablespace_name
from user_ind_partitions;

* partition index rebuild
alter index 인덱스이름 rebuild partition 파티션 이름;

*global index rebuild 하기
alter index 인데스이름 rebuild;

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

number(p,s) : precision, scale ora-01438  (0) 2009.12.10
Oracle Default DB 내 맘대로 바꾸기.  (0) 2009.11.19
Partition Table(1) - Create  (0) 2009.06.17
Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
반응형
파티션 테이블에는 여러가지가 있습니다.
그 중 가장 대표적으로 쓰이는 range partition 과 hash partition에 대해서 요약 정리를 하려고 합니다.

<Tablespace 생성>

일단 Partition Table을 생성하기 위해서 Tablespace를 3개만 생성하겠습니다.
SQL> create tablespace tbs1
  2  datafile 'D:\oracle\product\PROD\Disk5\tbs1.dbf' size 10m
  3* autoextend on maxsize 20m;
테이블스페이스가 생성되었습니다.
SQL> create tablespace tbs2
  2  datafile 'D:\oracle\product\PROD\Disk5\tbs2.dbf' size 10m
  3* autoextend on maxsize 20m;
테이블스페이스가 생성되었습니다.
SQL> create tablespace tbs3
  2  datafile 'D:\oracle\product\PROD\Disk5\tbs3.dbf' size 10m
  3* autoextend on maxsize 20m;
테이블스페이스가 생성되었습니다.

Range와 Hash partition 동일에 동일한 데이터를 insert를 하겠습니다.

--partition_insert.sql (hash partition에 insert시 테이블명을 수정해주세요.)
insert into range_emp(empno,ename,job,hiredate,sal)
                     values(999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal)                    
                     values(1000,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(1500,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal)  
                     values(1999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(2000,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(2001,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(2999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                     values(3000,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                    values(1999,'Ultra','SALESMAN',sysdate,3000);
insert into range_emp(empno,ename,job,hiredate,sal) 
                    values(3999,'Ultra','SALESMAN',sysdate,3000);

1. Range Partition
    특정 컬럼을 기준(ex. 날짜기준)으로 삼아 데이터를 해당 테이블 스페이스로 분산을 시켜주고,
    이로인해 데이터를 관리가 용이해지지만, 기준 컬럼에 의해 데이터들이 불균형 분포되어있거나,
    특정 기준값을 삭제한다면 테이블스페이스의 공간관리가 불균형해지고 관리가 힘들어집니다.

<Range Partition Table 만들기>

SQL> create table range_emp
  2  (empno number(4)
  3  ,ename varchar2(30)
  4  ,job varchar2(9)
  5  ,mgr number(4)
  6  ,hiredate date
  7  ,sal number(7,2)
  8  ,comm number(7,2)
  9  ,deptno number(2))
 10  partition by range(empno)
 11  (partition range_p1 values less than(2000) tablespace tbs1     --> 2000미만인 값들
 12  ,partition range_p2 values less than(3000) tablespace tbs2     --> 3000미만인 값들
 13* ,partition range_p3 values less than(4000) tablespace tbs3);  --> 4000미만인 값들
테이블이 생성되었습니다.
SQL>@partition_insert.sql

다른 값들은 볼 필요 없고 empno 를 기준으로 partition table을 만들었으니 이 값만 확인해도 되겠죠!

SQL> select empno from range_emp partition(range_p1);
     EMPNO
----------
       999
      1000
      1500
      1999
      1999
SQL> select empno from range_emp partition(range_p2);
     EMPNO
----------
      2000
      2001
      2999
SQL> select empno from range_emp partition(range_p3);
     EMPNO
----------
      3000
      3999

위와 같이 데이터가 들어간 것을 확인 할 수 있습니다.
데이터가 불균형하게 들어간 것을 볼 수 있습니다. 
테이블 스페이스의 space 관리가 잘못되고 있다는 것입니다.

2. Hash Partition

데이터 관리보다는 성능향상의 목적이 있습니다.
각각 다른 파티션에 데이터를 고르게 분산시킬수가 있습니다.
파티션 테이블 생성시에 반드시 파티션의 개수를 명시해야합니다.(데이터 분산을 위해서)
파티션의 수는 2의 거듭 제곱 수 (즉, 2,4,6,8,16,....)로 설정하는 것이 가장 이상적입니다.
저는 테이블 스페이스를 3개만 만들었으니 3개로만 하겠습니다.

<Hash Partition Table 만들기>

SQL> create table hash_emp
  2  (empno number(4)
  3  ,ename varchar2(30)
  4  ,job varchar2(9)
  5  ,mgr number(4)
  6  ,hiredate date
  7  ,sal number(7,2)
  8  ,comm number(7,2)
  9  ,deptno number(2))
 10  partition by hash(empno)   --자동으로 partition 이름을 만들어준다.
 11  partitions 3
 12* store in (tbs1, tbs2, tbs3);

or

SQL> create table hash_emp2
  2  (empno number(4)
  3  ,ename varchar2(30)
  4  ,job varchar2(9)
  5  ,mgr number(4)
  6  ,hiredate date
  7  ,sal number(7,2)
  8  ,comm number(7,2)
  9  ,deptno number(2))
 10  partition by hash(empno)     --파티션 이름을 수동으로 지정해 주고 싶을때.
 11  (partition hash_p1 tablespace tbs1
 12  ,partition hash_p2 tablespace tbs2
 13* ,partition hash_p3 tablespace tbs3)
테이블이 생성되었습니다.
SQL> @partition_insert.sql

SQL> select empno from hash_emp2 partition (hash_p1);
     EMPNO
----------
      1000
      1999
      1999

SQL> select empno from hash_emp2 partition (hash_p2);
     EMPNO
----------
       999
      2000
      2999
      3000
      3999

SQL> select empno from hash_emp2 partition (hash_p3);
     EMPNO
----------
      1500
      2001

데이터가 불규칙하게 각 테이블스페이스에 저장되어있는것을 확인해 볼 수 있습니다.
다음에는 파티션 테이블의 추가,삭제등 기본적인 관리 방법에 대해서 요약 하도록 하겠습니다.
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Oracle Default DB 내 맘대로 바꾸기.  (0) 2009.11.19
Partition Table(2) - Management  (0) 2009.06.17
Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
Rollup & Cube & Grouping 차이  (0) 2008.05.16
반응형

Row Migration(행마이그레이션)이란 하나의 레코드는 하나의 블록안에 들어가야하는데 
update가 발생하여 레코드값이 커지면서 블록안에 남은 여유공간이 없어 그 레코드가 다른 블록으로 옮겨지게 되는 현상입니다.

 

행 마이그레이션을 방지하기 위해서 블록에 여유공간을 남겨 놓는데 이것을 PCTFREE 라 합니다.

PCTFREE의 필요성을 한번 테스트 해봅시다.

 

먼저 2개의 테이블 생성.

create table aaa
(a number
,b varchar2(20)
,c date default sysdate)
tablespace users
pctfree 0
pctused 30
storage (freelists 2);

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

aaa 테이블에 대해 2만건 데이터 insert.

begin
for z in 1..20000 loop
insert into aaa values (z,'abcdef',default);
end loop;
end;/ 후 commit;

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

aaa 테이블의 통계정보를 수집.

anaylze table aaa compute statistics;

 create table bbb
(a number
,b varchar2(20)
,c date default sysdate)
tablespace users
pctfree 20
pctused 30
storage (freelists 2);

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

bbb 테이블에 대해 2만건 데이터 insert.

begin
for z in 1..20000 loop
insert into bbb values (z,'abcdef',default);
end loop;
end;/  후 commit;

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

aaa 테이블의 통계정보를 수집.

anaylze table aaa compute statistics;

 

cf.

PCTUSED : 블록에 있던 데이터가 삭제가 되었을 때 어느 정도의 공간이 남게 된다면 그 블록은 다시 재사용이 가능한데 이것을 PCTUSED라고 하고 기준치를 퍼센트 단위로 설정하게 된다.

기준치를 높게 잡는다면 블록의 재사용률이 낮아질 것이고, 낮게 잡으면 행마이그레이션 일어날 확률이 높아질 것입니다.

 

SQL> select table_name, num_rows, chain_cnt, blocks from user_tables
  2  where table_name in ('AAA','BBB');

TABLE_NAME     NUM_ROWS  CHAIN_CNT     BLOCKS
-------------- -------------- ----------- -----------
AAA                             20000                0               65
BBB                             20000                0               80

 

현재 사용되어진 블록은 각각 65,80개가 사용되어지고 CHAIN_CNT를 확인하여보니 행마이그레이션은 일어나지 않았습니다.

여기서 각 테이블의 B 컬럼을 업데이트를 해보겠습니다.

 

SQL> update aaa set b='abcdefghijk';

20000 행이 갱신되었습니다.

SQL> update bbb set b='abcdefghijk';

20000 행이 갱신되었습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> analyze table aaa compute statistics;

테이블이 분석되었습니다.

SQL> analyze table bbb compute statistics;

테이블이 분석되었습니다.

SQL> select table_name, num_rows, chain_cnt, blocks from user_tables
  2  where table_name in ('AAA','BBB');

TABLE_NAME     NUM_ROWS  CHAIN_CNT     BLOCKS
-------------- -------------- ----------- -----------
AAA                             20000            5539             103
BBB                             20000                0               80

SQL>

BBB 테이블은 사용되어진 블록의 개수가 변하지 않고 그대로 80개의 블록이 사용되었지만, AAA 테이블은 사용되는 블록이 103개로 늘어나면서 행마이그레이션이 발생했다는 것을 알수있습니.  

결과적으로 PCTFREE 를 설정해줌으로써 큰 데이터 값으로 업데이트시에도 행마이그레이션이 발생하지 않았습니다.

행마이그레이션이 발생하지 않기 위해서는 PCTFREE, PCTUSED 에 대한 비율도 잘 맞춰주어서 블록의 빈 공간에 대해서도 효율적으로 관리를 해주어야 할 것 입니다.

이러한 번거로움 때문에 9i부터는 PCTUSED만 자동관리가 된다.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Partition Table(2) - Management  (0) 2009.06.17
Partition Table(1) - Create  (0) 2009.06.17
10g Archive Mode로 변경  (0) 2008.10.01
Rollup & Cube & Grouping 차이  (0) 2008.05.16
with grant option & with admin option 차이  (0) 2008.05.14
반응형

C:\> sqlplus "/as sysdba"

 

archive mode로 변경하기 전에 확인 해 봐야 할 것!!

 

SQL> archive log list

데이터베이스 로그 모드              아카이브 모드가 아님
자동 아카이브             사용 안함
아카이브 대상            USE_DB_RECOVERY_FILE_DEST
가장 오래된 온라인 로그 순서     32
현재 로그 순서           33

SQL>show parameter log_archive_max_processes; (활성화 되고 있는 archive process 확인)

NAME                                 TYPE               VALUE
--------------------------- --------------  -------
log_archive_max_processes  integer                      2

 

process를 늘려주고 싶을 때 : alter system set log_archive_max_processes=3;

저는 default 값으로 활성화 시키도록 하겠습니다.

 

이제 본격적으로 간단한 설정을 해보도록 하겠습니다.

 

archive file 저장 위치를 지정해준다.

SQL> alter system set log_archive_dest_1='location=c:\PROD\DISK1\Archive\arch01 reopen';

SQL> alter system set log_archive_dest_2='location=c:\PROD\DISK2\Archive\arch02 reopen';

 

cf.

mandatory 아카이브하는 작업이 성공적으로 완료되어야 온라인 리두 로그파일을 겹쳐 쓸 수있음

optional : 아카이브하는 작업이 성공적으로 완료되지 않은 경우에도 온라인 리두 로그 파일을

              재사용할 수 있음.

reopen : 키워드와 함께 숫자를 지정하면, 실패 후 지정된 시간(초)이 경과한 다음 다시 쓰기를 시도함.

             default = 300, ex) reopen=500 

 

REOPEN을 지정하지 않은 경우 선택 대상에서 발생한 오류는 기록된 다음 무시되고 더 이상 이 대상으로

리두 로그가 보내지지 않는다. 필수 대상에서 오류가 발생하면 아카이브가 성공적으로 수행될 때까지 온라인 리두 로그를 재사용할 수 없다.

 

저는 process를 2개를 활성화 하였기 때문에 경로를 2개를 지정해주었습니다. 

서로 다른 디스크에 저장을 시켜주어야 하지만 여건상 같은 디스크에 넣을수 밖에 없었네요.^^

show parameter log_archive_dest 를 보면 위치가 설정된 것을 확인해 보실수 있습니다.

 

* process를 여러개 지정해주는 이유

1. 대량의 트랙잭션 로드 작업 과 동시에 다른 작업들이 맞물려 wait가 발생되는 archive 이목현상을

    방지하기 위해서

2. archive log 파일을 다중화 하여 복구를 대비하기 위하여(archive file도 깨질수있기때문임.)

 

 

SQL> alter system set log_archive_format='ARC%T%S%R.ARC' scope=spfile;

※ 주의할 점은 9i까지는 %s만 넣어도 상관없었지만 10g부터는 %t%s%r이 반드시 들어가야한다.

    참고로 저는 %s%t 만 넣었다가 DB가 startup이 안되서 복구시키느냐구 고생을 좀 하였습니다.^^;;

    제가 경험한 에러 및 복구 방안은 Oracle Error Catalog에 추후 등록시키도록 하겠습니다.

 

SQL> shutdown immediate;

데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SQL> startup mount;

ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  285212672 bytes
Fixed Size                  1287016 bytes
Variable Size              92277912 bytes
Database Buffers          188743680 bytes
Redo Buffers                2904064 bytes
데이터베이스가 마운트되었습니다.

SQL> alter database archivelog;

데이타베이스가 변경되었습니다.

 

SQL> alter database open;

데이타베이스가 변경되었습니다.

 

이렇게 하면 archive로 설정이 되었습니다.

잘 되었는지 확인 해 봅시다.

 

SQL> archive log list  --처음에  확인했던 명령어이죠. 

데이터베이스 로그 모드              아카이브 모드
자동 아카이브             사용
아카이브 대상            C:\oraclexe\oradata\Archive\Arch2
가장 오래된 온라인 로그 순서     36
아카이브할 다음 로그   37
현재 로그 순서           37

 

SQL> alter system archive log current;

시스템이 변경되었습니다.

SQL>

 

Archive file이 저장되는 경로에 가서 파일이 생성되었는지 확인해 봅시다.

잘 생성되었다면 archive mode로 이상없이 변경 된 것입니다.

9i보다는 많이 간단해 진 것 같습니다.


또한 log_archive_start는 9i에서는 true로 설정을 해주어야했지만,

10g에서 obsolete parameter 입니다. 설정에 상관없이 true로 인식을 합니다.


--추가글(20100429)

만약 archive process를 2개로 가동시키다가 1개로 줄이고 싶다면 archive모드를 해제한후 다시 설정을 해야한다.

(지금까지 내가 알기로는 그렇다.)

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Partition Table(1) - Create  (0) 2009.06.17
Row Migration  (0) 2008.11.30
Rollup & Cube & Grouping 차이  (0) 2008.05.16
with grant option & with admin option 차이  (0) 2008.05.14
view에 사용되는 with check option  (0) 2006.10.20
반응형

Rollup 과 Cube는 9i 부터 생긴 함수 입니다.

Rollup 과 Cube는 8i 부터 생긴 함수 입니다.

그러므로 예전에 8i 때까지 사용하던 union과 비교를 해보시면 쉽게 이해 하실 수 있습니다.

 

8i와 9i의 쿼리문을 비교해보시면 쉽게 이해하실수 있을 거라 생각되어져 별다른 설명은 첨부하지 않았습니다. HR 계정에서 다음 쿼리문을 차근차근히 살펴보시고 실행을 한번 해보세요.

 

SQL> conn hr/hr

 

(1) Rollup

 

-Ver. 9i-

select department_id,job_id,avg(salary),count(*)
from employees
group by rollup(department_id,job_id)

 

----여기서 하나더 grouping 에 대해서도 함께 알아 보도록 하겠습니다.----

       (저도 확실하게 설명해 드릴수는 없지만 아는데까지만요^^;)

 

select department_id,job_id,count(*) cnt,avg(salary) avgsal,grouping(department_id) g1,grouping(job_id) g2
from employees
group by rollup(department_id,job_id)

 

다음과 같은 결과가 나올 것입니다.

DEPARTMENT_ID JOB_ID            CNT     AVGSAL         G1         G2
---------------- ---------- ---------- ---------- ------- -------
                     10 AD_ASST                1          4400          0          0
                     10                              1          4400          0          1
                                                      2          7000          1          1

G1 ,G2 컬럼의 0과 1의 숫자값은 그룹을 묶어 주었는지 여부를 판단할때 쓰입니다.

0은 그룹으로 묶어주었다

1은 그룹으로 묶어주지 않았다 를 의미합니다.

G1, G2의 값이 각각 0값인 데이터들을 보시면, 하나는 DEPARTMENT_ID 가 NULL이고, JOB_ID가 SA_REP 인것들을 그룹으로 묶어서 계산되어진거고, 아래를 또 보시면 DEPARTMET_ID가 10이고 JOB_ID가 AD_ASST인 것들을 그룹으로 묶어서 계산되어진거라 보시면 됩니다.

나머지 G1 이 0 이고 G2가 1인 것들은 DEPARTMENT_ID 값이 각각 NULL OR 10인 것들만 묶어서 계산되어졌다고 보시면 됩니다.

 

이해하셨을지 모르겠네요.ㅋㅋ^^;

 

-Ver. 8i -    8i 때는 어떻게 위 함수를 사용했는지 보시죠~

 

select department_id,job_id,avg(salary) avgsal,count(*) cnt

from employees
group by department_id,job_id
union
select department_id,to_char(null),avg(salary) avgsal,count(*) cnt
from employees
group by department_id
union
select to_number(null),to_char(null),avg(salary) avgsal,count(*) cnt
from employees

 

Tip. 참고로 실행 계획도 겸하여 보신다면 어떤 쿼리문이 효율적인지 금방 알수 있을 겁니다.

SQL> set autotrace on exp

아래와 같은 오류가 난다면 utlxplan.sql을 실행 시켜주세요!!

SP2-0613: PLAN_TABLE 포맷 또는 존재를 입증할 수 없습니다
SP2-0611: EXPLAIN 레포트를 사용 가능시 오류가 생겼습니다
SQL> @%oracle_home%\rdbms\admin\utlxplan.sql;

테이블이 생성되었습니다.

SQL> set autotrace on exp

 

(2) Cube

 

-Ver. 9i-

select department_id,job_id,count(*) cnt,avg(salary) avgsal

from employees
group by cube(department_id,job_id)

 

-Ver. 8i-

select department_id,job_id,count(*) cnt,avg(salary) avgsal
from employees
group by department_id,job_id
union
select department_id,to_char(null),count(*) cnt,avg(salary) avgsal
from employees
group by department_id
union
select to_number(null),job_id,count(*) cnt,avg(salary) avgsal
from employees
group by job_id
union
select to_number(null),to_char(null),count(*) cnt,avg(salary) avgsal
from employees

 

(3) Grouping set

 

-Ver. 9i-

select deptno, job, count(*) cnt, avg(sal) avgsal

from emp

group by grouping sets(deptno,job)

 

-Ver. 8i-

select deptno, null job, count(*) cnt, avg(sal) avgsal

from emp

group by deptno

union

select null, job, count(*) cnt, avg(sal) avgsal

from emp

group by job

 

(4) Quiz

 

마지막으로 문제 하나 내도록 하겠습니다.

제 친구가 회사에서 풀어보라고 했던 문제인데 풀어보라고 저에게 주더군요.

저도 나름대로 풀어보았습니다. 어거지로 풀긴 했지만요..ㅋㅋㅋ

 

문제] 아래 표를 보시면 원시 Table을 결과자료 처럼 나오게 하면 되는 겁니다.

         (어떤 쿼리문을 사용하시던 간에 나오기만 하면 되는거 아닌가요?^^ㅋㅋㅋㅋ)

        - 제가 한 쿼리문은 쪽지를 보내주시면 보내드리도록 하겠습니다.^^

           참고로 저는 rollup을 사용하였습니다.

 

- 원시 Table -                           - 결과자료 -

소관회계계정금액소관회계계정금액
1A1100합계  1200
1A1100
  1소관합계  600
1B1200 ->      1소관A1200
1B1200 B1400
2A1300   2소관합계  600
2A1300      2소관A1600

 

-- 원시 Table 만들기.

 

컬럼 이름은 아무거나 해도 될 듯 싶습니다.

 

create table test1
(no number(2)
,a varchar2(2)
,b number(2)
,c number(10))
tablespace users;

 

insert into test1 values(1,'A',1,100);
insert into test1 values(1,'A',1,100);
insert into test1 values(1,'B',1,200);
insert into test1 values(1,'B',1,200);
insert into test1 values(2,'A',1,300);
insert into test1 values(2,'A',1,300);

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
with grant option & with admin option 차이  (0) 2008.05.14
view에 사용되는 with check option  (0) 2006.10.20
오라클 아스키로 특수문자 업데이트  (0) 2006.10.16
반응형

with grant option 과 with admin option에 대해 테스트를 하기 전에 

쉽게 이해하실수 있도록 기본적인 셋팅을 하도록 하겠습니다.

 

C:\> sqlplus "/as sysdba"

 

1. 사용자 생성(USER_1, USER_2)

SQL> create user user_1 identified by user_1 default tablespace users;

사용자가 생성되었습니다.

SQL> create user user_2 identified by user_2 default tablespace users;

사용자가 생성되었습니다.

 

2. 접속 권한 및 간단한 권한 주기

SQL> grant create session, create table, create view to user_1;

권한이 부여되었습니다.

SQL> grant create session, create table to user_2;

권한이 부여되었습니다.

 

이제 with grant option 과 with admin option 을 알아보도록 하겠습니다.

 

(1) with grant option

 

기본적으로 scott 계정은 다들 가지고 계시니 scott 계정을 들어가보도록 하겠습니다.

SQL> conn scott/tiger

연결되었습니다.

 

scott이 user_1에게 emp 테이블을 select 할수 있는 권한을 with grant option을 써서 부여 하도록 합니다.

SQL> grant select on emp to user_1 with grant option;

권한이 부여되었습니다.

SQL> select * from user_tab_privs
  2  where table_name='EMP';

GRANTEE  OWNER     TABLE_NAME    GRANTOR         PRIVILEGE        GRA HIE
---------- ---------- --------------- --------------- --------------- ---- ---
USER_1     SCOTT      EMP                 SCOTT             SELECT            YES NO

 

 

scott에게 받은 권한을 똑같이 user_2에게 부여합니다.

SQL> conn user_1/user_1
연결되었습니다.
SQL> grant select on scott.emp to user_2 with grant option;

권한이 부여되었습니다.

SQL> select * from user_tab_privs
  2  where table_name='EMP';

GRANTEE    OWNER      TABLE_NAME GRANTOR          PRIVILEGE       GRA HIE
---------- ---------- --------------- --------------- --------------- ---- ---
USER_1     SCOTT      EMP                 SCOTT             SELECT            YES NO
USER_2     SCOTT      EMP                 USER_1            SELECT            YES NO

 

USER_TAB_PRIVS 테이블은 누구의 소유이며 권한자 및 권한을 부여 받은 자를 확인 할 수 있습니다.

 

이제 부여한 권한을 다시 회수 할 것입니다. 어떻게 회수가 되는지 확인해 보시길 바랍니다.

 

SQL> conn scott/tiger
연결되었습니다.
SQL> revoke select on emp from user_1;

권한이 취소되었습니다.

 

SQL> conn user_1/user_1;
연결되었습니다.
SQL> select * from user_tab_privs
  2  where table_name='EMP';

선택된 레코드가 없습니다.

 

SQL> conn user_2/user_2;
연결되었습니다.
SQL> select * from user_tab_privs
  2  where table_name='EMP';

선택된 레코드가 없습니다.

 

※ scott이 user_1의 권한 revoke 하였지만, user_1이 user_2에게 부여한 권한도 같이 회수가 되는 것을 볼 수 있습니다.

 

(2) with admin option

 

SQL> conn /as sysdba

연결되었습니다.

 

SQL> grant alter session to user_1 with admin option;

권한이 부여되었습니다.

 

SQL> select * from dba_sys_privs where grantee like 'USER%';

GRANTEE    PRIVILEGE             ADM
---------- -------------------  ---
USER_1     CREATE VIEW          NO
USER_1     CREATE TABLE        NO
USER_1     ALTER SESSION       YES
USER_1     CREATE SESSION    NO
USER_2     CREATE TABLE       NO
USER_2     CREATE SESSION   NO

6 개의 행이 선택되었습니다.

 

SQL> conn user_1/user_1
연결되었습니다.
SQL> grant alter session to user_2 with admin option;

권한이 부여되었습니다.

SQL> select * from user_sys_privs where username like 'USER%';

USERNAME                   PRIVILEGE            ADM
----------------------- ------------------ ---
USER_1                         CREATE VIEW       NO
USER_1                         CREATE TABLE     NO
USER_1                         ALTER SESSION    YES
USER_1                         CREATE SESSION  NO

 

SQL> conn user_2/user_2
연결되었습니다.
SQL> select * from user_sys_privs where username like 'USER%';

USERNAME                    PRIVILEGE            ADM
----------------------- ------------------ ---
USER_2                         CREATE TABLE     NO
USER_2                         ALTER SESSION    YES
USER_2                         CREATE SESSION  NO

SQL>

 

위 테이블을 보시면 ADM 컬럼에 YES로 나와있는 것을 볼수 있습니다.

 

이제 GRANT 권한을 회수한 것처럼 똑같이 해보겠습니다.

 

SQL> conn /as sysdba

SQL> revoke alter session from user_1;

권한이 취소되었습니다.

SQL> select * from dba_sys_privs where grantee like 'USER%';

GRANTEE    PRIVILEGE       ADM
---------- ---------------  ---
USER_1     CREATE VIEW     NO
USER_1     CREATE TABLE    NO
USER_1     CREATE SESSION  NO
USER_2     CREATE TABLE    NO
USER_2     ALTER SESSION   YES
USER_2     CREATE SESSION  NO

 

※ dba_sys_privs를 보시면 user_2의 권한은 그대로 남아있고 user_1의 권한 회수 된것을 볼수 있습니다.

 

결론을 내리자면 with grant option 은 revoke 시 다른사용자에게도 부여한 권한을 같이 회수하지만 with admin option은 특정 사용자의 권한만 회수가 되고 나머지 다른사용자에게 부여된 권한은 회수가 되지 않습니다.

 

사용된 테이블 : user_tab_privs

                    : dba_sys_privs

                    : user_sys_privs

 

내용은 길지만 차근차근 따라하신다면 그렇게 긴 내용은 아닙니다.

업무 중에 할려니 힘드네요..ㅋㅋㅋ

감사합니다.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
Rollup & Cube & Grouping 차이  (0) 2008.05.16
view에 사용되는 with check option  (0) 2006.10.20
오라클 아스키로 특수문자 업데이트  (0) 2006.10.16
반응형

view를 통해 insert 가 되는데 with check option 을 사용 여부에 따라 뷰의 조건에 해당하는

데이터만 삽입,삭제,수정 할 수 있다.

 

--예제를 보시면 훨씬 쉽게 이해 하실 수 있을 겁니다.

 

ex)  

create table testtable
(empno number(10) ,
deptno number(10),
name varchar2(20))

tablespace users;

 

insert into testtable values(10,20,'abc');

insert into testtable values(20,30,'ccc');

  이런식으로 대충 몇개 쭈-욱 데이터를 넣어요!

 

이제 view를 만들어봅시다.

 

1. with check option을 사용하지 않은 view

create view testview2
as
select * from testtable where empno in (10,20,30,40);

 

2. with check option을 사용한 view

create view testview
as
select * from testtable where empno in (10,20,30,40)

with check option;

 

※ with check option 이 어떤 기능을 하는지 여기서 알수 있을 것입니다.

view를 통해서 insert가 가능 합니다.

 

먼저 with check option 을 사용하지 않은 view 를 통해서 insert를 해봅시다.

 

insert into testview2 values(10,20,'view_com');

select 문을 실행시키면 데이터가 입력된 것을 확인 할 수 있습니다.

select * from testview2;

(이것은 view는 테이블이 아니기 때문에 testview에 입력된 것이 아니라 testtable에 입력된 것입니다.)

 

insert into testview2 values(80,90,'view_com2');

이것도 역시 테이블에서 확인해 보면 정상적으로 삽입 된 것을 볼 수 있다.

(view에 제약조건이 걸려 있기 때문에 view에는 나타나지 않고 testtable에는 나타난 것을 확인합니다.)

여기까지 정상적으로 모든것이 insert가 된 것을 확인 할수 있을 겁니다.

 

이제, with check option을 사용한 view 를 통해서 insert를 해봅시다.

위에서 insert한 값과 똑같이 넣어 보겠습니다.

insert into testview values(10,20,'view_com'); 아무 이상없이 실행 될것입니다.

 

하지만 

insert into testview values(80,90,'view_com2');

ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다.

이런 오류가 나오시는 것을 볼 수 있을 것입니다.

 

결론을 내리자면 with check option은

view를 만들 때 해당 제약조건 안에서만 삽입,삭제,수정이 가능하다는 것입니다.

 

위 예제는 view를 만들 때 empno가 10,20,30,40인 것들만 가져오는 것이였습니다.

그런데 with check option을 쓴 view에

empno에 80인 데이터를 넣을려고 하니 오류메세지가 나오는 것입니다.

 

알고보면 굉장히 간단하고 쉬운건데 너무 제가 장황하게 설명한 것 같습니다.

저도 이것에 대해 몰랐습니다. 인터넷에 찾아봐도 확실한 대답이 없었던 터라 책도 찾아보고

인터넷 자료도 수집하면서 몇 시간을 고생했답니다. 근데 너무 간단하죠!^^ㅎㅎㅎ

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
Rollup & Cube & Grouping 차이  (0) 2008.05.16
with grant option & with admin option 차이  (0) 2008.05.14
오라클 아스키로 특수문자 업데이트  (0) 2006.10.16
반응형
출처 pride FC | 효도르
원문 http://blog.naver.com/sungs6031/40026502455

UPDATE t SET A = REPLACE(A, CHR(9),'')
 WHERE A LIKE '%'||CHR(9)||'%';

 

CHR(44)     ,                   '||CHR(44)||'
CHR(39)     '
CHR(38)     &
CHR(9)      탭문자
CHR(13)     라인피드
CHR(10)     캐리지리턴

 

UNIX : CR
WIN : LF + CR

 

Ex) 웹브라우저에서 textarea에서 입력하였을때  '엔터' 찾기

      select * from table_name where 특정칼럼 like '%'||chr(13)||chr(10)||'%' ;
(출처 : 'sql 조회시 엔터키를 포함하고 있는 문자열을 어떻게 찾나요?' - 네이버 지식iN)

 

 

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

 

제 의견을 덧붙인다면...

 

레코드 값에 간혹 넣지도 않은 이상한 특수기호가 들어 있는 경우가 있을 것입니다.(ex. ♪)

저 8분음표 기호는 라인피드라고 하네요. 일일히 select 문을 쳐보면서 나온겁니다.

라인피드가 아직 정확하게 뭔지는 모르겠지만 어쨌든 찾았습니다.ㅎㅎㅎ

8분음표를 지우고 싶다면 update를 해주세요..

 

ex) update table_name set column_name = TRIM(chr(13) from column_name)

      where [조건문]

 

cf. TRIM은 없애주는 기능이라는 거 다 아시져!^^;; 하나의 문자만을 없애준다는게 단점!

     2개를 지우고 싶다면 update를 한 후 다시 한번 더 해주셔야 합니다.

반응형

'Oracle > Oracle Study' 카테고리의 다른 글

Row Migration  (0) 2008.11.30
10g Archive Mode로 변경  (0) 2008.10.01
Rollup & Cube & Grouping 차이  (0) 2008.05.16
with grant option & with admin option 차이  (0) 2008.05.14
view에 사용되는 with check option  (0) 2006.10.20

+ Recent posts