Query 작성 중 다 외우기는 힘들어 (외우긴 했으나 사용법이...) 검색해야 할 때가 있어 정리합니다.

 

LOWER( column|expression ) 

괄호 안의 텍스트를 소문자로 전환합니다.

LOWER('ABCDEFG') --> abcdefg : 

 

UPPER( column|expression ) 

괄호 안의 텍스트를 대문자로 전환합니다.

UPPER('aabbCC') --> AABBCC

 

INITCAP( column|expression ) 

문자열의 첫 글자를 대문자로 전환 후 이후 텍스트는 소문자로 전환합니다. 
INITCAP('hello') --> Hello

 

CONCAT( column1|expression1 ,column2|expression2 ) 

문자열을 연결(붙여)준다. || 와 같은 효과를 함수로 사용할 때 사용한다.
CONCAT('AA','BBccc')  --> AABBcc

 

SUBSTR(column|expression, m [,n])   

substring 이랑 비슷한 기능을 수행한다. 차이첨은  m 번째부터 n 번째까지 인덱스 값으로 n 값이 m에 상대적이라는 것이 차이점이다.

시작 인덱스가 음수인경우 뒤에서부터 인덱스를 계산한다.
SUBSTR('A1B2C3',1,3) --> A1B

 

LENGTH( column|expression ) 

문자열의 길이를 리턴한다. 

LENGTH('ABCDEF') --> 6 : 

 

INSTR( column|expression, str) 

indexof와 동일한 기능을 제공한다. 즉, 문자열에 해당하는 문자가 있는지 확인하여 해당 문자의 인덱스를 리턴한다.

INSTR('AARCCC','R') --> 3 : 문자열에 'R'의 인덱스(몇 번째 위치)를 리턴한다. 

 

LPAD( column|expression,n,str ) : n 은 전체 길이  , str 대체 문자

주어진 문자열에 대해서 n 에대한 자릿수만큼 str의 문자(or 숫자)를 왼쪽에 체워 넣습니다. 
LPAD('ABC',10,'0') --> 0000000ABC

 

RPAD( column|expression,n,str ) : n 은 전체 길이  , str 대체 문자

주어진 문자열에 대해서 n 에 대한 자릿수만큼 str의 문자(or 숫자)를 오른쪽에 채워 넣습니다. 

RPAD('ABC',10,'0') --> ABC0000000

 

LTRIM( column|expression, str) 

문자열의 왼쪽 공백(여백) 문자를 제거한다. 또한 LTRIM은 왼쪽 반복적인 문자(str)나, 특정 문자열을 제거할 수 있다 제거할 문자가 동일하다면 옵션의 문자 개수는 무관하다

LTRIM('      test_Text') --> 'test_Text

 

RTRIM(column|expression)

문자열의 오른쪽 공백(여백)문자를 제거한다. 또한  오른쪽의 반복적인 문자를 제거할 수 있다. 제거할 문자가 동일하다면 옵션의 문자 개수는 무관하다

LTRIM('test_Text          ') --> 'test_Text

 

TRIM(leading/tailing/both, trim_character FROM target_source ) 

기본적으로 TRIM 함수는 문자열의 공백(스페이스바)을 제거합니다. (양쪽 모두). 문자와 문자 사이의 공백은 제거하지 못합니다. 

TRIM('     NEW ITEM     ') --> 'NEW ITEM'

 

특정 문자를 제거하는 목적으로 사용할 경우에는 아래와 같이 사용할 수 있다.
TRIM( 'S' FROM 'SSMITH') --> MITH 

 

REPLACE(source_text, target_str, conv_str)

source text에서 target_str에 해당하는 문자(or문자열)를 conv_str로 대체합니다.

REPLACE('last King', 'last', 'NEW') --> NEW King

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

TNSPING 이용한 접속 테스트  (0) 2021.02.16
Index Rebuild  (0) 2020.10.05
Oracle 함수 정리  (0) 2020.03.16
ORA-28001: the password has expired  (0) 2018.07.18
TNS/ORA-12631 : 이름 검색에 실패(Username retrieval failed)  (0) 2018.05.10

Oracle 함수는 크게 단일행 함수와 복수행 함수로 구분할 수 있다.

 

단일행 함수 복수형 함수
하나의 행 당 하나의 결과 값을 반환 하는 함수 여러 개의 행 당 하나의 결과값을 반환 하는 함수
문자함수 COUNT
숫자함수 SUM
날짜함수 MIN / MAX
변환함수 AVG

Oracle에는 많은 함수가 존재한다. 함수는 Query가 쉬워지고 응용프로그램의 코딩을 줄여줄 수 있다

따라서 함수는 많이 알고 있으면 좋다.

 

