'DB/Oracle'에 해당되는 글 10건

  1. 2018.04.26 ojdbc와 jdk 버전
  2. 2016.08.17 like in 해보자. regexp_like
  3. 2016.07.20 모르는 테이블 조회
  4. 2015.08.05 DB에서 컬럼 순서 랜덤하게 가져오기
  5. 2014.05.21 오라클 포트 설정하기
  6. 2013.07.29 한글 - 알파벳 - 숫자 순으로 정렬
  7. 2013.01.17 D-DAY 계산
  8. 2012.09.18 연속되는 숫자 만들기
  9. 2011.11.11 오라클 ORA-01476 에러
  10. 2011.05.23 한글 초성 검색

ojdbc와 jdk 버전

DB/Oracle 2018.04.26 10:49

 이번에 보안 이슈로 인해 마이그레이션 이슈가 생겨 spring을 3.x에서 4.x로  전환 테스트하다보니 문제가 발생했다. DB쪽에서 계속 오류가 발생하는데 처음에는 관련 라이브러리도 버전을 변경하다보니 발생하는 문제라 생각했는데, mybatis 버전을 아무리 바꿔도 안되고, 연동방식을 아무리 바꾸어도 안되는 것이다...

 안되겠다 싶어 jdbctemplate으로 바꾸었는데도 안된다... 모두 동일한 오류가 발생했다.

20:05:13.240 [http-nio-80-exec-2] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d8269a0] was not registered for synchronization because synchronization is not active

20:05:13.297 [http-nio-80-exec-2] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource

java.lang.NoClassDefFoundError: Could not initialize class core.log.conf.reloadable.ReloadableConfiguration


 검색을 아무리 해봐도 내용을 알수가 없어서... 혹시나하고 jdbctemplate은 그대로 두고 ojdbc6.jar를 ojdbc7.jar로 바꿔보니 에러코드가 바뀌었다. 일단 쿼리까지 읽어내는 것이다. 좀 더 테스트해봐야하지만, 오라클 홈페이지에서 jdk7,jdk8 지원한다는 ojdbc6.jar을 다운받아서 사용했는데, 이게 뭔가 다른 문제인듯 하다.


 지금 테스트 환경은 다음과 같다.

  • Oracle Database 11g Release 11.2.0.3
  • JDK 1.8
  • Spring 4.3.15
  • Tomcat8.0


그래서 검색방법을 바꾸어서 11g에서 사용가능한 ojdbc를 찾아보았다.

참고: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#01_02


위 링크에서 보면 다음과 같이 정리가 되어있다.

Which version of JDBC drivers support which version of Oracle database?

Please refer to the table below for the Oracle database versions supported by JDBC drivers.  Best Practice that we recommend is, JDBC driver version should always be either same as or higher than the Oracle database version being used in order to leverage the latest capabilities of the JDBC driver. 

Interoperability MatrixDatabase 12.2.0.1Database 12.1.0.xDatabase 11.2.0.x
JDBC 12.2.0.1
Yes
Yes
Yes
JDBC 12.1.0.x
Yes
Yes
Yes
JDBC 11.2.0.x
Yes
Yes
Yes



이걸로 보면 jdbc 12.2.0.1도 11.2.0.3에서 사용할 수 있어보인다. jdk 지원 정보를 보면 다음과 같다.

What are the Oracle JDBC releases versus JDK versions? 

The Oracle JDBC driver is always compliant to the latest JDK version in each of the new releases. In some versions, JDBC drivers support multiple JDK versions.  Use the table below  to choose the correct JDBC driver based on your preferred JDK version.   
 
Oracle Database version
JDBC Jar files specific to the release
12.2 or 12cR2ojdbc8.jar with JDK 8
12.1 or 12cR1ojdbc7.jar with JDK 7 and JDK 8
ojdbc6.jar with JDK 6
11.2 or 11gR2ojdbc6.jar with JDK 6, JDK 7, and JDK 8 
(Note: JDK7 and JDK8 are supported in 11.2.0.3 and 11.2.0.4 only)
ojdbc5.jar with JDK 5



