Database/Oracle2013. 9. 3. 10:25

http://radiocom.kunsan.ac.kr/lecture/r_up.html

Posted by 아로나
Database/Oracle2013. 8. 11. 18:33

 

 

  • 데이타를 업데이트한 경우
  • 데이타를 삭제한 경우



이럴 때 이전 내용이 필요 하다면


as of timestamp 를 이용한다. 



select * from tbl_dsm_301 
as of timestamp(systimestamp-interval '30' minute) -- 30분 이전 데이터를 보여준다. 
where rcp_no ='20101207000243'

 




 

select * from tbl_dsm_301 
as of timestamp(systimestamp-interval '5' hour) -- 5시간 이전 데이터를 보여준다. 
where rcp_no ='20101207000243'

 

 

덧,

-- 10분전과 지금과 다른 데이터만을 보여준다.

select * from tbl_dsm_301 
as of timestamp(systimestamp-interval '10' minute)  
where rcp_no ='20101207000243'

minus

select * from tbl_dsm_301 
where

 

출처 : http://angmang.tistory.com/33



Posted by 아로나
Database/Oracle2013. 8. 11. 18:28

* 일반적으로 오라클에서 공백제거시에 trim이나 replace를 사용하곤 하는데 이러한 함수들을 이용해도

공백이 제거 되지 않는 경우가 있다. 물론 육안상으로는 구분이 불가능하다.

 

아래와 같은 테이블과 데이터가 있다.

select *

from test1;

-- 결과

  ID      NAME
test1   candy
test2   candy

분명 육안상으로는 test1 과 test2가 동일한 NAME인 "candy"를 가지고 있는데,

아래와 같은 결과가 나온다.

1. select *

from test1

where name = 'candy';

 

-- 결과

   ID   NAME
test1 candy

==> test2는 조회되지 않는다.

 

2. select id, name, length(name)

from test1;

 

-- 결과

ID         NAME     LENGTH(NAME)
test1     candy          5
test2     candy          6

==> 육안상으로는 분명이 동일하게 보이지만 length가 다르게 나온다.

 

왜 1번 , 2번 과 같은 결과가 나오는 것일까.

결론적으로는 확인해보니 육안상으로는 확인이 불가능한 공백문자가 들어가 있었다.

 

chr(0)  <--- 이놈이 포함되어 문제가 발생했던 것이다.

 

따라서 이놈을 replace 해주면 문제가 간단히 해결된다.

 

* 처리 후 select

1. select *
from test1
where replace(name, chr(0), '') = 'candy';

 

-- 결과

  ID      NAME
test1   candy
test2   candy

 

2. select id, name, length(replace(name, chr(0), ''))
from test1;

 

-- 결과

ID         NAME     LENGTH(NAME)
test1     candy          5
test2     candy          5


 

trim으로 제거 되지 않는 공백이 분명있음에도 구글 혹은 네이버에서 검색되는 자료가 없어서 올린다~

참고들 하세요~

 

 

 

Posted by 아로나
Database/Oracle2013. 7. 25. 10:12
시스템내에서 암호화 하는 과정에서 제목과 같은 오류가 발생했다.

client 에서 해석하지 못하는 문자라는 의미다..
Server : 오라클이 설치된 컴퓨터
Client : 토드나 오렌지 등의 툴

즉.. server 에서는 해석을 했는데. client 에서는 해석을 못했다??
-> Server 와 Client  의 케릭터 set이 틀리다는 의미다.

 SELECT * FROM SYS.PROPS$ WHERE name='NLS_CHARACTERSET';
 위의 query 로 서버측의 character set 을 조회 해보자.
 
NAME                         VALUE$    COMMENT$
NLS_CHARACTERSET AL32UTF8     Character set 

 내가 사용 하는 DB 서버는 AL32UTF8을 쓴다. 

그럼 Client 의 character set 을 보자

실행 창에서 regedit(레지스트리 편집기) 을 치고 NLS_LANG 로 검색(Ctrl + f) 해보자.
보통의 경우  KOREAN_KOREA.KO16MSWIN949 로 되어 있을 것이다.
 

결국 server 랑 client 랑 nls_lang 이 틀리므로 발생한 문제다.

인제 선택이다..
서버의 lang을 바꿀것인가? client 의 lang을 바꿀것인가?

이미 운영 중인 DB 라면 무조껀 client 의 lang을 바꾸어야 한다.
위에 Server에 보면 AL32UTF8 이 되어 있다..
따라서 client 의 reg 값을 AMERICAN_AMERICA.AL32UTF8 로 바꾸어 주면 정상적으로 작동한다.