가끔 쓰이는 몇가지 함수를 알아보도록 한다.

 

NVL2 (Column, Express1, Express2)

해당 컬럼이 NULL이면 express-1의 값을, NULL이 아니면 express-2의 값을 리턴해 줍니다. 

 

NULLIF (Express1, Express2)
Express-1과 express-2의 값을 비교하여 그 값이 같으면 NULL을 리턴 하고 다르면 express-1의 값을 리턴해 줍니다.

 

COALESCE(Express1, , , , ExpressN)
Express-1이 NULL이 아니면 express-1을 리턴하고, NULL이면 express-2 를, express-1과 express-2 모두 NULL이면 express-n을 리턴해 줍니다.

 

TRIM ( LEADING [문자열] FROM col1 ) ;

LEADING은 왼쪽 문자열을 절삭 시켜 줍니다.

TRIM ( TRAILING [문자열] FROM col1 ) ;

 TRAILING은 오른쪽 문자열을 절삭 시켜 줍니다. 

TRIM ( BOTH [문자열] FROM col1 ) ;

BOTH는 양쪽 문자열을 동시에 절삭 시켜 줍니다.

 

SELECT 그룹함수([DISTINCT]/all]),
{column [Alias],...}
FROM 테이블명
[WHERE Query 조건(들)]
[GROUP BY 컬럼1, 컬럼2, …n]
[HAVING Group-Conditiona]
[ORDER BY 컬럼1, 컬럼2, …..[ASC/DESC]];

GROUP BY : 결과값을 지정한 컬럼을 기준으로 그룹화
HAVING : GROUP BY에 의한 결과에 대한 조건 절
ORDER BY : 결과값을 분류(Sorting)할 때

 

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

Index Rebuild  (0) 2020.10.05
자주쓰는 함수 정리 - 문자열 함수  (0) 2020.04.03
ORA-28001: the password has expired  (0) 2018.07.18
TNS/ORA-12631 : 이름 검색에 실패(Username retrieval failed)  (0) 2018.05.10
Oracle Clinent Download  (0) 2018.01.30

Oracle 설치 후 계정을 생성한 뒤 시스템을 사용하는데 갑자기 시스템 로그인이 안될 때가 있다

시스템 로그에 ORA-28001: the password has expired 가 있다면 쉽게 해결 할 수 있다.



아래 Query를 이용하여 프로필 정보를 확인하면 

SELECT * FROM DBA_PROFILES WHERE PROFILE = 'DEFAULT'  


아래와 같이 붉은 글자 항목이 180으로 설정되어있을 것이다. 

PROFILERESOURCE_NAMERESOURCE_TYPELIMIT
DEFAULTCOMPOSITE_LIMITKERNELUNLIMITED
DEFAULTSESSIONS_PER_USERKERNELUNLIMITED
DEFAULTCPU_PER_SESSIONKERNELUNLIMITED
DEFAULTCPU_PER_CALLKERNELUNLIMITED
DEFAULTLOGICAL_READS_PER_SESSIONKERNELUNLIMITED
DEFAULTLOGICAL_READS_PER_CALLKERNELUNLIMITED
DEFAULTIDLE_TIMEKERNELUNLIMITED
DEFAULTCONNECT_TIMEKERNELUNLIMITED
DEFAULTPRIVATE_SGAKERNELUNLIMITED
DEFAULTFAILED_LOGIN_ATTEMPTSPASSWORD10
DEFAULTPASSWORD_LIFE_TIMEPASSWORD180
DEFAULTPASSWORD_REUSE_TIMEPASSWORDUNLIMITED
DEFAULTPASSWORD_REUSE_MAXPASSWORDUNLIMITED
DEFAULTPASSWORD_VERIFY_FUNCTIONPASSWORDNULL
DEFAULTPASSWORD_LOCK_TIMEPASSWORD1
DEFAULTPASSWORD_GRACE_TIMEPASSWORD7



이 값을 UNLIMITED로 변경해주면 해결이 가능하다.


alter profile default limit password_life_time unlimited; 


 

ORA-12631 : 이름 검색에 실패

TNS-12631 Username retrieval failed

 

어느 날 갑자기 혹은 PC를 교체하여 똑같은 환경을 구성했음에도... 위와 같은 오류가 발생하는 경우에는 아래와 같이 조치하면 해결할 수 있습니다. 

 

 

sqlnet.ora 파일을 찾아서 내용을 보면 아래와 같습니다. 

 

# sqlnet.ora Network Configuration File: C:\app\myosuser\product\11.2.0\client_1\network\admin\sqlnet.ora

# Generated by Oracle configuration tools.

 

# This file is actually generated by netca. But if customers choose to 

# install "Software Only", this file wont exist and without the native 