What are the Oracle JDBC releases versus JDBC specifications? 

The table lists the Oracle JDBC drivers and the JDBC specification supported in that release. 
 

Oracle Database version
JDBC specification compliance
12.2 or 12cR2JDBC 4.2 in ojdbc8.jar
12.1 or 12cR1JDBC 4.1 in ojdbc7.jar 
JDBC 4.0 in ojdbc6.jar
11.2 or 11gR2JDBC 4.0 in ojdbc6.jar
JDBC 3.0 in ojdbc5.jar


ojdbc6가 jdk8을 지원한다는데 저걸 다운받아 사용해봤는데, 안된다... 검색하다보면 된다는 사람도 있어서 좀 당황스러운데... 된다고 공유하는 패키지도 나는 안되는 걸 보면 뭔가 다른 이유가 있을지도....



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

ojdbc와 jdk 버전  (0) 2018.04.26
like in 해보자. regexp_like  (0) 2016.08.17
모르는 테이블 조회  (0) 2016.07.20
DB에서 컬럼 순서 랜덤하게 가져오기  (0) 2015.08.05
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
Trackbacks 0 : Comments 0

like in 해보자. regexp_like

DB/Oracle 2016.08.17 11:56

mybatis를 하다가 검색을 만들어야 할 일이 생겨서 like를 쓰는데, 갑자기 여러개를 검색할 수 있게 해달라는 요구가 들어왔다. 거의 다 만들었는데... 그래서 수정을 적게 하기 위해 like를 여러개 쓰다보니 한 번에 검색할 수 있을거 같아서 검색해 보니 나와 동일한 사람이 있었다. 자세히 설명은 달아 주지 않았지만 검색으로 보니 오라클에서 정규식으로 검색하는 방법이 있었다. 사용할 일이 없어서 몰랐...


regexp_like는 정규식으로 검색하는 함수인데, like in 과 같은 검색도 가능하다.

select *

from table

where regexp_like(column, '검색어1|검색어2')


검색어를 계속 추가하면 되겠으나 자료가 많은 테이블을 조회해보지 못해서 조금 아쉽다. row가 180인 테이블에서 해보니 느리지는 않았다. 당연하려나... 


regexp_like는 정규식 검색이기 때문에 다양한 방식의 검색이 가능하다.


 [a-z] 

 소문자 알파벳 포함

 [A-Z]

 대문자 알파벳 포함

 [0-9]

 숫자 포함

 [a-z]{3}

 3글자로 연속된 소문자 알파벳 포함

 [A-Z][0-9]

 대문자, 숫자로 연속된 알파벳 포함

 [A-Z]?[0-9]

 대문자와 숫자 사이에 공백이 있을 수 있음

 [A-Z]*[0-9]

 대문자와 숫자 사이에 공백이 있을 수 있음

 ^[A-Z]

 대문자로 시작되는 문자열

 [A-Z]$

 대문자로 끝나는 문자열


뭐 자바랑 비슷하네...

활용도를 좀 더 생각해봐야겠다.


출처:

http://lee-mandu.tistory.com/48


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

ojdbc와 jdk 버전  (0) 2018.04.26
like in 해보자. regexp_like  (0) 2016.08.17
모르는 테이블 조회  (0) 2016.07.20
DB에서 컬럼 순서 랜덤하게 가져오기  (0) 2015.08.05
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
Trackbacks 0 : Comments 0

모르는 테이블 조회

DB/Oracle 2016.07.20 13:59

필요한 정보가 있는지 찾기 위해 다른 서버의 DB를 들어가서 검색해보니 나오는 정보가 없다.

그래서 조회하는 방법을 적어본다. oracle SQL Developer나 토드같은 툴을 이용할 수 있는 상황이라면 이런 번거로움은 필요없겠지만, 툴을 이용한 접근을 막아버린 곳이 많아서 SQL Plus로 작업 중에 생각한 방법이다.