만약 Server를 바꾸고자 한다면(운영 중이지않거나 위험성이 적은 경우) 
UPDATE PROPS$ SET VALUE$='KO16KSC5601' WHERE NAME='NLS_CHARACTERSET'
이렇게 Query 를 실행하면 된다. 만, 별로 추천 하지는 않음...

 

출처 : http://interwater.tistory.com/89

 

Posted by 아로나
Database/Oracle2013. 6. 13. 18:02

중복로우들 중에서 특정 값만 추출하기

 

* TEST1 테이블에서 NAME(이름)이 중복되는 데이터들 중에서 REG_DTTM(등록일)이 가장

최근인 데이터만 빼고 나머지 추출하기

 

 

==> 중복된 데이터들 중에서 최신데이터만 남기도 나머지 데이터들을 삭제하거나 정리할 때 유용하다.

 

 

SELECT *
FROM TEST1 C
WHERE 1=1
AND EXISTS (
            SELECT 1
            FROM (
                    SELECT A.NAME, COUNT(*)
                    FROM TEST1 A
                    WHERE 1=1
                    GROUP BY A.NAME
                    HAVING COUNT(*) > 1
                   ) D
             WHERE C.NAME = D.NAME
            )
AND C.ROWID != (          
            SELECT B.ROWID  --이 쿼리의 결과가 2개이상인 경우 ROWNUM = 1 조건 추가
            FROM TEST1 B
            WHERE 1=1
            AND B.NAME = C.NAME
            AND B.REG_DTTM = (SELECT MAX(C.REG_DTTM)
                              FROM TEST1 C
                              WHERE C.NAME = B.NAME
                              )
               );

Posted by 아로나
Database/Oracle2013. 5. 29. 15:03

* 기본적으로 from절이 실제로 없는 경우에 발생하기도 하지만 from 이전 구문들이 정상적이지 않은 경우에도 해당 에러가 발생하기도 한다. 자세한 내용은 아래 참조

 

ORA-00923


Error Message

ORA-00923: FROM keyword not found where expected

Cause of Error

You tried to execute an SQL SELECT statement, and you either missed or misplaced the FROM keyword.

Resolution

The option(s) to resolve this Oracle error are:

Option #1

This error can occur when executing a SELECT statement.
For example, if you tried to execute the following SELECT statement:
SELECT *
suppliers;

-> 실제로 from 절이 위와 같이 없는 경우에도 ora-00923 에러 발생함. 

You could correct this SELECT statement by including the FROM keyword as follows:
SELECT *
FROM suppliers;

Option #2

This error can also occur if you use an alias, but do not include the alias in double quotation marks.
For example, if you tried to execute the following SQL statement:
SELECT owner as 'owner column'
FROM all_tables;

--> 기본적으로 오라클에서의 alias는 더블쿼테이션( " ) 을 사용해야 한다. 정상적인 구문은 아래 내용 참조 

You could correct this SELECT statement by using double quotation marks around the alias.
SELECT owner as "owner column"
FROM all_tables;

 

출처 : http://spotyourerror.blogspot.kr/2013/05/ora-00923.html

Posted by 아로나
Database/Oracle2013. 4. 25. 12:42

http://www.epost.go.kr/search/zipcode/newAddressDown.jsp

위 주소로 들어가면 자세한 내역을 열람할 수 있다.

Posted by 아로나
Database/Oracle2013. 4. 25. 11:53
 

자바스크립트에서 줄 바꿈이 된 문자를 변수로 가져오는대 에러가 발생 했다.
개행문자가 들어있으면 Javascript의 eval이 되지 않는다고 한다.
한두개두 아니고 일일이 바꾸자니 양이 많고
컬럼이 여러개여서 자바에서 변환하자니 반복문을 남발해야되서 쿼리에서 변경을 해봤다.

캐리지 리턴 : CR

chr(10)
동일한 줄의 첫번재 자리에 커서를 위치시키는 기능

라인 피드 : Line Feed

chr(13)
현재 커서가 위치한 곳에서 아래로 한 줄 내리는 기능

예)
select replace(replace('문자 또는 컬럼명',chr(10),'변경 문자'),chr(13),'변경 문자') from dual;

 

--개행문자가 포함되어 있는지 조회
SELECT CUSNO, CUSNM, POSINM, posi, JOBNM, CUSTYP, EMAIL
FROM TEST
WHERE EMAIL != replace(replace(EMAIL, chr(10), ''),chr(13),'');

 

--EMAIL 컬럼 개행문자 제거

update  TEST set email = replace(replace(EMAIL, chr(10), ''),chr(13),'');

 

 

출처 : http://aith.tistory.com/18

Posted by 아로나
Database/Oracle2013. 4. 9. 09:59

