oracle 사이베이스에서 문자열 합치기 ||


안녕하세요.
고코더 입니다. 


SQL에서 컬럼 사이에 보이는 '||' 특수문자 두개가 있습니다. 이 낯선 문자는 다름 아닌 문자를 이어 붙이는 기능을 합니다. 
보통 오라클에서는 concat 를 쓰고 msql에서는 +를 사용하기 때문에 잘 쓰지 않는 방법이지만 오라클과 sybase(사이베이스)에서는 사용 가능한 문자열 기능이고 현업에서도 자주 사용합니다. 

 1. 사용방법은 매우 간단합니다. 문자열 사이에 || 만 붙혀넣으면 됩니다.
'데이터' || '데이터'


 2. 가장 쉬운 방법으로 두개의 문자열을 이어보겠습니다. 문자열 가운데 ||만 넣어주면 완성입니다.

1
select 'go'||'coder'
cs

 3. 이번에는 여러개의 문자열을 이어보겠습니다. 갯수의 상관없이 문자열을 합칠 수 있습니다. 
1
select 'go'||'coder'||'_'||'net'
cs


 4. 그리고 Like 에서도 사용이 가능합니다. 아래처럼 Like에 들어간 퍼센트(%)를 가독성을 높이기 위해 사용하는 방법도 있습니다.
1
2
SELECT * FROM School
WHERE name LIKE '%'||'gocoder'||'%'
cs



마무리


사용하다 보면 concat 보다 보기 더 편해요




댓글을 달아 주세요



cluster index vs nonclustered index


안녕하세요.
고코더 입니다.


면접 질문으로 가장 인기가 많은 질문입니다. "클러스터드 인덱스와 넌 클러스터드 인덱스의 차이점을 설명하시오"
항상 받는 질문이지만 또 시간이 지나면 까먹고는 해서 한번 다시 복습할겸 정리합니다. 개념 자체는 어렵지는 않지만 이상하게 까먹는 내용입니다. 우선 표로 간단하게 차이점을 정리했습니다. 표를 한번 흝어보고 계속 읽어보시기 바랍니다.

클러스터드 인덱스
넌클러스터드 인덱스
배열
행을 물리적으로 재배열 한다.
행을 물리적으로 배열 하지 않는다.
크기
인덱스 페이지 용량이 작다
인덱스페이지 용량이 크다.
선택도
30% 이내 사용 권장
3% 이내 사용 권장
테이블당
사용 갯수
1개
249개



차이점 설명


클러스터드 인덱스는 데이터를 재배열 한다.

간단하게 차이점을 설명한다면 클러스터드는 입력된 데이터를 인덱스 기준으로 저장한다는 것입니다. 
만약에 이런 데이터가 있다고 해봅시다. 게임이라고 하고 아이템 데이터를 데이터베이스에 저장합니다. 그리고 이와 같은 컬럼으로 저장을 합니다. 그리고 클러스터드를 게임아이디 기준으로 잡습니다.

아이템에서 가장 중요한건 소유가 가장 중요합니다. 아래처럼 테이블 생성하고 게임 아이디를 클러스터 인덱스로 잡았습니다. 그럼 아이템 데이터가 들어올때마다 게임 아이디 순으로 재배열 합니다. 이렇게 되면 게임속에서 해당 아이디가 가지고 있는 아이템 데이터를 조회 할때 유리 합니다.

