- 특수 문자 %를 검색시

SELECT *

FROM S_EMP

WHERE NAME LIKE '%@%%' ESCAPE '@'

ESCAPE 사용으로 @뒤에 오는 문자를 인식해  %도 검색할 수 있도록 한다.


Posted by 달콤한부자
,

오라클 / Oracle replace 함수로 문자열 치환하기

 

▣ 문법 및 사용 방법

 

사용법  REPLACE(string, search_string, replace_string)

 

string의 문자열 중 search_sting을 찾아 replace_string로 치환 합니다.

​고객 정보 테이블에 전화번호가 PHONE이라는 컬럼으로 저장이 되어있고, 그 포멧은 010-xxxx-yyyy 라고 가정을 하고 어떻게 사용을 하면 되는지 예를 들어보겠습니다.

 

 

 

1) SELECT시 사용 법 

→ 010xxxxyyyy의 포멧으로 데이터를 추출 해야 하는 경우

SELECT REPLACE(PHONE, '-', '') FROM 고객정보;

이렇게 '-' 문자열을 공백으로 치환 해주면 '-'가 제거된 010xxxxyyyy 형식의 전화번호를 리턴 받을 수 있습니다.

 

 

2) UPDATE시 사용 법

010xxxxyyyy의 포멧으로 PHONE2 컬럼에 저장을 해야하는 경우

UPDATE 고객정보 SET PHONE2 = REPLACE(PHONE, '-', '');

 

3) 값에 엔터값이 있을경우

REPLACE(REPLACE(string,CHR(13),''),CHR(10),'');

 

* 참고 Chr(13) 값과 Chr(10) 정의

Chr(13)동일한 줄의 첫번째 자리에 커서를 위치 시킵니다. 이것을 캐리지 리턴 이라고 합니다.

Chr(10)현재 커서가 위치한 곳에서 아래로 한줄 내리는 기능을 담당합니다. 이것을 라인피드 라고 합니다.

즉, 우리가 키보드의 엔터키를 치면 눈에는 다음줄 처음으로 이동하지만

내부적으로는 현재 줄의 첫번째 자리에 커서가 갔다가 다음줄로 내려서는 것입니다.

 

Posted by 달콤한부자
,

출처 : http://rdbms.tistory.com/entry/ORA-01017-Invalid-usernamepasswordlogon-denied


ora-01017 Invalid username/password;logon denied Error

위의 에러는 기본적으로는 보통 사용자 ID나 암호가 
일치하지 않을 때 발생합니다.


그러나 오라클 버전에 따라 상황은 달라질 수 있습니다.


왜냐하면 오라클 10g 까지는 대소문자를 구분하지 않았지만 11g 부터는 대소문자를 구분하기 때문인데요.


이로인해 정확하게 사용자 ID와 암호를 입력했는데도 불구하고 

ora-01017 Invalid username/password;logon denied Error 오류가
발생하는 경우가 있습니다. 

이때 오라클의 대소문자 구분을 없애는 설정으로 간단하게 해결할 수는 있으나 권장하는 방법은
아닙니다.

보안상 취약점이 될 수 있기 때문이죠..... 그래서 아래와 같은 방법으로 해결할 수 있습니다.


C:\>sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 화 2월 2 13:31:35 2010

Copyright (c) 1982, 2007, Oracle.  All rights

 reserved.


SQL> connect / as sysdba

연결되었습니다.


먼저 sysdba로 데이터베이스에 접속합니다.

그 다음 아래와 같은 문장을 입력합니다.

SQL> alter system set sec_case_sensitive_logon=false;


이 문장은 오라클 접속 시 패스워드에 대한 대소문자 구분 여부를 설정하는 것입니다.

만약 대소문자를 구분하고 싶다면 당연히 true로 설정하고 그렇지 않으면 false로 설정합니다.


다음 문장을 통해 현재 설정 값이 제대로 바꼈는지 확인해봅니다.


SQL> show parameter sec_case

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sec_case_sensitive_logon             boolean     FALSE



위와 같이 출력되었다면 정상적으로 설정이 완료되신 겁니다.

'ORACLE 관련' 카테고리의 다른 글

특수 문자를 검색시 LIKE ESCAPE 사용  (0) 2018.01.15
문자 치환 함수 replace 함수  (0) 2015.02.28
oracle import 에러...  (0) 2014.09.29
Posted by 달콤한부자
,