Oracle 10g에서는 REGEXP_로 시작하는 함수를 지원합니다. 레귤러 익스프레션 지원이죠. 아래는 그 함수들의 사용방법을 공유합니다.

1. REGEXP_INSTR 함수
- 문법 : REGEXP_INSTR(소스 문자열, Pattern [, 검색 시작 위치 [, 발생 횟수 [, 반환 옵션 [, Match를 시도할 때의 옵션]]]])
- 예제

1
2
3
4
5
6
SELECT REGEXP_INSTR('Regular Expression', 'a') REG_INS
FROM dual;
 
   REG_INS
----------
         6



2. REGEXP_LIKE
- 문법 : REGEXP_LIKE(소스 문자열, Pattern [, Match를 시도할 때의 옵션])
- [[:digit:]] : 숫자인것
- [^[:digit:]] : 숫자가 아닌것
- [[:alpha:]]
- 필듯가 숫자와 문자가 같이 있을 경우 잘 판단해야 함
- 예제

1
2
3
4
5
6
7
8
9
10
SELECT SSN                            
FROM   TEST                           
WHERE  SSN > ' '                      
AND    REGEXP_LIKE(SSN, '[^[:digit:]]');
 
SSN
-------------
******2229149
******2228659
******2223591



3. REGEXP_REPLACE
- REGEXP_REPLACE(소스 문자열, Pattern [, 바꿀 문자열 [, 위치 [, 발생횟수 [Match 파라미터]]]])
- 예제

1
2
3
4
5
6
7
8
9
SELECT REGEXP_REPLACE(SSN, '[0-9]', '*' , 7) REG_REP
FROM(                                               
          SELECT '7901061842210' SSN                
          FROM dual                                 
);   
 
REG_REP
-------------
790106*******



4. REGEXP_SUBSTR
- REGEXP_SUBSTR(소스 문자열, Pattern [, 위치 [, 발생 횟수 [, Match를 시도할 때의 옵션]]])
- 예제

1
2
3
4
5
6
7
8
9
SELECT REGEXP_SUBSTR(EMAIL, '[^@]+') REG_SUB
FROM(                                      
         SELECT 'pepsi@paran.com' EMAIL    
         FROM dual                         
); 
 
REG_S
-----
pepsi


위 내용 출처 : http://happybuk.tistory.com/50


# 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
    - TOPIC 컬럼에 한글이 1~10개 사이인 것을 조회
    - 옵션
    $ = {}$ 과 사용시에 절대값인듯...?
*/
 
SELECT BULLETIN_SEQ
        , TOPIC
        , CREATE_ID
    FROM BULLETIN
    WHERE REGEXP_LIKE(TOPIC, '^[가-힝]{1,10}$')
    ORDER BY 1
;
 
/*
    한글 문자인 것만 조회
*/ 
SELECT BULLETIN_SEQ
        , TOPIC
        , CREATE_ID
    FROM BULLETIN
    WHERE REGEXP_LIKE(TOPIC, '^[가-힝]')
    ORDER BY 1
;
 
/*
    # TOPIC 컬럼에 영어 대소문자가 3~10개 사이 또는 한글이 2~3개 사이인 것을 조회
*/ 
SELECT BULLETIN_SEQ
        , TOPIC
        , CREATE_ID
    FROM BULLETIN
    WHERE REGEXP_LIKE(TOPIC, '^[a-zA-Z]{3,10}|[가-힝]{2,3}$')
;   
 
SELECT pw
  FROM t
 WHERE REGEXP_LIKE(pw, '[a-z]') -- 소문자 포함 여부
   AND REGEXP_LIKE(pw, '[A-Z]') -- 대문자 포함 여부
   AND REGEXP_LIKE(pw, '[0-9]') -- 숫자 포함 여부
   AND REGEXP_LIKE(pw, '[[:punct:]]') -- 특수문자 포함 여부
   AND LENGTH(pw) >= 8 -- 8자리 이상
;
 
 
/*
    # 컬럼 check 제약 조건
*/
-- 10자 이하의 한글만 입력 받고자 할때.
ALTER TABLE BULLETIN
       ADD CONSTRAINT BULLETIN_USER_NAME_KO_CHK
       CHECK (REGEXP_LIKE(USER_NAME_KO, '^[가-힝]{1,10}$'))
;

출처 : http://develop.sunshiny.kr/840

Posted by 아로나
Database/Oracle2013. 3. 25. 17:29

1. select *

from dual;

 

DB 날짜형식 확인
select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT'

DB 날짜형식 수정
alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

--COMMIT;

(commit을 해야 바로 반영이 된다. 조심할 것)

 

 

select *

from daul;

(바뀐 형식 확인)

Posted by 아로나