1
2
3
4
5
6
7
CREATE TABLE 아이템테이블 (
  게임아이디 CHAR(8NOT NULL,
  아이템이름 VARCHAR(1NOT NULL,  
  능력치 int NULL,
  가격 int NULL
  PRIMARY KEY (게임아이디)
cs

이 덕분에 데이터를 이미 정렬하여 사용하기 때문에 리프레벨(Leaf Level) 인덱스 테이블이 필요하지 않게 됩니다. 인덱스 테이블이 따로 필요하지 않기에 용량이 필요하지 않습니다.

넌클러스터드 인덱스는 인덱스 테이블을 생성합니다.

넌클러스터드 인덱스는 별도의 공간에 테이블을 생성하여 데이터를 정렬 해놓습니다. 그래서 리프레벨(Leaf Level) 인덱스 테이블이 필요합니다. 인덱스로 저장한 칼럼을 기준으로 인덱스 테이블에 저장하기 때문에 데이터베이스 용량을 차지 하게 됩니다.

새롭게 게임을 업데이트 하면서 기획자가 아이템 획득장소 기준으로 어떤 아이템들을 획득했는지 보여주려고 합니다. 이럴때 특장 캐릭터가 특정 위치에 갔을때 누가 어떤 아이템을 획득했는지 조회 할려면 '획득장소' 라는 칼럼을 생성하고 논클러스터를 생성합니다.

1
ALTER TABLE 아이템테이블 ADD CONSTRAINT CLUSTER_TABLE_ID UNIQUE(획득장소) 
cs

이렇게 되면 획득장소 기준으로 데이터가 인덱스 테이블에 따로 저장되고 장소 기준으로 조회시에 빠른 속도를 유지할 수 있습니다



다시 한번 복습 해봅시다.


클러스터형 인덱스
- 인덱스를 생성할 때는 데이터 페이지 전체를 다시 정렬한다.
- 대용량의 데이터를 강제로 다시 클러스터 인덱스를 생성하는 건 조심
- 인덱스 자체가 데이터 페이지이다. 인덱스 자체에 데이터가 포함
- 비클러스형 인덱스 보다 검색 속도는 더 빠르다. 하지만 데이터의 입력/수정/삭제는 느리다.
- 테이블에 한 개만 생성할 수 있다.


넌 클러스터형 인덱스
- 별도의 페이지에 인덱스를 구성한다.
- 검색 속도는 느리지만, 데이터의 입력,수정,삭제가 더 빠르다.
- 남용할 경우에는 시스템 성능을 떨어뜨리는 결과를 가져온다.


마무리


나만의 스토리를 만들어 외워보세요.


댓글을 달아 주세요


비밀번호가 맞았는데도 로그인 되지 않는다면 / the password has expired


안녕하세요.
고코더 입니다.


 1. 오라클을 신나게 설치하였고 권한도 주었지만
테스트 계정인 scott으로 로그인을 할때 이런 메세지가 뜰 것입니다. 
ORA-28001 : the password has expired


 2. scott은 사용하기 전에 로그인 후에 비밀번호를 변경해줘야 합니다. 
참고로 scott의 기본 비번은 tiger 입니다. 저는 비밀번호를 다시 tiger로 만들어주었네요.
sqlplus 
scott
비밀번호 입력


마무리


개발 학습중인 분들은 여기서 많이 막히더군요


댓글을 달아 주세요


DUAL 테이블에 대해 알아보자


안녕하세요.
고코더 입니다.


지난 시간에 DUAL을 이용해 테이블 없을시에 select 를 작성하는 방법을 알아봤는데요

-> Oracle에서 from(테이블) 없이 select 질의 / Dual


 1. 이 DUAL에 대해 궁금해 하는 분이 계셔서 추가로 글을 남깁니다. 오라클을 설치하면 기본 테이블이 주어집니다. 대표적인게 DEPT 인데요. DUAL은 테이블 리스트에 포함되어 있지 않습니다. 

 2. 그 이유는 바로 이 테이블은 SYS 소유이기 때문입니다. SYSTEM에서 기본으로 만들어놓은 테이블이지만
모든 사용자에게 권한을 주어서 내가 만든 테이블 처럼 조회가 가능합니다.

 3. 해당 dual 테이블을 조회 해보면 DUMMY 라는 컬럼에 X라는 단순한 데이터만 담겨 있습니다. 나는 임시테이블이라고 밝히고 있네요. 컬럼 구조도 VARCHAR2(1)입니다. 최소한의 자원으로 만들어진 임시 테이블입니다.



사용법 사례


이전 시간에 select 만으로 데이터를 조회하고 싶을때 dual을 이용한거 처럼특별한 from에 담을 게 없을때 사용하는 용도 입니다.

 4. 만약에 내장 함수를 출력하고 싶을때도 사용합니다.

1
2
SELECT SYSDATE FROM DUAL;
SELECT SYSTIMESTAMP FROM DUAL
cs


 5. 계산식을 출력해보고 싶을때도 사용이 가능합니다. (계산기 쓰면 되죠)

1
SELECT (10+10)/2 FROM DUAL;
cs


 6. 저는 강의를 주로 하니 테이블만들기전에 임시 데이터를 만들때도 사용합니다.

1
2
3
4
5
6
7
SELECT * from  (
    SELECT 'GoCoder' AS Name FROM dual
    union all
    SELECT 'Gocoder.Tistory.com' AS Blog FROM dual
    union all
    SELECT 'GoCoder.net' AS HomePage FROM dual
)
cs




DUAL이란 정리


- VARCHAR2(1)로 DUMM컬럼으로 만들어진 임시 테이블이다
- SYS소유이고 모든 사용자가 엑세스 할 수게 되어 있다
- 오라클 설치와 동시에 만들어진다.
- 이 테이블을 이용해 원하는 select 를 테이블 없이 실행 가능하다.


마무리



댓글을 달아 주세요


dual 테이블을 이용해 임의 값을 select 하세요.


안녕하세요. 
고코더 입니다. 

 1. 데이터베이스에서 select 만으로도 결과 값을 조회가 가능합니다. 저는 보통 이런 from 없는 셀렉트 쿼리는 데이터베이스 접속 테스트를 위해 사용합니다. mysql 에서 해당 sql을 질의해보면 

1
select 'gocoder.net' as gocoder;
cs



 2. mysql이나 MSSQL에서는 테이블 없이 조회 값을 만들어 낼 수 있습니다. 

 3. 하지만 오라클에서는 이러한 select만 있는 쿼리는 지원하지 않습니다.
같은 쿼리를 날릴때 오류 메세지 입니다. 
ORA-00923: FROM 키워드가 필요한 위치에 없습니다.
00923. 00000 -  "FROM keyword not found where expected"

 4. 그런 경우 from 절에 dual을 넣어주면 됩니다. dual은 오라클에서 제공하는 임시용 테스트 테이블입니다.
임시로 사용하여 원하는 임시 값을 리턴 받는 용도로 만들어놓은 테이블 입니다.

1
select 'gocoder.net' as gocoder from dual;
cs



 5. 데이터베이스내 초기 상태나 테이블이 아무것도 없는 상태에서 해당 dual 테이블을 이용하여
임의로 쿼리 조회 값을 만들어 낼 수 있습니다.



마무리


from을 생략 하지 못하게 하는게 더 도움이 될거 같네요.

댓글을 달아 주세요


사용자 계정 언락


안녕하세요.
고코더 입니다.


 1. 오라클 설치 이후에 기본 샘플 계정인 scott으로 접속하려고 하면 이런 메세지가 나타납니다.
계정이 잠겨있기 때문에 unlock 처리를 해야 사용이 가능합니다.
"ora-28000 the account is locked"



 2. 커맨드 창에서 관리자 계정으로 접속 합니다. 
sqlplus "/as sysdba"


 3. 그리고 아래처럼 scott 자리에 계정을 넣고 입력하면
잠금이 해제 됩니다. 
alter user scott account unlock;



마무리

그냥 기본 설정으로 풀어놓아도 되는데..


댓글을 달아 주세요


Oracle 11g Setup download


안녕하세요.
고코더 입니다.


 1. 오늘은 오라클 시리즈중에 가장 인기가 많은 11g 버전을 다운로드 해보겠습니다. 
현재 19c까지 나왔지만 익숙한게 좋네요
-> Oracle - 오라클 데이터베이스 19c 다운로드 및 설치하기


 2. 오라클 사이트로 이동해서 스크롤을 내리다 보면
11g 릴리즈 2버전 버전을 다운로드 가능합니다.
파일을 fil1, fil2 두가지 모두 다운르도 해야 합니다.


 3. 두가지 압축 파일은 풀어서 한 폴더에 모아두어야 합니다.


 4. 두개에 압축파일을 모아두면 이렇게 구성이 됩니다.
이제 여기서 setup.exe 를 실행해주세요.


 5. 설치를 함께 해보겠습니다. 이메일 주소를 넣으면 오라클 정보와 보안 메일이 오지만  저는 그냥 빈칸으로 다음


 6. 예를 클릭 합니다.



 7. 새롭게 설치 하는거라면 "데이터베이스 생성 및 구성"으로 다음 


 8. 학습자라면 데스크톱 클래스로 지정하고 다음


 9. 설치할 데이터베이스 폴더와 전역 이름을 정합니다. 기본 설정 그대로 다음


 10. 비밀번호를 간단히 했다면 그냥 예를 눌러주세요.


 11. 요약정보를 보고 완료를 눌러주세요.


 12. 그리고 설치가 시작됩니다. 시간이 꽤 걸리네요 


 13. 데이터베이스 생성 까지 완료가 되었습니다.



 14. 그리고 설치고 완료 되었습니다. 


어려운 단계는 하나도 없지만
학습자를 위해 남겨봅니다.


마무리


11g가 제일 좋네요


댓글을 달아 주세요


19c 언인스톨 삭제


안녕하세요.
고코더 입니다.


오라클 19c가 오래된 사양 탓에 제대로 작동안해서 지울려고 하는데
언인스톨을 제공하지 않고 있습니다.
황당하네요.

그래서 결국 직접 하드코딩 삭제를 해보았습니다.



 1. 서비스 중지


서비스탭에 가서 19c 관련 모든 서비스를 사용중지 시켜주세여



 2. 레지스트리 삭제


그 다음 레지스트리를 삭제합니다. 
시스템에서 작동 되는걸 막아야겠죠

- HKEY_LOCAL_MACHINE/SOFTWARE/Oracle
에서 모든 서비스 삭제 delete


HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Oracle~~
- 해당 레지스트리도 모두 삭제 


HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Oracle
- 해당 레지스트리 삭제




 3. 폴더삭제


개인이 설정한 19c 오라클 설치 디렉토리


C:드라이브 루트에 있는
Oracle 폴더 삭제


C:\Program Files
에 있는 Oracle 폴더 삭제


그리고 재부팅하면 새로운 오라클을 설치 가능합니다. 


마무리


아 컴퓨터가 안 따라줘서 이전 버전으로 다시 설치했습니다.


댓글을 달아 주세요


sequence 생성하기


안녕하세요.
고코더 입니다.


 1. 오라클은 다른 DBMS와 달리 자동 증가값을 생성하려면 
sequence를 만들어야 합니다.
귀찮긴 해도 시퀀스값도 관리 할 수 있는건
장점일거 같네요


 2. 방법은 간단합니다.
아래처럼 시퀀스 생성 쿼리를 만든후에
create sequence board_seq start with 1 increment BY 1 maxvalue 10000;
start with : 시작 값
increment BY : 증가 값
maxvalue : 최대 증가값


 3. insert시 마다 "board_seq.nextval" 을 넣어주면 
자동으로 증가 값을 입력 가능 합니다. 
insert into board(idx,name,title,content,hit) values (board_seq.nextval,'gocoder','제목','내용',0);


마무리

불편하지만 꼭  필요한 옵션 


댓글을 달아 주세요


SQL 프로그램에서 접근이 안될때 


안녕하세요.
고코더 입니다.


 1. 오라클 19c를 10년된 윈도우7에 깔았더니(내 책임이네)
sqlplus로 오라클이 접속은 되지만


 2. SQL 프로그램이나 서버에서 접속이 안되고 
이런 메세지가 뜨는 경우가 있습니다. 
the network adapter could not establish the connection



 3. 저는 19c 버전에서 이런 현상이 발견해서 서비스를 열어보니 오라클 리스너 서비스가 실행이 안됩니다.
시작해도 중지되고 설치 과정에 문제가 있어서 설치가 제대로 안된 것입니다. 


 4. 오라클을 다시 설치하시던가 해당 버전이
컴퓨터 사양과 안맞아서 생기는 이유 입니다.


마무리


19c 복잡해요


댓글을 달아 주세요