본 작성글은 PL/SQL Developer 11 64bit 버전을 기준으로 작성되었습니다.

 

해당 패키지 또는 프로시저에 디버깅을 위해 Step Into를 했으나 진입하지 못하고 end; 로 빠져나가는 현상이 있다.

 

 

패키지나 프로시저를 우클릭하여 아래 그림과 같이 Add debug information을 체크해 준다.

 

Start Debug를 클릭하여 Step Into를 누르면 정상적으로 진입이 가능한 것을 확인 할 수 있다.

ORA-01502: 인덱스 분할영역은 사용할 수 없은 상태입니다 를 만났다.

 

이러한 현상은 보통 테이블 파티션이 이동하거나 , 테이블 스페이스 이동 , 병합등의 사유로 인덱스 참조가 깨진 현상이라고 볼 수 있다

 

해결방법은 가장 간단한 방법으로 Index Rebuild를 수행한다.

alter index your_table_name rebuild

위 구문으로 해결할 수 있다. 그러나..

파티션 테이블로 구성되어 있다면 다른 구문을 사용해야한다.

 

아래와 같은 구문을 수행해야하며 파티션 단위로 재 생성 해주어야 한다.

alter index your_table_name rebuild partition your_partition_name ;

global partition index의 경우 non-partition index, partition index 등 파티션 테이블 관련 작업인 경우 재 생성이 필수 이다.

따라서 파티션 테이블별로 global index의 rebuild 작업용의 스크립트를 작성해 놓아야 빠른 시간안에 관련 인덱스를 재 생성 할 수 있다

 

Rebuild 일괄생성 구문

SELECT 'ALTER INDEX '||INDEX_NAME||' REBUILD ;' FROM USER_INDEXES;

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

Oracle Database 기초 #1  (1) 2022.03.25
TNSPING 이용한 접속 테스트  (0) 2021.02.16
자주쓰는 함수 정리 - 문자열 함수  (0) 2020.04.03
Oracle 함수 정리  (0) 2020.03.16
ORA-28001: the password has expired  (0) 2018.07.18

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

 

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

 

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



단축키 설정 메뉴 위치



10g 이상부터 가능

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

★ 오라클 정규식 사용 팁
Oracle 10g에서는 REGEXP_로 시작하는 함수를 지원합니다.
Regular Expression이라고 하죠~

 

1. REGEXP_LIKE
- LIKE 연산자와 유사하며, 표현식 패턴(Regular Expression Pattern)을 수행하여, 일치하는 값을 반환합니다.
- 문법 : REGEXP_LIKE(srcstr, pattern [,match_option])
- srcstr : 소스 문자열, 검색하고자 하는 값.

- pattern : Regular Expression Operator를 통해 문자열에서 특정 문자를 보다 다양한 pattern으로 검색하는 것이 가능.
- match_option : match를 시도할 때의 옵션. 찾고자 하는 문자의 대소문자 구분이 기본으로 설정. 대소문자를 구분할 필요가 없다면 'i' 옵션 사용을 지정한다.
[[:digit:]] : 숫자인 것.
[^[:digit:]] : 숫자가 아닌 것.

[^expression] : expression의 부정.

[ ] : []안에 명시되는 하나의 문자라도 일치하는 것이 있으면 나타냄.
- 예제 1

SELECT SSN
FROM test
WHERE REGEXP_LIKE(SSN, '[^[:digit:]]');

SSN
--------------------
******2229198
******2047888
******2349876

- 예제 2 : 제품의 이름 중에 'SS' 다음에 'P'를 포함하지 않은 문자열을 찾자.

SELECT product_name

FROM oe.product_information

WHERE REGEXP_LIKE(product_name, 'SS[^P]');

- 예제 3 : 제품 이름에 'SS' 다음 'P'나 'S'를 포함하는 문자열을 찾자.

SELECT product_name

FROM oe.product_information

WHERE REGEXP_LIKE(product_name, 'SS[PS]');

 

- 예제 4 : 메일 주소에 '@'이 포함되도록 설정.

ALTER TABLE customers

ADD CONSTRAINT cust_email_addr

CHECK(REGEXP_LIKE(cust_email, '@')) NOVALIDATE;

※ 참고 : 제약조건 해제

ALTER TABLE customers

DROP CONSTRAINT cust_email_addr;

 

 