# authentication, they will not be able to connect to the database on NT.

 

SQLNET.AUTHENTICATION_SERVICES= (NTS)

 

 

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 

 

 

해당 파일의 내용중 

SQLNET.AUTHENTICATION_SERVICES= (NTS)

 

윗부분을 주석처리 하고 아래와 같이 변경합니다.

 

#SQLNET.AUTHENTICATION_SERVICES= (NTS)

 SQLNET.AUTHENTICATION_SERVICES= (NONE)

 

 

# sqlnet.ora Network Configuration File: C:\app\myosuser\product\11.2.0\client_1\network\admin\sqlnet.ora

# Generated by Oracle configuration tools.

 

# This file is actually generated by netca. But if customers choose to 

# install "Software Only", this file wont exist and without the native 

# authentication, they will not be able to connect to the database on NT.

 

#SQLNET.AUTHENTICATION_SERVICES= (NTS)

SQLNET.AUTHENTICATION_SERVICES= (NONE)

 

 

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 

 

 


www.oracle.com 에 접속을 한뒤 아래 그림과 같이 메뉴를 따라가서 다운로드 페이지까지 이동합니다.




아래와 같은 페이지가 나오면 아래 붉은색 박스를 클릭하여 상세 화면으로 이동합니다. 





아래 라이센스 동의를 Accept를 선택하시고 붉은색 박스를 선택하면 로그인 과정을 거친후 다운로드 받을 수 있습니다. 


Tablespace 확장 요청이 발생할 때마다 찾기가 귀찮아서 포스트를 작성합니다. 

 

 