oracle import


**** import시 오류가 많다 *****

- export 한 db와 import 할 db의 캐릭터셋이 달라 임포트시 에러가 날 경우가 많다.

이럴때는 양쪽 db의 캐릭터셋을 확인해 봐야한다.

 

1. characterset 확인. sys 계정으로  sqlplus 접속

select * from sys.propS$ where name like 'NLS_CHARACTERSET';

2. 다를 경우 변경

update sys.props$ set value$='KO16WIN949' where name='NLS_CHARACTERSET';

 

**** 오라클이 다른버전일 경우 ****

- import 한 오라클이 9i 이고 export해야할 오라클이 10g 또는 11g 일경우

exp-00003 에러가 발생한다.

1. export 되야할 오라클10g 에서 오라클9i로 붙어 import dump 해야한다.

 

- 위의 경우처럼 오라클9i 로 붙어서 export 했는데 import 시 에러가 난다.

2. 적은 데이터의 경우는 exp 후 imp 되는지 확인

  큰 데이터가 안되는 경우는 테이블스페이스 용량이 부족하거나. 데이터양이 많을 경우 에러가 난다.

  오라클 9i의 에러라고 한다. 데이터를 나눠서 올리는게 마음편하다.



I. import 순서

1) 테이블스페이스 생성

CREATE TABLESPACE TS_FWCMS2 DATAFILE 'D:\oracle\product\10.2.0\oradata\orcl\TS_FWCMS2.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M DEFAULT STORAGE (INITIAL 4K NEXT 128K MINEXTENTS 1 PCTINCREASE 0);

--TS_FWCMS2 테이블스페이스를 생성한다.

-- REUSE 옵션은 파일을 재사용

CREATE TABLESPACE TS_FWCMS2 DATAFILE 'D:\oracle\product\10.2.0\oradata\orcl\TS_FWCMS2.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 100M DEFAULT STORAGE (INITIAL 4K NEXT 128K MINEXTENTS 1 PCTINCREASE 0);

2) 사용자생성(디펄트 테이블스페이스 지정)

CREATE USER FWCMS2 IDENTIFIED BY FWCMS2 DEFAULT TABLESPACE TS_FWCMS2;

-- 사용자 생성 ID/PW : FWCMS2/FWCMS2

-- default tablespace 지정

3) 사용자 에게 권한 부여

GRANT RESOURCE, CONNECT , EXP_FULL_DATABASE, IMP_FULL_DATABASE TO FWCMS2;

--FWCMS2 사용자에게 리소스, 연결, 백업/복구 권한을 부여

4) imp 실행

imp FWCMS2/FWCMS2 file='DnewProjectfwcms2db_backup\bk_20130610.dmp' fromuser=DNECVOTE2013 touser=FWCMS2 ignore=y

-- 백업 파일 지정하여 import 한다.

-- ignore=y 옵션으로 에러를 무시하면 기존테이블스페이스가 없으면 default tablespace로 간다.

II) 오류사항

1) 테이블스페이스 존재 오류

IMP-00003: ORACLE 오류 959() 발생했습니다.

ORA-00959: 테이블스페이스 'POLICE2012'() 존재하지 않습니다.

1. Table

alter table 테이블명 move tablespace 테이블스페이스명;

특정 테이블 스페이스에서 일괄적으로 뽑고 싶을때(user_segment로 조회해도됨)

select 'alter table ' ||table_name|| ' move tablespace 테이블스페이스명;' from user_tables
where table_name ='
테이블명'

and tablespace_name ='';

2. Partiton Table

alter table 테이블명 move partition 테이블스파티션명 tablespace테이블스페이스명;

일괄적으로 뽑을시...

select 'alter table ' || table_name || ' move partition '||partition_name || ' tablespace 테이블스페이스명;' from user_tab_partitions

3. Index

alter index 인덱스명 rebuild tablespace 테이블스페이스명;

일괄적으로 뽑고 싶을때

select 'alter index '||index_name ||' rebuild tablespace 테이블스페이스명;' from user_indexes

where table_name ='테이블명';

clob칼럼 인덱스 이동

SELECT * FROM user_indexes WHERE tablespace_name ='POLICE2012'; 검색한후..