먼저 table 목록은 다음 쿼리로 알 수 있다.

select table_name from all_tables;


그런데 이런저런 테이블이 많다. 특히 $가 들어간 테이블이 많이 있다. $가 들어간 테이블명은 보통 시스템과 관련된 테이블이어서 정리가 필요하다. 그래서 시스템 테이블같은 테이블을 제외해보자.

select distinct tablespace_name from all_tables;


쿼리를 실행해보면 SYSAUX, SYSTEM이 있고 다른건 잘 모르겠다. 그래서 일딴 두개를 제외해보기로 했다.

select table_name from all_tables where tablespace_name not in('SYSAUX','SYSTEM') order by table_name;


테이블 갯수가 많이 줄어들었다. 그런데 아직도 전혀 짐작할 수 없는 테이블이 있다. 하지만 처음 목적보다는 많이 줄어들었다. 이제 특정 테이블을 조회하고 싶어진다. 그런데 SQL Plus라는 놈은 컬럼이 많으면 조회가 힘들다. 그래서 먼저 컬럼명을 확인해보고 싶으니 다음 쿼리를 이용해보자.

select column_name from all_tab_columns where table_name = 'TABLE';


*를 이용하여 조회하면 다른 정보들도 볼 수 있으니 필요하다면 다른 정보도 확인해보자. 예를들어 컬럼의 data type, nullable, data length 등이 있다. 이건 번거로울 수 있으니 좀 더 간단한 방법을 적어본다.

describe TABLE;


그런데 데이터를 많이 조회하면 SQL Plus 특성상 가독성이 떨어진다. 그래서 화면에 보이는 컬럼의 폭을 정할 수 있다.

column        DATA_TYPE        format a10;


a10이란 부분이 크기이니 저 값을 수정해보면서 가독성이 좋아지게 변경하면서 해보자.


툴에 적응하면서 생각지도 못했는데, 강제로 SQL Plus를 다시 쓰게 되니, 예전에는 어떻게 작업했는지 모르겠다. 분명 전에는 사용했었는데.... 좀 더 편한 방법이 생기면 좋겠다.

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

ojdbc와 jdk 버전  (0) 2018.04.26
like in 해보자. regexp_like  (0) 2016.08.17
모르는 테이블 조회  (0) 2016.07.20
DB에서 컬럼 순서 랜덤하게 가져오기  (0) 2015.08.05
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
Trackbacks 0 : Comments 0

DB에서 컬럼 순서 랜덤하게 가져오기

DB/Oracle 2015.08.05 14:50

일을 하다가 컬럼 순서를 랜덤하게 가져와야할 필요가 있어서 찾아보았다. DBMS_RANDOM을 이용하여 난수를 발생하여 가져올 수 있다. 방법은 몇가지 있다.

SELECT DBMS_RANDOM.VALUE(1, 1000) AS RND FROM DUAL;


 위 쿼리는 1~1000 사이의 값을 가져오는데, 소숫점의 숫자도 포함되어 있다. 정수만 가져오려면 소숫점을 없애주면 된다.

SELECT CEIL(DBMS_RANDOM.VALUE(1, 1000)) AS RND FROM DUAL

CONNECT BY LEVEL <= 10;


10개는 난수를 가져올 것이다. 한가지 방법이 더 있다. 다음은 정수형 난수를 발생기키는 쿼리이다. 음수부터 양수까지 나온다.

SELECT DBMS_RANDOM.RANDOM AS RND FROM DUAL

CONNECT BY LEVEL <= 10;


이 쿼리를 약간 수정해서 위에 쿼리와 같은 기능으로 만들어보자

SELECT MOD(ABS(DBMS_RANDOM.RANDOM), 1000)+1 AS RND FROM DUAL

CONNECT BY LEVEL <= 10;


ABS를 이용해 양수만 가져온 후에, MOD로 나머지 연산을 하면 되겠다. 여기까지는 프로그래머라면 쉽게 구할 것이다.


