320x100

[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

WM_CONCAT은 여러 ','를 토큰으로해서 row값을 1줄로 합쳐준다.

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


http://sweeper.egloos.com/3001740



반응형

[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

 

반응형

[SQL] CONNECT BY = WITH

Posted on 2012. 1. 12. 10:17
Filed Under DB

계층적인 구조를 만들때 사용(recursive)
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

SELECT * FROM tbl_code
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

Developer를 통해 연결하기 위해서 무거운 Oracle 프로그램을 설치할 필요가 없더군요.. 답은 Instant Client 라는 OTN 개발과 배포를 위한 프로그램입니다. 프로그램 설치...


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오류] unable to extend table ..

Posted on 2011. 6. 10. 16:58
Filed Under DB




SYSTEM TableSpace 가용공간이 없어서 DB접속 조차 안되는 상황,

1) Disk가 충분하다면 테이블 스페이스 늘린다.
alter tablespace SYSTEM add datafile '/data/home/oracle/oracle11/oradata/orcl/system02.dbf' size 10000M;                    -- SYSTEM, 10 G 추가
alter tablespace SYSAUX add datafile '/data/home/oracle/oracle11/oradata/orcl/sysaux02.dbf' size 10000M;                   -- SYSAUX, 10 G 추가
alter tablespace _DAT add datafile '/data/home/oracle/oracle11/oradata/voip/_DATA_008.dbf' size 30000M; -- _DAT, 30 G 추가

이것마저 꽉~찰 수 있으므로 정기적으로 삭제 관리해야함.
반응형

[Oracle] jdbc로 접속시 ORA-12505: SID가 맞지 않다는 오류..

Posted on 2010. 12. 14. 19:55
Filed Under DB

요즘 DB툴로 사용중인 SQuirreL (일명 다람쥐)..
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

출처: http://citylock.tistory.com/449

오라클 명령어 : 내장함수 

샘플 테이블인 dual 테이블 : 가상테이블 dual

SQL> select * from dual;
SQL> select 1234*1234 from dual;

round() : 반올림

SQL> select round(12.3456, 3) from dual

소문자, 대문자 변환 함수

SQL> select lower('CityLock') as "소문자" from dual;
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이 된다.

----------------------------------------------------------------------------------------------------
♠ INDEX 생성/삭제
CREATE (UNIQUE) INDEX [인덱스명] ON [테이블명](컬럼1, 컬럼2, 컬럼,..);
DROP INDEX 인덱스명;
--인덱스명 변경
ALTER INDEX    idx_name1   RENAME TO    idx_name2
----------------------------------------------------------------------------------------------------
♠ Oracle 메타 테이블 정보
-- 메타 정보 테이블 목록
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


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  '모두 다르게 인식, 저장한다.

반응형

About

by 쑤기c

반응형