alter table 테이블명 move lob ( clob칼럼명1,clob칼럼명2,clob칼럼명3) store as ( tablespace 옮겨갈테이블스페이스) ;

2) 문자셋에 오류

IMP-00019: ORACLE 12899 오류로 인하여 행이 거부되었습니다

IMP-00003: ORACLE 오류 12899() 발생했습니다.

ORA-12899: "FWCMS2"."COMTNMENUINFO"."PIC" 열에 대한 값이 너무 큼(실제: 114, 최대값: 100)

--> 9i에서 사용하는KO16MSWIN949, AL16UTF16 보다 사용되는 바이트가 더 많게 되어 변환하면서 데이터가 삽입될때에 필드사이즈보다 크게 변환되는 경우가 발생하기 때문이다.

10g 데이터베이스 서버에 9i 디비를 넣으려고 할때 기본 문자집합을 변경하여import 수행하는것도 방법이다. 물론 기본 문자집합을 변경하면 10g에서 사용하던 디비는 깨지게 된다. 10g에서 사용하던 디비와 새로 import 되는 디비가 동시에 사용되지 않는다면, 서로 다른 문자집합으로 디비에 저장해놓았다가 사용하려는 디비에 맞추어 문자집합을 설정하는것도 방법이 되겠다. 물론 개발테스트로 적합한 방법이지.. 운영서버에서는 삼가하는것이 좋겠다.

UTF8은 유니코드를 구현한Character Set 중에 가변결이 인코딩 방식을 택하고 있는 Character Set이다. 가변 길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시켜야 하다보니, 한 글자를표현하는데 필요한 바이트의 길이가 최대 3바이트(AL32UTF의 경우 6바이트)까지 늘어날 수 있다.

i). 9i 에서 사용되는 문자집합으로 변경하고 임포트 수행한다. 임포트한 후 서비스 재시작함.

UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_CHARACTERSET';

UPDATE SYS.PROPS$ SET VALUE$='AL16UTF16' WHERE NAME='NLS_NCHAR_CHARACTERSET';

ii). 10g의 문자집합으로 변경

UPDATE SYS.PROPS$ SET VALUE$='AL32UTF8' WHERE NAME='NLS_CHARACTERSET';

UPDATE SYS.PROPS$ SET VALUE$='AL16UTF16' WHERE NAME='NLS_NCHAR_CHARACTERSET';

아래는 테스트 해 봐야함...

From User A to user B [동일 디비내에서 다른 유저로 이관 ]

Import 되어지는 유저의Default Tablespace 상관없이 Export 되어질때의

Tablespace Import 된다.

FROMUSER=USER_A(USER_A_TS) TOUSER=USER_B(USER_B_TS)

환경에서Import 진행 하면, USER_A_TS IMPORT 되어진다.

1. USER_A User Level Export 진행

2.

2.1USER_B USER_A_TS, USER_B_TS QUOTA 체크

USER_A_TS - QUOTA "0" 으로

SELECT * FROM DBA_TS_QUOTAS where username = 'USER_B';

ALTER USER USER_B QUOTA 0 ON TABLESPACE USER_A_TS;

2.2 RESOUCE ROLE 있다면 REVOKE UNLIMITED TABLESPACE 하라.

SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE='USER_B';

REVOKE UNLIMITED TABLESPACE from USER_B ;

3. USER_A_TS 에 대해서 더이상 권한이 없음을 확인 하라

CREATE TABLE JUNK (A NUMBER) TABLESPACE <USER_A_TS>;

4. Import 수행

5. 권한 원복 수행

ALTER USER <userB> QUOTA nn ON TABLESPACE <USER_A_TS>;

!! 테스트 하진 않았지만,

요점은 원래의 Tablespace 가 있어야 한다는 것으로 보여진다.

있지만, 권한이 없다면 USER_B 의 Default Tablespace 로 Import 되어질것으로

예상된다.

위의 것도 안될 경우... (이걸로 해결하는 것도 좋음....양이 적을경우)

해당 오류나는 테이블과 필드를 늘려준 후 exp 받아 imp를 실행한다.

ALTER TABLE COMTNMENUINFO MODIFY PIC VARCHAR2(256);

ALTER TABLE TB_FOREIGNADMIN MODIFY EMAIL VARCHAR2(256);


Posted by 달콤한부자
,