그런데, 쿼리를 조금 복잡하게 짜다보니 버그인지 모르겠지만 문제가 발생했다. 실제로 사용하는 테이블에 RND를 컬럼으로 추가해서 RND 기준으로 정렬하고 SELECT로 몇번 감쌌더니 COUNT(*)에서 0으로 출력된다. *로 보면 데이터가 나온다. 조금 검색해봤으나 사례를 찾지 못하여 시간 관계상 문제가 생길 것같아 다른 방법을 찾아보았다.

SELECT LEVEL FROM DUAL

ORDER BY DBMS_RANDOM.RANDOM();


위와 같이 하면 컬럼 순서가 계속 바뀌는 것을 볼 수 있다.


- 출처 -

http://www.gurubee.net/lecture/1400

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

like in 해보자. regexp_like  (0) 2016.08.17
모르는 테이블 조회  (0) 2016.07.20
DB에서 컬럼 순서 랜덤하게 가져오기  (0) 2015.08.05
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
tags : db, oracle, 정렬
Trackbacks 0 : Comments 0

오라클 포트 설정하기

DB/Oracle 2014.05.21 18:21

간만에 테스트를 위해 오라클을 설치해서 외부 컴퓨터에서 접근을 해보았다.

한가지 문제가 관리상의 문제로 기본 포트인 1521 포트를 사용할 수 없었다.

게다가 인터넷에서 검색하니 부족한 정보가 넘쳐나서 삽질을 해게됬다... 제발 님들아...


오라클 11g를 설치했기 때문에 다를 수도 있겠다. 하지만 난 안됬으니 패스...


하는 수 없이 처음부터 차근차근 해보기 위해 설정프로그램을 보던중에 net manager라는 관리 툴에서 설정을 할 수 있는 것을 알게됬다. 적용되는 시간이 약간 늦어서 처음에는 안되는 줄 알았는데 잘 된다. 오라클을 설치하면 오라클 메뉴에서 [구성 및 관리 툴 > Net Manager] 실행하면 별다른 어려움 없이 설정이 가능하다. 설정파일을 직접 수정하는 방법도 인터넷에 많이 소개되고 있지만, 툴을 이용하여 설정하는 것이 편하다. 


Net Configuration Assistant 라는 툴에서도 설정할 수 있으나... 뭔가 이상하다. 이걸 사용하면 여태까지 설정했던 내용이 사라지는 효과를 볼 것이다. 오라클을 구성한 PC에서 데이터를 넘길 수가 없어서 자세한 스샷은 남기기 어렵지만 툴 사용법이 어렵지 않아서 쉽게 할 수 있을 거라 생각된다.


오라클 DB 접속을 위해 방화벽에서 포트만 열어주면 이제 바뀐 포트로 접근이 가능할 것이다.


사용했던 명령어를 몇개 보자면,


1. 리스너멈춤

lsnrctl stop


2. 리스너 시작

lsnrctl start

처음에 잘 안되는 이유를 모르다가 리스너를 멈추고 다시 시작시키면 오류가 나왔다. 오라클을 원초적인 텍스트 편집을 이용하다가 설정을 잘못한 것이였다. 잘못 설정했다면 다시 시작하려고 했을 때, 시작이 안된다.


3. 직접수정

$ sqlplus / as sysdba

SQL> ALTER SYSTEM SET LOCAL_LISTENER = "(ADDRESS=(PROTOCOL=TCP)(HOST=DB서버호스트네임 or ip)(PORT=1523))";

SQL> ALTER SYSTEM REGISTER;

이게 효과가 있는지는 모르겠다. 하다가 안되면 한번 해보자.


4. 오라클 쿼리로 변경

SQL>SELECT dbms_xdb.gethttpport() FROM dual;

                       → 현재 포트 번호를 검색함


SQL>SELECT dbms_xdb.sethttpport(1521);

                       → PL/SQL 처리가 정상적으로 완료되었습니다.

 

SQL>SELECT dbms_xdb.gethttpport() FROM dual;

                       → 다시 확인 (변경된 1521 포트가 검색되면 굳)


