DataBase에서 table을 create하고 column의 data type을 varchar2 type으로 설정하고 data를 insert한다.
varchar2 type의 장점은 data의 길이가 가변적이라는 것이다.
따라서 varchar2(100)으로 선언한 후 'SAMPLE' 라는 data를 저장하면 'SAMPLE'만큼의 메모리만 할당하여 저장한다.
만약 후에 더 많은 data(100 이하)를 저장할 일이 있을 때 메모리 공간이 가변적으로 더 많이 할당되어 저장할 수 있다.
하지만 이 때 생각해 볼 것이 있다. 이미 'SAMPLE'만큼의 data가 저장되면 메모리상에서 그 이후에 다른 data들이 저장되어 있을 것이다.
하지만 이 column을 'SAMPLE...bla...bla...bla...'로 저장하면 현재 data의 이후의 data들은 모두 뒤로 밀려나야 하나?
이렇게 되면 update할 때 마다 성능에 치명적인 영향을 미칠텐데...?
정답은 '아니다.'이다.
varchar2 type으로 사용할 경우 column의 data가 더 크게 update되면 현재 공간에 삽입이 불가능하게 되고 이럴 때 그 data는 메모리의 다른 부분으로 옮겨가서 저장된다. 그리고 현재 위치에는 data가 옮겨가서 저장된 메모리의 새로운 주소가 저장되게 된다. 만약 이후에 계속 update가 여러번 발생해서 data block이 계속 옮겨가게 된다면 그 전의 메모리 주소에는 새로운 주소가 계속 저장되게 되고, 이러한 현상이 반복되면 이 data를 reference할 때 링크를 계속 따라가야하므로 많은 성능저하가 일어나게 된다.
이러한 현상을 row migration이라 한다.
이 migration은 성능에 치명적인 영향을 미치게 된다.
따라서 이러한 현상으로 인한 성능저하를 피하기 위해서, data를 모두 삭제 후 다시 insert를 하면 메모리에 다시 순서대로 저장되 된다. 이렇게 일정한 주기적으로 DataBase를 관리해주어야 한다.
PS. varchar2 type은 'abc', 'abc ', 'abc '모두 다르게 인식, 저장한다.
'DB'에 해당되는 글 44건
- 2016.03.04 [Oracle] PL/SQL 소스 텍스트 검색 - 프로시저,함수,패키지
- 2015.02.24 [Oracle/SQL] MAX,MIN 구하기 - KEEP, DENSE_RANK()
- 2014.09.07 [Oracle/SQL] PARTITION BY, OVER
- 2014.07.16 [Oracle 10 to 9] WM_CONCAT 함수 대체 XmlAgg
- 2014.05.21 [DB개념.용어] SQL이란/트랜잭션
- 2014.05.19 [Oracle] 테이블 컬럼 구조 조회하기 (메타테이블,DESC)
- 2013.12.26 [SQL] 두 테이블의 값 비교, 한쪽에 없는 것 추출방법은?
- 2013.11.18 [Toad] ORA-12154, 윈도우7 x64 에 설치시 디렉토리 유의사항
- 2013.04.24 DB Data Type Mapping [링크]
- 2013.04.16 [MSSQL] 데이터 타입 설명 [링크]
- 2013.04.04 [MSSQL] 주로 사용하는 SQL문 모음 [계속업데이트]
- 2012.01.12 [SQL] CONNECT BY = WITH
- 2012.01.03 자릿수 틀린 VARCHAR형 숫자의 정렬
- 2011.11.03 Oracle Instant Client [펌]
- 2011.06.10 [Oracle오류] unable to extend table ..
- 2010.12.14 [Oracle] jdbc로 접속시 ORA-12505: SID가 맞지 않다는 오류..
- 2010.11.10 [SQL] Oracle 내장함수
- 2009.06.11 [Toad] Explain Plan(실행계획) 보기
- 2009.06.05 [Oracle/SQL] 테이블/인덱스/컬럼/메타데이터/DB Link/데이터형
- 2009.05.12 [데이타타입] VARCHAR2
[Oracle] PL/SQL 소스 텍스트 검색 - 프로시저,함수,패키지
Posted on 2016. 3. 4. 09:45
Filed Under DB
-- 프로시저 텍스트 검색
SELECT LINE, TEXT
FROM USER_SOURCE
WHERE TYPE = 'PROCEDURE' -- PACKAGE, PACKAGE BODY, FUNCTION 도 가능
AND NAME = :PROC_NAME
AND TEXT LIKE '%' ||:KEYWORD || '%'
ORDER BY NAME, LINE
정보출처: 오라클에서 특정 문자를 검색하는 프로시저 검색
[Oracle/SQL] MAX,MIN 구하기 - KEEP, DENSE_RANK()
Posted on 2015. 2. 24. 13:00
Filed Under DB
집계함수, KEEP은?
- 그룹별 집계결과를 1개 행으로 반환한다.
/* Syntax */
MAX() KEEP (DENSE_RANK FIRST[LAST] ORDER BY)
MIN() KEEP (DENSE_RANK FIRST[LAST] ORDER BY)
/* 사용예 */
-- PATH의 마지막 순서의 시설명을 얻는다. 동일한 순서이면 시설명 중 큰값을 얻는다.
SELECT MAX (TO_NE_NM) KEEP (DENSE_RANK LAST ORDER BY PATH_SEQ)
♣ 참고 URL
- MAX() KEEP(DENSE_RANK FIRST[LAST] ORDER BY) 2014/10/07
- DENSE_RANK 사용법 2012/08/08
- RANK(), ROW_NUMBER(), DENSE_RANK() 함수 - 순위함수 partition by 까지 설명 : 네이버 블로그 2015/01/27
[Oracle/SQL] PARTITION BY, OVER
Posted on 2014. 9. 7. 17:35
Filed Under DB
PARTITION BY : 특정 컬럼 기준으로 데이터를 나눈다.
OVER : PARTITION BY(그룹핑) 한 데이터를 정렬해서 뽑는다.
사용예:)
-- 예시1:
-- 데이터를 A, B별로 나눠서 (PARTITION BY)
-- RANK 역순 정렬 (나뉜 데이터 내부 정렬)
-- 상위 3건 데이터를 추출 (나뉜 데이터별 3건)
SELECT *
FROM
(SELECT GRP, MGNO, NAME, RANK() OVER (PARTITION BY A, B ORDER BY RANK DESC) RANK
FROM TBL_NAME
)
WHERE RANK <= 3;
-- 예시2: 특정 조건의 COUNT 구하기
SELECT A.COL1, A.COL2,
COUNT(*) OVER (PARTITION BY A.COL1, A.COL2) AS CNT
FROM TBL A, TBL B
WHERE A.ID = B.ID
AND B.CONDITION = 'VALUE';
참고1: PARTITION BY 구문
참고2: http://www.gurubee.net/lecture/1284 (다른예제들)
참고3: RANK(), DENSE_RANK(), ROW_NUMBER(), PARTITION BY
[Oracle 10 to 9] WM_CONCAT 함수 대체 XmlAgg
Posted on 2014. 7. 16. 09:25
Filed Under DB
DBMS가 Oracle 10g에서 9i로 대체되어서 WM_CONCAT 함수 미지원 상태가 되었을때 방법,
TO_CHAR(WM_CONCAT(C.OP_INFO)) --> 결과:'A,B,C,E' 를
SUBSTR(XMLAgg(XMLElement(X, ',') --> 결과: 'A,B,C,,E'
-- 이 경우 값이 NULL인 경우 토큰(,)만 추가되므로 DECODE로 ',,'를 제거하자.
SUBSTR(XMLAgg(XMLElement(X, DECODE(C.OP_INFO, NULL, '', ',')
-- 이렇게 수정하면 WM_CONCAT과 같은 결과 출력
(2017.02.15 추가) SUBSTR(를 빠뜨리면 한글이 깨져서 나오더라..
<참고>
http://www.gurubee.net/article/53637 ▶ XMLAgg 힌트
http://blog.naver.com/webdilh/30120533693 ▶ 상세설명
[DB개념.용어] SQL이란/트랜잭션
Posted on 2014. 5. 21. 13:41
Filed Under DB
SQL(Structured Query Language)
데이터베이스에 저장된 데이터를 조회, 입력, 수정 삭제하는 등의 조작이나, 테이블을 비롯한 다양한 객체(시퀀스. 인덱스 등)를 생성 및 제어하는 역할을 합니다.
SQL의 종류
데이터 정의어(DDL: Data Definition Language)
- 데이터베이스 객체를 생성, 삭제, 변경하는 SQL문(CREATE, ALTER, DROP 등)
- 데이터베이스 관리자나 응용 프로그래머가 데이터베이스의 논리적 구조를 정의하기 위한 언어로서 데이터 사전(Data Dictionary)에 저장 됩니다.
데이터 조작어(DML: Data Manipulation Language)
- 테이블 안의 데이터를 조작(SELECT, INSERT, UPDATE, DELETE 등)
- 데이터베이스에 저장된 데이터를 조작하기 위해 사용하는 언어로서 데이터 검색(Retrieval), 추가(Insert), 삭제(Delete), 갱신(Update) 작업 수행 합니다.
- 특정 테이블의 마지막 DML 시각 조회하기:
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM 테이블명 ORDER BY SCN_TO_TIMESTAMP(ORA_ROWSCN) DESC;
데이터 제어어(DCL: Data Control Language)
- 주로 DB관리자가 사용
- 데이터베이스 객체에의 권한 제어, 인덱스 재생성, 백업, 복원, 스케쥴 부여 등(BACKUP, GRANT, REVOKE, TRANSACTION, COMMIT, SAVEPOINT 등)
- 데이터에 대한 접근 권한 부여 등의 데이터베이스 시스템의 트랜잭션을 관리하기 위한 목적으로 사용되는 언어입니다.
트랜잭션 제어어(TCL: Transaction Control Language)
- COMMIT, ROLLBACK
SQL문 기본형
SELECT ... FROM ... WHERE ...
트랜잭션(Transaction)
트랜잭션이란, 전체가 성공하거나 전체가 실패하는 것이라고 이해하면 됩니다. 트랜잭션에 속한 어떤 작업이 하나라도 실패하면 데이터베이스의 상태는 트랜잭션이 시작되기 이전 상태로 돌아갑니다 (Roll Back). 트랜잭션은 서버에 있는 데이터의 일관성을 보장하기 위한 것입니다.
// 트랜잭션 시작 BeginTransaction() // SQL 1 실행 bResult := ExecSQL(SQL1); if bResult := False then begin // SQL문 실행 실패시 복원 Rollback(); Exit(); end // SQL 2 실행 bResult := ExecSQL(SQL2); if bResult := False then begin // SQL문 실행 실패시 복원 Rollback(); Exit(); end ... // SQL 모두 실행 성공시 커밋 Commit();
♣ 참고
데이터베이스(DB) 객체와 DDL, DML, DCL 을 알아보자 | chsmanager | 2013/11/13
[Oracle] 테이블 컬럼 구조 조회하기 (메타테이블,DESC)
Posted on 2014. 5. 19. 17:22
Filed Under DB
방법1. Oracle 메타데이터 테이블 이용
-- 테이블 코멘트
SELECT * FROM USER_TAB_COLS WHERE TABLE_NAME = '테이블명';
--└ 단, DB Link 테이블에 대해서는 권한때문인지 조회되지 않는다.
-- 컬럼 코멘트 정보
SELECT * FROM USER_COL_COMMENTS WHERE ROWNUM < 5;
-- 테이블 스키마(DATA_TYPE,NULLABLE,..)
SELECT * FROM USER_TAB_COLUMNS B WHERE ROWNUM < 5;
-- 테이블 컬럼 목록 조회
SELECT t.TABLE_NAME, tc.COMMENTS, t.COLUMN_ID, t.COLUMN_NAME
||NVL2(t.DATA_LENGTH, '('||TO_CHAR(t.DATA_LENGTH)
||NVL2(t.DATA_PRECISION, ','||TO_CHAR(t.DATA_PRECISION),'')
||')', '') AS DATA_TYPE
,t.NULLABLE, cc.COMMENTS, t.DATA_DEFAULT AS DATA_DEFAULT
FROM USER_TAB_COLS t --테이블별 컬럼정보
,USER_TAB_COMMENTS tc -- 테이블 코멘트
,USER_COL_COMMENTS cc -- 컬럼 코멘트
WHERE 1=1
AND tc.TABLE_TYPE = 'TABLE' AND t.TABLE_NAME = tc.TABLE_NAME(+)
AND t.TABLE_NAME = cc.TABLE_NAME(+) AND t.COLUMN_NAME = cc.COLUMN_NAME(+)
AND t.TABLE_NAME IN ('대상테이블')
ORDER BY t.TABLE_NAME, t.COLUMN_ID;
-- 2022.11.16 덧) CURRENT_OWER : ALL_OWNER 대상으로 조회하기
USER_TABLES : ALL_TABLES
USER_TAB_COLS : ALL_TAB_COLS
USER_TAB_COMMENTS : ALL_TAB_COMMENTS
USER_COL_COMMENTS : ALL_COL_COMMENTS
방법2. DESC 명령어
DESC 테이블명;
이 명령은 원인은 모르겠으나 Toad 10.5 에서 동작하지 않는다.(오류는 발생하지 않으나 무반응)
Oracle Client 설치시 설치된 SQL Plus로 접속해서 볼 수 있었다.
로컬DB 외에 DB Links 된 외부 테이블에 대해서도 작동된다.
1) 도스 커맨드 창 실행
2) sqlplus ID/PWD@서비스명
3) SQL> desc 테이블명
[SQL] 두 테이블의 값 비교, 한쪽에 없는 것 추출방법은?
Posted on 2013. 12. 26. 10:17
Filed Under DB
create table tableA ( EMPNO int)
create table tableB ( EMPNO int)
insert into tableA values (1)
insert into tableA values (2)
insert into tableA values (3)
insert into tableA values (4)
insert into tableA values (5)
insert into tableB values (1)
insert into tableB values (2)
insert into tableB values (3)
insert into tableB values (4)
insert into tableB values (7)
-- A 테이블에만 존재하는 항목
select A.EMPNO
from tableA A left outer join tableB B on A.EMPNO=B.EMPNO
where B.EMPNO is null
-- B 테이블에만 존재하는 항목
select B.EMPNO
from tableA A right outer join tableB B on A.EMPNO=B.EMPNO
where A.EMPNO is null
-- A, B 테이블에 서로 없는것을 동시에
select A.EMPNO
from tableA A left outer join tableB B on A.EMPNO=B.EMPNO
where B.EMPNO is null
UNION ALL
select B.EMPNO
from tableA A right outer join tableB B on A.EMPNO=B.EMPNO
where A.EMPNO is null
-- 다른 방법으로 (A, B 테이블에 서로 없는것을 동시에)
select isnull(A.EMPNO,B.EMPNO)
from tableA A full outer join tableB B on A.EMPNO=B.EMPNO
where B.EMPNO is null or A.EMPNO is null
<출처: 네이버지식IN, 식물신 답변>
[Toad] ORA-12154, 윈도우7 x64 에 설치시 디렉토리 유의사항
Posted on 2013. 11. 18. 11:17
Filed Under DB
증상:)
- 윈도우7 64비트에 설치.
- 토드 실행하여 TNS불러서 접속시 ORA-12154 에러 계속 발생. Direct로 접속시 'Cannot open'에러.
원인:)
설치디렉토리에 '(',')'가 들어가면 안된다.
C:\Program Files (x86)\Quest Software [X]
해결:)
설치시 디렉토리를 'C:\Program Files'로 지정해도 'C:\Program Files (x86)'으로 설치된다.
그냥 설치 완료후 'Quest Software'폴더를 통째로 이동하였다.
<정보출처> http://blog.naver.com/kdm707/10108136510
DB Data Type Mapping [링크]
Posted on 2013. 4. 24. 15:42
Filed Under DB
OLE DB Data Type Mappings [http://msdn.microsoft.com/en-us/library/cc668759.aspx]
DB Data Type 변환 검색 키워드는 [DB Data Type Mapping]를 사용해야 겠다.
[MSSQL] 데이터 타입 설명 [링크]
Posted on 2013. 4. 16. 14:43
Filed Under DB
[MSSQL] 주로 사용하는 SQL문 모음 [계속업데이트]
Posted on 2013. 4. 4. 18:22
Filed Under DB
Microsoft SQL Server 2008 - Express버전은 무료. 단 DB용량이 10G이하
▼ S/W 다운로드
Microsoft SQL Server 2008 R2 RTM - Express with Management Tools
(Window Live Login 필요)
정보출처: http://devx.tistory.com/entry/최신-SQL-Server-2008-R2-Express-version
▼ Database Backup/Restore
1. backup 파일 만들기
BACKUP DATABASE DBNAME TO disk='c:\YSWL_BOOKING.bak' with init;
-- 2. DB 변경하여 restore 하기
RESTORE DATABASE DBNAME FROM DISK='c:\YSWL_BOOKING.bak'
WITH NORECOVERY,
MOVE 'DBNAME' TO 'C:\Program Files\Microsoft SQL\..\MSSQL\DATA\DBFILE.mdf',
MOVE 'DBNAME_log' TO 'C:\Program Files\Microsoft SQL Server\..\MSSQL\DATA\DBFILE_log.ldf';
출처: http://nimba.tistory.com/328
▼ 테이블 수정
1) 컬럼 추가
ALTER TABLE TableName ADD [ColumnName] [datatype] IDENTITY(1,1) NOT NULL;
→ IDENTITY(1,1)는 시퀀스 추가를 원할때 넣을 것, 1부터 1씩 증가라는 의미.
▽NOT NULL + 제약조건 추가
ALTER TABLE TBL_NAME ADD LastUpdateDate DATETIME NOT NULL CONSTRAINT DF_TBLNAME_LastUpdateDate DEFAULT GETDATE() WITH VALUES ;
2) 컬럼 수정
ALTER TABLE TableName ALTER COLUMN [ColumnName] datetime NOT NULL;
예:) ALTER TABLE EquipFileList ALTER COLUMN FileList nvarchar(250) NOT NULL;
3) 컬럼 삭제
ALTER TABLE TableName DROP COLUMN [ColumnName];
4) 컬럼명 변경
SP_RENAME 'TableName.ColumnName', 'New_ColumnName', 'COLUMN';
▼ PK/FK 추가/삭제
ALTER TABLE TableName ADD CONSTRAINT PK명 PRIMARY KEY (컬럼명);
ALTER TABLE TableName ADD CONSTRAINT FK명 FOREIGN KEY (컬럼명) REFERENCES 테이블명(컬럼명); -- FK추가
ALTER TABLE TableName DROP CONSTRAINT PK명; -- PK/FK 삭제
▼ 제약조건 추가
--디폴트값 추가
ALTER TABLE TableName ADD CONSTRAINT DF_xxx DEFAULT 기본값 FOR 컬럼명 ;
▼ 인덱스
CREATE UNIQUE INDEX UX_인덱스명 ON 테이블명 (컬럼1 ASC, 컬럼2 DESC)
WHERE 컬럼2 = 1 --with조건
DROP INDEX UX_인덱스명 ON 테이블명;
▼ MS-SQL의 데이터 정렬(인코딩) 지정 (일본어)
: SQL Server 데이터 정렬 옵션 (URL)
CI
대소 문자를 구별하지 않는다. 전각 알파벳 대소 문자도 구별하지
예 : "A"와 "a"를 동일시
CS
대소 문자를 구별한다. 전각 알파벳 대문자, 소문자도 구분
예 : "A"와 "a"를 구별하는
AI
악센트, 탁음, 대중 음악을 구별하지 않는다.
반각 카나의 탁음, 대중 음악도 구별하지
예 : "하", "바", "파"를 구분하지 않는
AS
악센트, 탁음, 대중 음악을 구별한다.
예 : "하", "바", "파"를 구별하는
KS
히라가나와 가타가나를 구분한다. 반각로 구분
KS 대해 KI는 지정하지
예 : "은"을 "이"구분
WS
반자 구분한다. 즉 전각, 반각 구별한다.
WS 대해 WI는 지정하지
예 : "a"와 "a"를 구별하는
BIN
이진 비교한다. 즉 모든 구별한다. .
지정 서식
형식 : Japanese_BIN
형식 : Japanese_ (CI | CS) _ (AI | AS) (_KS | _WS | _KS_WS)
예 : Japanese_BIN
예 : Japanese_CI_AS_KS
▼ 컬럼 데이터 정렬(COLLATE) 지정 방법(http://blog.daum.net/z-dream/17280549)
1)DB별 기본값 확인
SELECT name, collation_name FROM sys.databases;
2)컬럼별 정렬값 확인
SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'DB명'
AND TABLE_NAME IN ('테이블명')
3)컬럼 정렬값 변경
ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 VARCHAR(10) COLLATE 데이터정렬방식 NOT NULL;
ALTER/CREATE DATABASE DB명 COLLATE 데이터정렬방식;
▼ 관련 에러코드 1757
의미) 열 '테이블.컬럼명'의 데이터 정렬이 외래 키 ‘FK__XXX..’에 있는 참조 열 ‘테이블.컬럼명’의 데이터 정렬과 다릅니다.
▼ 데이터 정렬 정보 확인하기
SELECT name, collation_name FROM sys.databases WHERE {DB명};
▼ DateTime ↔ String 변환 [FORMAT 정보] [MSSQL 날짜 변환(GETDATE, CONVERT)]
SELECT CONVERT(Target형,원본컬럼,스트링포맷)
[DateTime to String] SELECT CONVERT(varchar,getdate(),120);
-- 120: yyyy-mm-dd hh:mm:ss(24h)
-- 112: yyyymmdd
-- 111: yyyy/mm/dd
-- 108: hh:mm:ss
[String to DateTime] SELECT CONVERT(datetime,'2013-06-28 17:28:00',120);
SELECT DATEADD(day, -1, GETDATE()), GETDATE() -- 하루전
-- 2017-12-19 10:42:50.780 2017-12-20 10:42:50.780
SELECT DATEADD(hour, -1, GETDATE()), GETDATE() -- 1시간전
--week, year, month, minute, second, millisecond
-- 초/밀리초 제거한 하루전
select GETDATE(), CAST(CONVERT(VARCHAR(16), GETDATE()-1, 120) as DateTime)
▼ 쿼리가 너무 길어서 보기 힘들때 서브쿼리 메모리에 임시보관하기
WITH VIEW1(임시뷰이름) AS (
서브쿼리문
)
SELECT * FROM VIEW1; -- 메인쿼리에서 사용
▼ DB프로시저의 시작 코드
-- 테이블에 영향을 준 행 수 메시지 출력하지 않도록 한다(∵서버 부하 적게)
-- "(1개 행이 영향을 받음)"와 같은 메시지
SET NOCOUNT ON;
-- 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 행을 읽을 수 있도록 설정한다.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
▼ 월의 첫날,마지막날짜값 조회
DECLARE @FirstDay DATETIME = CONVERT(DATETIME, '2018-02-01',121); -- 1일
DECLARE @LastDay DATETIME = DATEADD(DD,-1,DATEADD(MM,1,@FirstDay)); -- 말일
SELECT 1 AS StartDay, DATEPART(DD,@LastDay) AS EndDay;
▼ (20.11.19) 페이징 조회 OFFSET (SQL Server 2012버전 이상 지원)
DECLARE @viewCnt int = 50; -- 한 페이지 당 보여줄 ROW 갯수
DECLARE @currentPageNum int = 1; -- 조회할 페이지 번호(1~N)
--▼AS-IS
SELECT ROW_NUMBER() OVER(ORDER BY 컬럼1,컬럼2) as rnum, XXX
FROM 테이블
WHERE a.rnum BETWEEN ((@currentPageNum-1) * @viewCnt) + 1 AND (@currentPageNum * @viewCnt)
ORDER BY rnum;
--▼TO-BE
SELECT 컬럼1,컬럼2, XXX
FROM 테이블
ORDER BY 컬럼1,컬럼2
OFFSET (@currentPageNum-1)*@viewCnt ROWS FETCH NEXT @viewCnt ROW ONLY
▼ 연결된 서버 생성
-- 연결된 서버 삭제
EXEC sp_dropserver @server = '연결서버별명';
-- 생성&로그인 정보 등록
EXEC sp_addlinkedserver
@server = '연결서버별명',
@srvproduct = '',
@provider = 'SQLOLEDB',
@datasrc = 'ip',
@catalog = 'database명';
EXEC sp_addlinkedsrvlogin
@rmtsrvname= '연결된DB별명',
@useself= 'false',
@rmtuser = 'ID',
@rmtpassword = '패스워드';
-- 결과 확인
SELECT * FROM master.dbo.sysservers;
SELECT * FROM master.sys.linked_logins WHERE remote_name = 'id'
[SQL] CONNECT BY = WITH
Posted on 2012. 1. 12. 10:17
Filed Under DB
or COLUMN을 ROW로 쪼갤때도 사용(검색Key: column to row)
SELECT TO_CHAR(TO_DATE('201201','YYYYMM')+LEVEL-1, 'YYYYMMDD') AS DT,
TO_CHAR(TO_DATE('201201','YYYYMM')+LEVEL-1, 'DAY') AS WEEK
FROM DUAL
CONNECT BY LEVEL <= TRUNC(TO_DATE('201201','YYYYMM')+32,'MM')-TO_DATE('201201','YYYYMM');
DT WEEK
20120101 SUNDAY
20120102 MONDAY
20120103 TUESDAY
20120104 WEDNESDAY
20120105 THURSDAY
20120106 FRIDAY
20120107 SATURDAY
20120108 SUNDAY
20120109 MONDAY
20120110 TUESDAY
20120111 WEDNESDAY
20120112 THURSDAY
20120113 FRIDAY
20120114 SATURDAY
20120115 SUNDAY
20120116 MONDAY
20120117 TUESDAY
20120118 WEDNESDAY
20120119 THURSDAY
20120120 FRIDAY
20120121 SATURDAY
20120122 SUNDAY
20120123 MONDAY
20120124 TUESDAY
20120125 WEDNESDAY
20120126 THURSDAY
20120127 FRIDAY
20120128 SATURDAY
20120129 SUNDAY
20120130 MONDAY
20120131 TUESDAY
<출처: http://hermestop.tistory.com/145>
자릿수 틀린 VARCHAR형 숫자의 정렬
Posted on 2012. 1. 3. 17:12
Filed Under DB
ORDER BY num
ORDER BY num+0 ◀ +0 해주면 숫자로 변환해서 정렬해 준단다.
[out]
10
101
13
▼
10
13
101
Oracle Instant Client [펌]
Posted on 2011. 11. 3. 11:41
Filed Under DB
http://cafe.naver.com/hermeswing/613
Oracle에 연결하기 위해 Oracle Client를 설치하거나, 좀 심한경우에는 Oracle Enterprise까지 설치하는 경우가 있습니다.
그저 Toad 나 P/L SQL Developer를 통해 연결하기 위해서 무거운 Oracle 프로그램을 설치할 필요가 없더군요..
답은 Instant Client 라는 OTN 개발과 배포를 위한 프로그램입니다.
프로그램 설치 방법
1. 프로그램의 다운로드
http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
일단 자신의 OS환경에 맞는 프로그램을 다운로드 받은 후 적당한 위치에 압축을 풉니다.
(제 경우는 Instant Client Package - Basic 버젼을 다운로드 받았습니다.)
2. 환경 설정
Path 예) C:\instantclient_10_2;
NLS_LANG 예) NLS_LANG= KOREAN_KOREA.AL32UTF8
ORACLE_HOME 예) ORACLE_HOME= C:\\instantclient_10_2
TNS_ADMIN 예) TNS_ADMIN= C:\\instantclient_10_2
3. tnsnames.ora 파일 생성
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
ALIAS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = IP주소)(PORT = PORT))
)
(CONNECT_DATA =
(SERVICE_NAME = SID명)
(SRVR = DEDICATED)
)
)
4. Toad 나 P/L SQL Developer에서 연결하면 됩니다.
[출처] [Oracle] Instant Client 사용법 (헤르메스의 날개) |작성자 헤르메스 (2009-07-14)
[Oracle오류] unable to extend table ..
Posted on 2011. 6. 10. 16:58
Filed Under DB
SYSTEM TableSpace 가용공간이 없어서 DB접속 조차 안되는 상황,
alter tablespace SYSTEM add datafile '/data/home/oracle/oracle11/oradata/orcl/system02.dbf' size 10000M; -- SYSTEM, 10 G 추가
이것마저 꽉~찰 수 있으므로 정기적으로 삭제 관리해야함.
[Oracle] jdbc로 접속시 ORA-12505: SID가 맞지 않다는 오류..
Posted on 2010. 12. 14. 19:55
Filed Under DB
11g접속정보를 얻어 시도했는데 SID가 맞지 않다는 오류로 접속을 못하다가..
http://blog.naver.com/takersk/30067619818
jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxxx)))(CONNECT_DATA=(SERVICE_NAME=xxxx)))
접속 주소를 위처럼 수정했더니 접속테스트Ok!
[SQL] Oracle 내장함수
Posted on 2010. 11. 10. 19:57
Filed Under DB
오라클 명령어 : 내장함수
샘플 테이블인 dual 테이블 : 가상테이블 dual
SQL> select 1234*1234 from dual;
round() : 반올림
소문자, 대문자 변환 함수
SQL> select upper('citylock') as "대문자" from dual;
SQL> select initcap('citylock') as "첫자만" from dual;
SQL> select concat('city', 'lock') from dual; * 문자열을 연결할때
SQL> select length('citylock'), lengthb('시티락') from dual; * 문자열의 길이 - 영문 1byte , 한글 2 byte
SQL> select substr('citylock', 1, 3) from dual; * 1번째 문자부터 3자
instr() : 문자열 시작 위치
SQL> select instr('citylock', 'lock') from dual; => 4번째 위치, 1부터 카운트 시작한다.
lpad(), rpad() : 자리 채우기
SQL> select lpad('citylock', 10, '@') from dual; => @@citylock
SQL> select rpad('citylock', 10, '@') from dual; => citylock@@
trim() : 양쪽 1개 문자만 제거, 공백이나 특정 문자 제거
SQL> select trim(' ' from ' RedPlus ') from dual; => 약쪽 공백 제거
abs() : 절대값
SQL> select abs(-10) from dual;
floor() : 소수자리 버리기
SQL> select floor(12.34) from dual; => 12
trunc() : 특정 자리 자르기
SQL> select trunc(12.3456, 3) from dual; => 12.345
mod() : 나머지
SQL> select mod(3, 5) from dual; => 결과 : 3
sysdate() : 날짜
SELECT SYSDATE FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
SELECT TRUNC(SYSDATE) + 1 + 2/24 FROM DUAL -- 다음날 새벽 2시를 지정함
months_between() : 개월수 구하기 : 근무 개월수
SQL> select ename, months_between(sysdate, hiredate) from emp where deptno = 10;
add_months() : 개월수 더하기
SQL> select add_months(sysdate, 4) from dual;
next_day(sysdate, '일요일') : 다가올 요일에 해당하는 날짜
SQL> select next_day(sysdate, '일요일') from dual;
last_day() : 해당 달의 마지막 일수
SQL> select last_day(sysdate) from dual;
to_char() : 문자열로 변환
SQL> select to_char(sysdate, 'yyyy-mm-dd') from dual;
to_date() : 날짜형으로 변환
SQL> select sysdate - to_date('2008/01/01','yyyy/mm/dd') from dual;
nvl() : NULL인 데이터를 다른 데이터로 변경 ( null 데이터를 => 0 값으로 변환, 값이 null 이면 프로그램에서 오류가 발생하므로 )
SQL> select ename, nvl(comm, 0) from emp;
decode() : switch문과 같은 기능
SQL> select deptno, decode(deptno, 10, '10번', 20, '20번', '기본') from emp;
** deptno 가 10 이면 '10번', 20이면 '20번', 나머지는 '기본' 으로 설정
case() : else if문
SQL> select ename, deptno,
case when deptno = 10 then 'accounting'
when deptno = 20 then 'research'
when deptno = 30 then 'sales'
when deptno = 40 then 'operations'
end dname
from emp;
** 조건에 맞으면 dname 에 지정된 값을 넣는다.
[Toad] Explain Plan(실행계획) 보기
Posted on 2009. 6. 11. 13:51
Filed Under DB
Toad 에서 Explain Plan 보기
Toad의 버전에 따라 메뉴에서 Tools->Server Side Objects Wizard 를 실행하거나,
Toad 홈 디렉토리에 있는 TOADServerSide.exe 파일을 실행해서 ,
Wizard의 적당한 옵션을 설치해준다.
SQL 실행후 Ctrl+E 키를 눌러 Explain Plan 확인!!
ps. 실행해봤더니 쿼리가 종료가 안되었다는 메시지가 뜨길래 끝에 ';'추가해주니 되었다.
[Oracle/SQL] 테이블/인덱스/컬럼/메타데이터/DB Link/데이터형
Posted on 2009. 6. 5. 13:24
Filed Under DB
♠ 용어
* Primary Key: 테이블의 행을 유일하게 식별할 수 있는 유일 키 칼럼(들)을 지정
* Foreign Key: 자신이나 다른 테이블의 Primary Key를 참조하는 칼럼(들)을 지정
* Constraint(제한조건) : Primery Key, Foreign Key, Unique, Check (조건식)
♠ 데이터형 상세 설명
http://www.gurubee.net/lecture/1380
----------------------------------------------------------------------------------------------------
♠ 테이블명 변경
ALTER TABLE table1 RENAME TO table2
----------------------------------------------------------------------------------------------------
♠ 기존 테이블의 데이터 끌어다 넣기
UPDATE tbl1 N
SET N.col1 = (SELECT L.col2 FROM tbl2 L WHERE N.a = L.a);
♠ 테이블 복사
CREATE TABLE tbl_name AS
SELECT * FROM target_tbl_name;
-------------------------------------------------------------------------------------------------
♠ 테이블 컬럼
1) 컬럼명 변경
ALTER TABLE 테이블명 RENAME COLUMN 컬럼명 to 새 컬럼명;
2) 컬럼 추가
ALTER TABLE 테이블명 ADD (컬럼명 NUMBER(2) DEFAULT 디폴트값 NOT NULL);
ALTER TABLE 테이블명 ADD (컬럼명 NUMBER UNSIGNED NOT NULL AUTO_INCREMENT);
3) 컬럼 데이터 타입 변경
ALTER TABLE 테이블명 MODIFY 컬럼명 신_데이터타입;
4) 테이블/컬럼에 코멘트 추가
COMMENT ON TABLE 테이블명 IS '코멘트';
COMMENT ON COLUMN 테이블명.컬럼명 IS '코멘트' ;
5) 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
----------------------------------------------------------------------------------------------------
♠ 제약조건 추가/삭제
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 CHECK (컬럼명 = 0 OR (컬럼명 > 14);
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
----------------------------------------------------------------------------------------------------
♠ FK 설정하기 <출처: http://mainia.tistory.com/513>
ALTER TABLE board_free -- 설정할 테이블
ADD FOREIGN KEY (mem_no) -- 테이블에 FK 컬럼
REFERENCES members(mem_no)-- FK 연결이 되는 테이블과 PK 컬럼
ON DELETE RESTRICT -- 기본설정으로 자식에서 부모를 삭제 불가
ON UPDATE RESTRICT; -- 기본설정으로 자식에서 부모를 업데이트 불가
다음은 마지막 옵션값에 대한 설명이다.
ON DELETE RESTRICT : 기본설정으로 자식 row 에서 해당 부모 row 를 삭제하지 못한다.
ON DELETE CASCADE : 부모 테이블의 row가 삭제되면, InnoDB는 부모 row를 참조키와 동일한 외래 키를 갖는 자식 테이블의 모든 해당 row도 자동적으로 삭제한다.
ON DELETE SET NULL(?) : 자식 row도 자동적으로 update되어 외래 키에 해당하는 row는 NULL이 된다.
ALTER INDEX idx_name1 RENAME TO idx_name2
-- 메타 정보 테이블 목록 SELECT * FROM DICTIONARY ORDER BY TABLE_NAME; -- 컬럼 코멘트 정보 SELECT * FROM USER_COL_COMMENTS WHERE ROWNUM < 5; -- 테이블 코멘트 정보 SELECT * FROM ALL_TAB_COMMENTS WHERE TABLE_NAME = '테이블명'; -- 테이블 스키마(DATA_TYPE,NULLABLE,..) SELECT * FROM USER_TAB_COLUMNS B WHERE ROWNUM < 5;----------------------------------------------------------------------------------------------------
♠ DB Link 생성
DROP DATABASE LINK DB링크명; CREATE DATABASE LINK DB링크명 CONNECT TO 접속ID IDENTIFIED BY 패스워드 USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=IP주소)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=서비스명)))';
----------------------------------------------------------------------------------------------------
♠ Oracle IP정보
-- 접속자 IP정보 SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYSDATE FROM DUAL; -- Oracle IP정보 SELECT UTL_INADDR.GET_HOST_ADDRESS, UTL_INADDR.GET_HOST_NAME FROM DUAL;
----------------------------------------------------------------------------------------------------
♠ Long한 서브쿼리 따로 빼서 보기
WITH SUBQUERY_VW AS
(
SELECT A FROM B WHERE 1=1
)
SELECT A.*
FROM SUBQUERY_VW A
;
[데이타타입] VARCHAR2
Posted on 2009. 5. 12. 13:38
Filed Under DB