# 테이블 스페이스 용량별로 조회하기 (단위 : BYTE)

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
SELECT A.TABLESPACE_NAME AS "테이블스페이스명"
       ,A.FILE_NAME  AS "파일경로 AS "
       ,(A.BYTES - B.FREE)  AS "사용공간"
       ,B.FREE  AS "잔여 공간"
       ,A.BYTES  AS "전체 크기"
       ,TO_CHAR((B.FREE / A.BYTES * 100), '999.99'|| '%'  AS "잔여공간"
  FROM (SELECT FILE_ID
              ,TABLESPACE_NAME
              ,FILE_NAME
              ,SUBSTR(FILE_NAME, 1200) FILE_NM
              ,SUM(BYTES) BYTES
          FROM DBA_DATA_FILES
         GROUP BY FILE_ID
                 ,TABLESPACE_NAME
                 ,FILE_NAME
                 ,SUBSTR(FILE_NAME, 1200)) A
      ,(SELECT TABLESPACE_NAME
              ,FILE_ID
              ,SUM(NVL(BYTES, 0)) FREE
          FROM DBA_FREE_SPACE
         GROUP BY TABLESPACE_NAME
                 ,FILE_ID) B
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
   AND A.FILE_ID = B.FILE_ID
 ORDER BY A.TABLESPACE_NAME, B.FREE;
cs

 

 

# DataFile 추가를 통한 Tablespace 확장

1
2
3
4
5
/* 
데이터 파일 추가를 통한 테이블 스페이스 확장  기본 500메가로 시작하여 50메가씩
증가하면서 최대 2기가까지 증가할 수 있다
2 기가를 설정하는 이유는 예전 리눅스 시스템이 2기가까지 밖에 인식하지 못함  
만약 오라클이 큰 용량의 테이블 스페이스 파일을 인식 하지 못하는 경우  오라클
시작시 largeFile로 Mount 하여야 한다.
*/ 
 
ALTER TABLESPACE TS_S4_DAT ADD DATAFILE 'D:\DATABASE\YOUR_DIR\TS_S4_DAT4.DBF' 
SIZE 500M AUTOEXTEND ON  NEXT 50M MAXSIZE 2048M;
cs

 

ORA-01847 : day of month must be between 1 and last day of month




왜 DB 관리툴로 돌리면 잘 수행 되는 쿼리가 서버에서 실행되면 오류가 발생할까?..


혹은


이와 반대의 경우를 경험할 때가 있다.



일반적으로 이 오류는 예를 들어 2018-12-32이라는 문자열을 날짜로 변환할 때 발생한다.


즉, 달력에 없는 날짜를 문자열을 이용하여 Date 타입으로 변환할 때 발생한다는 이야기이다. 


별도의 타입에 대한 변환이 명시되지 않으면 알아서(?) 타입을 변환해주는 오토케스팅이 낳은 좋지 않은 케이스라 할 수 있다. 





의외로 잘 깜박하는 예시를 들어보록 하자.


컬럼 Date_A 가 있다. 이 컬럼은 Date Type이며 Null 일 수 있다.


이 컬럼을 이용하여 아래와 같이 작성하면 ORA-01847을 만날 수 있다. 


1
2
3
4
        SELECT 
              ,TO_CHAR(NVL(A.DATE_A, '9999-12-31'), 'YYYY-MM-DD') AS DATE_A
 
        FROM  TABLE_NAME A
cs



위의 쿼리는 다음과 같이 작성되는것이 오류를 예방하고 혼란에 빠지지 않을 수 있다.



1
2
3
4
        SELECT 
              NVL(TO_CHAR(A.END_DATE, 'RRRR-MM-DD'), '9999-12-31')
 
        FROM  TABLE_NAME A
cs



설명을 약간 하자면 NVL 안에서 처리될때 문자열이 Null 인경우 문자열로 치환되어야 하는것이다. 
타입이 다른 것으로 치환되지 않도록 쿼리를 작성하는것이 포인트 이다. 

고쳐진 쿼리는 문자열로 변환 후 해당 문자열이 Null 인경우 대체되는 문자열로 변경하는것으로 작성되었다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR REPLACE FUNCTION SPLIT(P_INPUT_LIST VARCHAR2, P_RET_THIS_ONE NUMBER, P_DELIMITER VARCHAR2)
RETURN VARCHAR2
 
/*****************************************************************************************/
/* P_DELIMITER로 구분된 문자열을 구분하여 해당 INDEX의 값을 리턴하는 함수
/*
/* CREATE BY D.CAT 
/*****************************************************************************************/
IS
  V_LIST VARCHAR2(32767) := P_DELIMITER || P_INPUT_LIST;
  START_POSITION NUMBER;
  END_POSITION NUMBER;
BEGIN
  START_POSITION := INSTR(V_LIST, P_DELIMITER, 1, P_RET_THIS_ONE);
  IF START_POSITION > 0 THEN
    END_POSITION := INSTR( V_LIST, P_DELIMITER, 1, P_RET_THIS_ONE + 1);
    IF END_POSITION = 0 THEN
      END_POSITION := LENGTH(V_LIST) + 1;
    END IF;
    RETURN(SUBSTR(V_LIST, START_POSITION + 1, END_POSITION - START_POSITION - 1));
  ELSE
    RETURN NULL;
  END IF;
END SPLIT;
cs


 

oracle의 Spool 명령어를 가지고 잔머리를 굴려서 생각해낸 방법

 

spool 명령으로 테이블의 데이터를 파일로 출력하는 방법이다.

 

다음의 내용을 sql 확장자 파일로 저장한다.

 

getList.sql의 내용 ▽

 

set echo off                 // 실행하는 SQL문을 출력하지 않는다.

 

set pages 0                // 한페이지로 지정할 라인 수. 0으로 입력시 heading, page break, title을 표시하지 않는다.

 

set trimspool on          // 라인 뒤 공백을 제거한다.

 

set colsep ','              // 컬럼 간 데이터 구분자

 

set lines 30000            // 한 라인에 표시할 글자 수

 

set termout off             // 실행한 sql문을 보이지 않음

 

set feed off                 // SQL문으로 실행한 결과 건수를 보이지않음

 

 

spool /경로/list.txt;      // 저장할 파일명 및 경로 지정

 

select * from 테이블명;  // 추출할 쿼리 (쿼리작성시 중간에 빈칸(빈줄)이 들어가면 안됨

 

spool off                      // 화면출력저장 종료

 

quit                            // 오라클을 빠저나온다.

 

 

 

파일을 저장한 후 다음과 같이 실행하면 지정한 경로에 파일이 생성된다.

- 내 컴퓨터에 있는 DB에 접속할경우

sqlplus userid/passwd @getList.sql

 

 - 외부(다른네트워크)에 있는 오라클에 접속할경우

 

sqlplus userid/passwd@otherDB @getList.sql


- 참고 -

http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch12040.htm#i2698970

http://ss64.com/ora/syntax-sqlplus-set.html

 

 

sqlplus를 쓸일이 없으니 ..... 기본조차 모르고... ㅠㅠ 

tnsnames.ora에 TNS를 설정하고

 

 

 

 

 

△ 위와 같이 명령어를 입력한다.

id/pass 부분은 원격으로 접속하는 DB에 등록 되어 있는 id와 pass를 입력하고 @ 뒤에는 위에서 변경해준

이름을 넣어준다.

ex) sqlplus lee/123@GOLDSTAR

 

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

Oracle Split Function 구현  (0) 2017.06.20
DOS Mode (CMD) 창에서 Query 결과를 File로 Export  (0) 2014.06.04
오라클 정규식 (REGEXP)의 사용  (3) 2014.06.04
오라클 케시 지우기  (0) 2014.06.04
오라클 엔터값 처리  (0) 2014.06.04

+ Recent posts