SQL>COMMIT;

이건 안된다.... 이것만하고서 열심히 삽질했다.


내가 사용해본 주요 명령어들이다. 리스너 멈춤,시작 명령어가 제일 효과적이였다. 설정오류를 저걸로 찾았으니까... 컴이 조금 느린 탓도 있지만, 이것저것 삽질하다보니 3시간 걸렸다. 앞으론 이러지 말자.

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

모르는 테이블 조회  (0) 2016.07.20
DB에서 컬럼 순서 랜덤하게 가져오기  (0) 2015.08.05
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
연속되는 숫자 만들기  (0) 2012.09.18
Trackbacks 0 : Comments 0

한글 - 알파벳 - 숫자 순으로 정렬

DB/Oracle 2013.07.29 18:43

 기본적으로 Order By를 이용하여 정렬하면 특수문자와 숫자 영문자가 섞이고 마지막으로 한글이 나온다.

하지만 요구사항에 따라 한글 - 알파벳 - 숫자 처럼 출력 순서를 바꿔야하는 경우가 있다.

간단하게 Order By Desc를 사용하면 좋으나 전부 역순으로 정렬되므로 요구사항에 맞지 않다.


 처음 떠오른 것은 UNION ALL을 이용해서 3번 SELECT 하는 것이 었으나, 마음에 들지 않는다. 두번째로 생각난 것은 CASE WHEN을 이용해 컬럼을 만들어 정렬하는 것이다. SELECT한 DATA로 결과를 만들고 정렬을 하기 때문에 속도면에서도 나쁘지 않다고 생각된다. 그래서 이것을 기준으로 필요한 것을 찾아보니 이미 해본 사람들이 있었다. ASCII() 오라클 함수를 이용한 구분인데 문자열이 들어가도 첫문자의 아스키값을 10진수로 보여준다. 이 기능을 이용하여 한글인 경우를 보면 45217 이상의 수가 나온다. 한글인 경우 범위가 상당히 모호한데, 인터넷의 내용과 다르게 범위가 정확히 몇인지 확인되지 않았다. 테스트를 해보니 그 이상의 값도 나왔기 때문이다. 한글의 시작은 'ㄱ'이고 끝은 '힣'이라 생각했으나 '힝'으로 나와있어 테스트를 해보니 '힏'이 더 크게 나오기도 했다. 엑셀 문서에서 한글문자를보니 마지막이 '힣'이였는데... 정확한 판단이 안서고 조사를 해봐야하나 항상 시간이 문제다. 그래서 결국 45217  넘으면 한글로 판단했다. 일본어의 히라가나는 4만번대였으나... 구조적인 문제로 구별할 방법이 없다. 


그래서 결국 다음과 같은 쿼리가 나온다


WITH TEST AS(

  SELECT '6666' AS NAME FROM DUAL UNION ALL

  SELECT '512' AS NAME FROM DUAL UNION ALL

  SELECT '0' AS NAME FROM DUAL UNION ALL

  SELECT '가나' AS NAME FROM DUAL UNION ALL

  SELECT 'A' AS NAME FROM DUAL UNION ALL

  SELECT 'B' AS NAME FROM DUAL UNION ALL

  SELECT 'a' AS NAME FROM DUAL UNION ALL

  SELECT 'C' AS NAME FROM DUAL UNION ALL

  SELECT '  C' AS NAME FROM DUAL UNION ALL

  SELECT 'd' AS NAME FROM DUAL UNION ALL

  SELECT '나' AS NAME FROM DUAL

)

SELECT NAME,

CASE WHEN ASCII(UPPER(NAME)) > 45217 THEN '1' -- 한글

WHEN ASCII(UPPER(NAME)) BETWEEN '65'  AND '90' THEN '2' -- 알파벳

WHEN ASCII(UPPER(NAME)) BETWEEN '48'  AND '57'  THEN '3' -- 숫자

ELSE '4' -- 기타

END AS SORT_CODE

