[ORACLE]데이터 페이징 처리방법(게시판)

Database 2012.10.11 17:00 Posted by 애플자라
SELECT B.*
FROM ( SELECT ROW_NUMBER() OVER(ORDER BY DATE DESC) RNUM,A.*
            FROM TABLE A ) B
WHERE RNUM BETWEEN 1 AND 50

댓글을 달아 주세요

[ORACLE]SELECT INSERT 속도개선, nologging

Database 2012.09.05 10:19 Posted by 애플자라

alter table "해당 테이블" nologging -> 넣을 테이블

alter session set db_file_multiblock_read_count = 128; -> 옵션

insert /*+append*/ into "해당테이블"

옵션 주면 일반 full에 16배 더 빨라져
천 만건이면..어지간한 데이터도 30분 안 쪽으로 끝남


INSERT /*+APPEND/ INTO APLUSORA.NEW_ADDRESS_20120823
(
      BUPJUNG_CODE, SIDO, SIGUNGU,
   DONG, LI, SAN,
   BUNJI_NO1, BUNJI_NO2, DORO_CODE,
   DORO_NAME, JIHA, GUNMUL_NO1,
   GUNMUL_NO2, GUNMUL_NAME, GUNMUL_NAME_DTL,
   GUNMUL_GWANRI_NO, DONG_SEQ, HANGJUNG_CODE,
   HANGJUNG_NAME, ZIP_CODE, ZIP_CODE_SEQ,
   DELIVER_NAME, UPDATE_CODE, UPDATE_DAY,
   DORO_NAME_BEFORE, SIGUNGU_GUNMUL_NAME, APARTMENT
)
SELECT /*+FULL(APLUSORA.NEW_ADDRESS_20120823@APLUS_TEST_LINK) PARALLEL(APLUSORA.NEW_ADDRESS_20120823@APLUS_TEST_LINK, 4)/
   BUPJUNG_CODE, SIDO, SIGUNGU,
   DONG, LI, SAN,
   BUNJI_NO1, BUNJI_NO2, DORO_CODE,
   DORO_NAME, JIHA, GUNMUL_NO1,
   GUNMUL_NO2, GUNMUL_NAME, GUNMUL_NAME_DTL,
   GUNMUL_GWANRI_NO, DONG_SEQ, HANGJUNG_CODE,
   HANGJUNG_NAME, ZIP_CODE, ZIP_CODE_SEQ,
   DELIVER_NAME, UPDATE_CODE, UPDATE_DAY,
   DORO_NAME_BEFORE, SIGUNGU_GUNMUL_NAME, APARTMENT
FROM APLUSORA.NEW_ADDRESS_20120823@APLUS_TEST_LINK;

이렇게 Full 태우고 parallel 옵션주면 더 빨라짐

맨 처음 alter -> alter session set -> insert /append/ select /full....이런 순서로

출처 - 하정민 님

댓글을 달아 주세요

[ORACLE]휴일감안 전/후영업일자 조회

Database 2012.09.04 10:37 Posted by 애플자라

-- 기준일자와  휴일여부를 이용하여 전/전전/전전전, 후/후후/후후후 영업일자를 조회하기위한 sql

-- 인터넷 무쟈게 돌아댕겨도 전/후영업일자 조회하는 sql이 없어서 함. 만들어봤어요(내가 필요해서..ㅎㅎ)

-- dd: 특정일자, ck:2:비영업일, 1:영업일

with cal_t as(select '20110901' dd, '1' ck from dual union all
select '20110902' dd, '1' ck from dual union all
select '20110903' dd, '2' ck from dual union all
select '20110904' dd, '2' ck from dual union all
select '20110905' dd, '1' ck from dual union all
select '20110906' dd, '1' ck from dual union all
select '20110907' dd, '1' ck from dual union all
select '20110908' dd, '1' ck from dual union all
select '20110909' dd, '1' ck from dual union all
select '20110910' dd, '2' ck from dual union all
select '20110911' dd, '2' ck from dual union all
select '20110912' dd, '2' ck from dual union all
select '20110913' dd, '2' ck from dual union all
select '20110914' dd, '1' ck from dual union all
select '20110915' dd, '1' ck from dual union all
select '20110916' dd, '1' ck from dual union all
select '20110917' dd, '2' ck from dual union all
select '20110918' dd, '2' ck from dual union all
select '20110919' dd, '1' ck from dual union all
select '20110920' dd, '1' ck from dual union all
select '20110921' dd, '2' ck from dual union all
select '20110922' dd, '1' ck from dual union all
select '20110923' dd, '1' ck from dual union all
select '20110924' dd, '2' ck from dual union all
select '20110925' dd, '2' ck from dual union all
select '20110926' dd, '1' ck from dual union all
select '20110927' dd, '1' ck from dual union all
select '20110928' dd, '1' ck from dual union all
select '20110929' dd, '1' ck from dual union all
select '20110930' dd, '1' ck from dual
)
select a.dd
,a.ck
,case when a.ck = '1' then a.후영업일     else max(a.후영업일)     over(order by a.dd) end 후영업일
,case when a.ck = '1' then a.후후영업일   else max(a.후후영업일)   over(order by a.dd) end 후후영업일
,case when a.ck = '1' then a.후후후영업일 else max(a.후후후영업일) over(order by a.dd) end 후후후영업일
,case when a.ck = '1' then a.전영업일     else min(a.전영업일)     over(order by a.dd desc) end 전영업일
,case when a.ck = '1' then a.전전영업일   else min(a.전전영업일)   over(order by a.dd desc) end 전전영업일
,case when a.ck = '1' then a.전전전영업일 else min(a.전전전영업일) over(order by a.dd desc) end 전전전영업일  
from (
  select dd
  ,ck
  ,case when ck = '2' then null else lead(dd, 1) over(partition by ck order by dd) end 후영업일
  ,case when ck = '2' then null else lead(dd, 2) over(partition by ck order by dd) end 후후영업일
  ,case when ck = '2' then null else lead(dd, 3) over(partition by ck order by dd) end 후후후영업일  
  ,case when ck = '2' then null else lag(dd, 1)  over(partition by ck order by dd) end 전영업일
  ,case when ck = '2' then null else lag(dd, 2)  over(partition by ck order by dd) end 전전영업일
  ,case when ck = '2' then null else lag(dd, 3)  over(partition by ck order by dd) end 전전전영업일
  from cal_t
  where 1=1
 ) a
 order by a.dd

[출처] 휴일감안 전/후영업일자 조회|작성자 마중물

====================================================================뷰테이블 만들어서 사용

CREATE OR REPLACE FORCE VIEW APLUSORA.APLUS_V_WORK_DAY
(
   DD,
   ISWORK,
   B_DD

)
AS
     WITH CAL_T AS
(
    SELECT WORK_DAY DD, ISWORK FROM IFT_WORKING_DAY
    WHERE  WORK_DAY BETWEEN '20120700' AND '20121231'
)
SELECT A.DD
,A.ISWORK
,CASE WHEN A.ISWORK = 'Y' THEN DD ELSE MIN(A.B_DD)     OVER(ORDER BY A.DD DESC) END B_DD
FROM (
  SELECT DD
  ,ISWORK
  ,CASE WHEN ISWORK = 'N' THEN NULL ELSE LAG(DD, 1)  OVER(PARTITION BY ISWORK ORDER BY DD) END B_DD
  FROM CAL_T
  WHERE 1=1
 ) A;


SELECT TXDATE,권유자,권유자변경일,사번,계좌명,펀드계좌번호,AAA,BBB,AAA-BBB AS CCC
FROM
(
    SELECT
      A.TXDATE
     --,LENGTH(RECOMMEND_ID)
     ,A.RECOMMEND_NAME 권유자
     ,A.RECOMM_DATE 권유자변경일
     ,A.RECOMMEND_ID 사번
     ,A.CUSTOMER_NAME 계좌명
     ,A.FUND_ACCOUNT_NO 펀드계좌번호
     ,NVL(A.PAYMENT_AMOUNT_TOTAL,0) AAA
     ,NVL((SELECT PAYMENT_AMOUNT_TOTAL FROM IFK_FUND_RECOMMENDER_141
           WHERE TXDATE = CASE WHEN A.RECOMM_DATE-1 < '20120706'  THEN '20120706'
           ELSE (SELECT DECODE(ISWORK,'Y',DD,B_DD) AS WORK FROM APLUSORA.APLUS_V_WORK_DAY
                    WHERE DD = TO_CHAR(TO_DATE(A.RECOMM_DATE)-1,'YYYYMMDD')) END 
           AND FUND_ACCOUNT_NO = A.FUND_ACCOUNT_NO),0) BBB
    FROM APLUSORA.IFK_FUND_RECOMMENDER_141 A
    WHERE LENGTH(A.RECOMMEND_ID) =6
    AND A.TXDATE BETWEEN '20120706' AND '20120831'
    --AND A.RECOMM_DATE='20091001'
    AND A.RECOMMEND_ID NOT IN ('090001','090002')
) X

====================================================================

댓글을 달아 주세요

[ORACLE]Listener.log 관리

Database 2012.08.24 17:06 Posted by 애플자라

(로그 위치를 변경하지 않았다면)
$ORACLE_HOME/network/log 디렉토리에 보면, 
listener.log 가 꾸준히 또는 급격하게 사이즈가 증가할 경우가 있다.  

이럴 경우, 

lsnrctl  ->

lsnrctl> set current_listener <리스너명> --구성된 리스너명이 Listener 가 아닌 경우, 지정해 줌.

lsnrctl> set log_status off -- listener.log 파일에 로그를 기록하지 않는다.  

lsnrctl> set log_status on -- listener.log 파일에 로그를 기록.

set log_status off 로 변경하고, 파일 제거 또는 백업하고 listener.log 파일 생성 (생성하지 않아도 자동 생성) 

출처 - http://jmkjb.tistory.com/entry/ListenerlogManage

 

명령어는 lnsrctl start /stop/ status 사용

lsnrctl status (리스너 서비스 확인)

lsnrctl stop (리스너 서비스 멈춤)

lsnrctl start (리스너 서비스 시작)

서비스이름 확인후 tnsping service_name //host ip주소확인 상태확인

댓글을 달아 주세요

[ORACLE]SQL*Loader 사용법

Database 2012.08.24 10:39 Posted by 애플자라

문법
      SQLLDR [keyword=] value  [ [keyword=] value ]...

 

예제
      SQLLDR scott/tiger control='c:\xxx.ctl' log='xxx.log' direct=true ERRORS=99999999

 

키워드

  USERID
  오라클 사용자 이름과 암호를 지정 합니다.

  CONTROL
  콘트롤 파일 이름, SQL*Loader을 수행하기 위해서는 항상 지정해 주어야  합니다.

  LOG
  로그 파일 이름을 지정 합니다. (기본 이름은 controlfile.log)

  BAD
  거부된 레코드 모두를 저장하는 배드 파일 이름을 지정 합니다.

  DATA
  입력 데이터 파일 이름을 지정 합니다.

  DISCARD
  Load시 선택되지 않은 레코드가 저장되는 디스카드 파일(선택 사항)

  DISCARDMAX
  버림(discard)의 최대 허용 갯수를 지정 합니다.

  ERRORS
  허용하는 배드 레코드의 최대 수를 지정 합니다.

  DIRECT
  TRUE로 설정되면 SQL*Loader는 DIRECT PATH를 사용.
  반대의 경우는 기본 값인 CONVENTIONAL PATH를 사용 합니다.

  PARFILE
  추가 파라미터 파일을 지정 합니다.

  PARALLEL
  DIRECT 로드에서만 적합한 이 파라미터는 다중 병렬 DIRECT로드가
  수행되도록 지정 합니다.

  FILE
  병렬 DIRECT로드의 경우 임시 세그먼트가 생성될 파일을 지정 합니다.

-- SQLLoader 로그

제어 파일:    S_DATAFILE.CTL
데이터 파일:    NEW_ADDRESS_sam.txt
  잘못된 파일: C:\SQLLOADER\NEW_ADDRESS_sam.BAD
  폐기 파일:    지정 사항 없음

 (모든 폐기된 레코드 허용)

로드할 건수: ALL
생략 건수:  0
허용 오류수:  50
바인드 배열:  1000 행, 최대 256000 바이트
계속:    지정 사항 없음
사용된 경로:      규약

최대 오류 수 초과 - 상기 통계는 부분적인 실행을 반영한 것입니다 --이것 때문에 찾게된
테이블 NEW_ADDRESS_20120823:
  2895500 행 로드되었습니다.
  데이터 오류 때문에 51 행(이)가 로드되지 않았습니다
  모든 WHEN절이 실패하여 0 행(이)가 로드되지 않았습니다
  모든 필드가 NULL이어서 0 행(이)가 로드되지 않았습니다

 

댓글을 달아 주세요

 테이블 복사하기 스키마 데이터

CREATE TABLE 새로만들테이블명 AS

SELECT * FROM 복사할테이블명 [WHERE 절]

 

 테이블 구조만 복사하기

CREATE TABLE 새로만들테이블명 AS

SELECT * FROM 복사할테이블명 WHERE 1=2 [where에다가 참이 아닌 조건을 넣어줌]

 

 테이블은 이미 생성되어 있고 데이터만 복사

INSERT INTO 복사할테이블명 SELECT * FROM 복사할테이블명 [WHERE 절]

 

테이블 이름 변경

ALTER TABLE 구테이블명 RENAME TO 신테이블명

주의할 점은, Primary Key 나 Index 등 Constraint 는 복제되지 않습니다. 당연한 것이, 복제된다면 동일한 이름의 Object 가 이미 존재한다는 에러를 만나게 되겠죠. 데이터를 잠시 옮겨놓기 위한 용도의 테이블 복제에선 불필요하다고 봅니다.

댓글을 달아 주세요

[ORACLE]전화번호 자르기! (-) 기준

Database 2012.06.20 10:49 Posted by 애플자라

nvl( Substr( Bbs_Mar_Buy_Tel, 0, Instr(Bbs_Mar_Buy_Tel,'-')-1 ) , ' ')  AS BBS_HP_1,
            nvl( Substr(Substr(Bbs_Mar_Buy_Tel, Instr(Bbs_Mar_Buy_Tel,'-')+1), 0, Instr( Substr(Bbs_Mar_Buy_Tel, Instr(Bbs_Mar_Buy_Tel,'-')+1) , '-')-1) , ' ' ) AS BBS_HP_2,
            nvl( Substr(Substr(Bbs_Mar_Buy_Tel, Instr(Bbs_Mar_Buy_Tel,'-')+1), Instr( Substr(Bbs_Mar_Buy_Tel, Instr(Bbs_Mar_Buy_Tel,'-')+1) , '-')+1) , ' ' )  AS BBS_HP_3,

'000-000-0000';
'000-0001-0000';
'00-001-0000';

전화번호 자르기~!

출처 - http://damipic.tistory.com/entry/Oracle-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EC%9E%90%EB%A5%B4%EA%B8%B0-%EA%B8%B0%EC%A4%80

댓글을 달아 주세요

Rebuild Table을 Toad를 이용하여 컬럼위치 변경 하는 방법이다.

처음 생성 되었던 테이블에 컬럼이 추가되는 경우가 있는데 이후 위치를 바꾸고 싶을때가 있다. 
이전엔 테이블을 다시 생성하였지만 이 기능을 이용하면 아주 편리하게 변경이 가능하다.

1. Toad를 실행 후 Schema Browser를 그림과 같이 단축아이콘을 이용해 실행한다.
    메뉴 : Database > Schema Browser



2. Schema Browser화면으로 변경할 컬럼의 위치 부분을 박스로 표시 했듯이
   CCODEMST 테이블의 USEYN <-> REMARK 컬럼 위치를 변경하고자 한다.
   그리고, 좌측 테이블 리스트에서 CCODEMST테이블을 선택 후 오른쪽 마우스를 클릭한다.



3. CCODEMST 테이블에서 오른쪽 마우스를 클릭하면 다음과 같이 메뉴가 나오며, Rebuild Table을 선택한다.




4. 탭 메뉴에서 Columns항목으로 이동한다. USEYN항목을 마우스로 클릭해 위로 한칸 옮긴다.



5. USEYN, REMARK 항목이 변경되었다면 탭 메뉴에서 SQL탭을 선택한다.
    SQL탭 메뉴 변경시 자동 스크립트가 생성된다.


 
6. SQL탭을 선택하면 잠시 로딩 후 버튼이 활성화 된다. 버튼 클릭!!
   (화면 내용을 보면 기존 테이블은 CCODEMST_X로 한다)

 

 

7. 스크립트 실행 후 ERROR가 발생했는지 확인 할 수 있다.




8. 스크립트를 실행한 결과이다. CCODEMST, CCODEMST_X 테이블이 생성된걸  확일 할 수 있다.



9. CCODEMST 테이블에서 USEYN, REMARK의 위치가 변경 된걸 확인 할 수 있다.
   마지막으로 CCODEMST 테이블이 옳바르게 변경되었다면 CCODEMST_X테이블을 삭제(DROP) 한다.

출처 - http://yysvip.tistory.com/149

댓글을 달아 주세요

[ORACLE]Table Lock 걸렸을 때 처리 (ORA-00054)

Database 2012.04.19 11:45 Posted by 애플자라

ORA-00054 발생했을때 처리하는 방법..

발생 가능성은 다양하게 존재한다. Commit가 수행되지 않았을 경우라던가 Toad에서 Schema Browser를 사용하다가 삽질을 했다던가 등의 문제로 다양한 경우에서 발생할 수 있는 문제이다.

Truncate같은 명령은 ORA-00054라는 에러라도 출력하지만, DML(Delete) 문장 실행시엔 그냥 멈춰버리는 경우도 있다고 한다.

해결 방법은 오라클 서비스를 재시작 하면 쉽게 처리가되지만, DB를 사용하는 곳에서 DB 재시작이 그리 녹녹하진 않을 것이다. 이러한 에러가 발생하는 이유는 테이블에 Lock이 걸려서 생기는데 이 원인을 해결해주면 된다.


[Qeury]

SELECT A.sid , A.serial#
FROM v$session A , v$lock B , dba_objects C
WHERE A.sid = B.sid and B.id1 = C.object_id
AND B.type = 'TM' and C.object_name='TABLE_NAME';


[Result]

     SID    SERIAL#
------- ----------
    2391       18325


Lock를 하고 있는 대상의 데이터가 나오면

ALTER system kill session '2391, 18325';

와 같은 쿼리를 날려서 원인이 되는 세션을 날려버리면 된다.

출처 - http://www.secret.pe.kr/6323

댓글을 달아 주세요

[ORACLE]테이블명,인덱스명 변경

Database 2012.03.30 14:08 Posted by 애플자라

테이블명 변경: RENAME {변경전이름} TO {변경후이름};
인덱스명 변경: ALTER INDEX {변경전이름} RENAME TO {변경후이름};

1.변경하고자 하는 COLUMN으로 Unique Index를 생성한다.

쿼리 -
CREATE UNIQUE INDEX PK명 ON TABLE명(COLUMN명) TABLESPACE TABLESPACE명;
예제(테이블스페이스는 사용 안함) -
CREATE UNIQUE INDEX PK_FTA_PO_LEDGER ON FTA_PO_LEDGER(COMPANY_CODE, PROJECT_CODE, FTA_CODE, ITEM_CODE);


2.해당하는 PK를 삭제한다

ALTER TABLE RECRUIT_APP DROP PRIMARY KEY


쿼리 -
ALTER TABLE TABLE명 DROP CONSTRAINT PK명;
예제(테이블스페이스는 사용 안함) -
ALTER TABLE FTA_PO_LEDGER DROP CONSTRAINT FTA_PO_LEDGER_PK;


3.PK에 속성을 추가한다.
쿼리 -
ALTER TABLE TABLE명 ADD CONSTRAINT PK명 PRIMARY KEY(COLUMN명);
예제 -
ALTER TABLE FTA_PO_LEDGER ADD CONSTRAINT PK_FTA_PO_LEDGER PRIMARY KEY(COMPANY_CODE, PROJECT_CODE, FTA_CODE, ITEM_CODE);

select * from USER_IND_EXPRESSIONS where table_name = 'COUNSELLING'; -- 인덱스검색

[출처] 테이블의 PK 변경하기 (개발자로 살아남기) |작성자 정우아빠

댓글을 달아 주세요