2. REGEXP_SUBSTR
- SUBSTR 함수의 기능을 확장하였습니다. 주어진 문자열을 대상으로 정규 표현식 패턴을 수행하여, 일치하는 하위 문자열을 반환합니다.
- 문법 : REGEXP_SUBSTR(srcstr, pattern, [,position[,occurrence[,match_option]]])
- srcstr : 소스 문자열
- position : Oracle이 문자열에서 특정 문자를 어디에서 찾아야 하는지 위치를 나타냄. 기본으로 1로 설정되어 있으므로, 문자열의 처음부터 검색을 시작.
- occurrence : 검색하고자 하는 문자열에서 특정 문자의 발생 횟수. 기본으로 1로 설정되어 있으며, 이는 Oracle이 문자열에서 첫번째 발생 pattern을 찾는다는 의미.
- match_option : match를 시도할 때의 옵션
- 예제

SELECT REGEXP_SUBSTR(email, '[^@]+', 1, 1) AS "ID"
, REGEXP_SUBSTR(email, '[^@]+', 1, 2) AS "MailAddr"
FROM ( SELECT
'hellokitty@empal.com' email
FROM dual );


ID MailAddr
---------------------

hellokitty empal.com

 

 

3. REGEXP_REPLACE
- 주어진 문자열을 대상으로 정규 표현식 패턴을 조사하여, 다른 문자로 대체합니다.
- 문법 : REGEXP_REPLACE(srcstr, pattern [,replacestr[,position[,occurrence[,match_option]]]])
- replacestr : 대체하고자 하는 문자열을 나타냅니다.
- 예제 1 : 주민번호 뒷자리를 '*'로 표현

SELECT REGEXP_REPLACE(SSN, '[0-9]', '*', 7) AS "SSN"
FROM ( SELECT '7907051234567' SSN
FROM dual );

SSN
-------------
790705*******

- 예제 2 : 둘 이상의 공백 문자를 하나로 대체하여 가독성을 높이자.
SELECT REGEXP_REPLACE('Oracle is the Information Company', '( ){2,}', ' ') AS "Result"
FROM dual;


RESULT
-----------------------------------
Oracle is the Information Company
- 예제 3 : 전화번호의 표현 방식을 3자리, 3자리, 4자리로 묶어 식별력을 높이자.

SELECT REGEXP_REPLACE('555.123.4567','([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})','(\1) \2 - \3') AS "Result1"

FROM dual;

 

Result1

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

(555) 123 - 4567

-. [:digit:] : 숫자 값.
-. [:alpha:] : 문자 값.
-. [:alnum:] : 문자와 숫자를 함께 사용.

 

4. REGEXP_INSTR
- 정규 표현을 만족하는 부분의 위치를 반환합니다.
- 문법 : REGEXP_INSTR(srcstr, pattern [,position[,occurrence[,returnparam[,match_option]]]])
- position : 검색 시작 위치
- occurrence : 발생 횟수.
- returnparam : 반환 옵션.
- match_option : match를 시도할 때의 옵션.
-. 예제

SELECT REGEXP_INSTR('Regular Expression', 'a') AS "REGEXP_INSTR"
FROM dual;


REGEXP_INSTR
---------------
6

 

※ 참고 site

Oracle Database Documentation Library

http://www.oracle.com/pls/db10g/homepage

C Oracle Regular Expression Support

http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10759/ap_posix.htm

 

 

 

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

DOS Mode (CMD) 창에서 Query 결과를 File로 Export  (0) 2014.06.04
SQLPLUS로 다른 네트워크에 접속하기  (0) 2014.06.04
오라클 케시 지우기  (0) 2014.06.04
오라클 엔터값 처리  (0) 2014.06.04
테이블 설계시 참고사항  (0) 2014.06.04

1. 명사를 나열하여 리스트업 한다.

2. 테이블을 생성시에는 PK는 적을수록 좋다

 

3. 중복되는 컬럼은 다른테이블로 빼서 관리한다 (마스터 / 디테일 처럼)

 

4. 오라클은 테이블당 컬럼 갯수가 255개 까지 가능하지만 컬럼의 갯수는 적을수록 좋다.

 

5. 기본적으로 컬럼에 null 값이 들어가지 않는 형태로 설계한다.

 

6. 테이블 명 / 컬럼명 / 펑션명등은 최대 30자 까지만 가능하다.

 

※ 행안부 사이트에 행정데이터 관리시스템 www.adams.go.kr 에 가면 행정용어사전, Data type 표준안 등등의 자료를 구할 수 있다.

해당 사이트가 사라져서 혼란을 막기위해 해당 링크는 제거합니다.

 

+ Recent posts