FROM TEST

ORDER BY SORT_CODE ASC, NAME ASC


정렬을 해보면 한가지 문제를 더 발견할 수 있다. 알파벳 대문자와 소문자는 정렬이 따로 된다.

그래서 한가지 더 추가했다.


WITH TEST AS(

  SELECT '6666' AS NAME FROM DUAL UNION ALL

  SELECT '512' AS NAME FROM DUAL UNION ALL

  SELECT '0' AS NAME FROM DUAL UNION ALL

  SELECT '가나' AS NAME FROM DUAL UNION ALL

  SELECT 'A' AS NAME FROM DUAL UNION ALL

  SELECT 'B' AS NAME FROM DUAL UNION ALL

  SELECT 'a' AS NAME FROM DUAL UNION ALL

  SELECT 'C' AS NAME FROM DUAL UNION ALL

  SELECT '  C' AS NAME FROM DUAL UNION ALL

  SELECT 'd' AS NAME FROM DUAL UNION ALL

  SELECT '나' AS NAME FROM DUAL

)

SELECT NAME,

CASE WHEN ASCII(UPPER(NAME)) > 45217 THEN '1' -- 한글

WHEN ASCII(UPPER(NAME)) BETWEEN '65'  AND '90' THEN '2' -- 알파벳

WHEN ASCII(UPPER(NAME)) BETWEEN '48'  AND '57'  THEN '3' -- 숫자

ELSE '4' -- 기타

END AS SORT_CODE

FROM TEST

ORDER BY SORT_CODE ASC, UPPER(NAME) ASC


이정도면 1차 목표는 달성했다. 구지 한가지 더 문제라면 특수문자 처리인데, 이것도 방법이 없다. 처음부터 특수문자는 고려대상이 아니였기때문이다. 예로 '  C' 는 맨마지막으로 내려온다. 기타로 분류하는 수 밖에....



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

DB에서 컬럼 순서 랜덤하게 가져오기  (0) 2015.08.05
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
연속되는 숫자 만들기  (0) 2012.09.18
오라클 ORA-01476 에러  (0) 2011.11.11
Trackbacks 0 : Comments 0

D-DAY 계산

DB/Oracle 2013.01.17 15:19

쿼리로 D_DAY계산을 해보았다.

SELECT 

    CASE  

        WHEN D_DAY < 0 THEN 0

        ELSE    D_DAY

     END AS D_DAY

FROM(

    SELECT TRUNC(TO_DATE('20130201', 'yyyymmdd') - SYSDATE, 0) AS D_DAY

    FROM DUAL

)


만들기는 했으나, 쿼리로 해야하나? 하는 생각이 든다. 

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

오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
연속되는 숫자 만들기  (0) 2012.09.18
오라클 ORA-01476 에러  (0) 2011.11.11
한글 초성 검색  (0) 2011.05.23
Trackbacks 0 : Comments 0

연속되는 숫자 만들기

DB/Oracle 2012.09.18 14:43

쿼리를 만들다가 일정 기간동안 데이터를 가져올 일이 생겼다.

그러다가 우현이 LEVEL에 대해 알게 됬다. 참 쓰임새가 다양한 것이 되겠다.

LEVEL로 먼저 필요한 기간을 구한다. 본인은 오늘로 부터 50일 전까지 날짜를 구한다. 오늘 날짜 제외

SELECT TO_NUMBER(TO_CHAR(SYSDATE - LEVEL,'YYYYMMDD')) USE_DAY

FROM DUAL

START WITH LEVEL = 1

CONNECT BY LEVEL <= 50


이제 기간의 최소,최대를 구한다. 이정도면 다들 응용가능하실거 같다.
SELECT TO_DATE(MIN(USE_DAY),'YYYYMMDD') S_DAY, TO_DATE(MAX(USE_DAY),'YYYYMMDD') E_DAY
FROM (
    SELECT TO_NUMBER(TO_CHAR(SYSDATE - LEVEL,'YYYYMMDD')) USE_DAY
    FROM DUAL
    START WITH LEVEL = 1
    CONNECT BY LEVEL <= 50
)

왜 이런 이상한 방법을 쓰는지 본인에게 다시 되물어보지만, 여러가지 해결 방법중 하나이다.
DB에서 특정 기간동안의 데이터를 가져오는데 사용하지만 현재 용도는 그게 아니다.;;
좀더 복잡한 이유가 있지만 중요한 기능이 이거다.

새삼스럽게 느끼지만, 시작은 단순하지만 끝은 언제나 복잡하다....


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

오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
연속되는 숫자 만들기  (0) 2012.09.18
오라클 ORA-01476 에러  (0) 2011.11.11
한글 초성 검색  (0) 2011.05.23
Trackbacks 0 : Comments 0

오라클 ORA-01476 에러

DB/Oracle 2011.11.11 12:21
ORA-01476: >제수가 0 입니다 라는 메시지가 나면서 쿼리가 안돌아가는 경우가 있다. 이것은 0으로 나눗셈할 경우에 나오는 문제인데 인터넷에 보면 여러가지 해결책이 나와있다.

SELECT N/M 

FROM (

    SELECT '10' AS N, '0' AS M

    FROM DUAL

);

이건 문제의 나눗셈이다. 

SELECT N / DECODE(M, NULL, 1, 0, 1, M) 

FROM (

    SELECT '10' AS N, '0' AS M

    FROM DUAL

);

인터넷에 있는 DECODE를 이용한 해결법을 보자. 

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

오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
연속되는 숫자 만들기  (0) 2012.09.18
오라클 ORA-01476 에러  (0) 2011.11.11
한글 초성 검색  (0) 2011.05.23
Trackbacks 0 : Comments 0

한글 초성 검색

DB/Oracle 2011.05.23 14:30
초성검색을 찾아보았다.

select *

from event

where substr(title,1,1) >= '가' and substr(title,1,1) < '나'

where substr(title,1,1) >= '하'


찾아보면서 전에 몰랐던 사실을 한가지 알았다.
오라클의 substr 은 시작이 1이었다. 0인줄 알았고 0으로 사용하는 사람들도 많을 것이다.
0과 1의 결과가 같게 나오길래 궁금해서 오라클클럽 사이트에서 확인한 결과 0은 1과 같은 취급을 한다.
저렇게 검색하면 ㄱ이 모음인 문자가 검색된다.
UTF-8과 EUC-KR은 검색방법이 다르다는데 찾기가 어렵다.
검색방법의 요점은 연결된 코드를 찾아서 확인하는 것이기 때문에 둘다 비슷한 방법으로 검색하면 된다.


<!-- 초성검색 리스트 -->

<select id="getUserListInitial" parameterClass="map" >

  SELECT *

FROM (

 SELECT  ROWNUM RNUM, A.*

 FROM ( SELECT /*+$hint$*/

      USID,     

    US_NM,     

    OFCPS_SE,   

    OFCPS_NM,     

    T1.DEPT_CODE,

    WORK   ,

                                office_number, 

                                hp_number

  FROM TB_SP_USER_INFO T1 


  WHERE 1=1


           <isEqual property="initialCharSearch" compareValue="true">

                <![CDATA[AND $initialCharSlct$ REGEXP_LIKE( T1.US_NM,  '^[$initialChar$]')]]>

            </isEqual>

 )A

 WHERE ROWNUM  &lt; = #rownum#

)

WHERE  RNUM &gt; = #rnum#  

</select>

정규표현을 써서 하는 방법이 있으나 10g부터 지원되는 REGEXP_LIKE를 사용해야 하므로 테스트하지 못했다.
링크를 참고하면 될것이다.

참고로 여러종류의 문자코드는 여기를 참고하자.

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

오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17
연속되는 숫자 만들기  (0) 2012.09.18
오라클 ORA-01476 에러  (0) 2011.11.11
한글 초성 검색  (0) 2011.05.23
Trackbacks 0 : Comments 0