[ORACLE]Unique 번호를 남길때

Database 2014.10.02 10:40 Posted by 애플자라

SELECT

    ROW_NUMBER () OVER (ORDER BY NAME ASC) EMS_M_ID,

    NAME,

    EMAIL    

FROM

    테이블명

댓글을 달아 주세요

CREATE OR REPLACE TRIGGER APLUSORA.NEWYN_UPDATE_TRG01

 AFTER UPDATE OF CONFIRM5 ON APLUSORA.CUSTOMER

 FOR EACH ROW

 BEGIN

    if :NEW.CONFIRM5 = 'N' then -- CONFIRM5 ='N' 경우만

         UPDATE APLUSORA.NEWS_CUST

            SET NEWS_YN = 'N'

         WHERE  EMAIL = :NEW.EMAIL

         AND    NEWS_YN = 'Y';

         UPDATE APLUSORA.FAIR_CUSTOMER

            SET NEWS_YN = 'N'

         WHERE  FC_EMAIL = :NEW.EMAIL

         AND    NEWS_YN = 'Y';

         INSERT INTO NEWYN_UPDATE_TRG01_LOG (EMAIL, CONFIRM5, ACTION)

         VALUES(:NEW.EMAIL, :NEW.CONFIRM5, 'UPDATE');

    end if;

 END;

/

 

CREATE OR REPLACE TRIGGER APLUSORA.NEWYN_DELETE_TRG01

 AFTER DELETE ON APLUSORA.CUSTOMER

 FOR EACH ROW

 BEGIN

    UPDATE APLUSORA.NEWS_CUST

    SET NEWS_YN = 'N'

    WHERE  EMAIL = :OLD.EMAIL;

    UPDATE APLUSORA.FAIR_CUSTOMER

    SET NEWS_YN = 'N'

    WHERE  FC_EMAIL = :OLD.EMAIL;

    INSERT INTO NEWYN_UPDATE_TRG01_LOG (EMAIL, CONFIRM5, ACTION)

    VALUES(:OLD.EMAIL, :OLD.CONFIRM5, 'DELETE');

 END;

/

 

-- 사기꾼한테 피해를 입지 않게 트리거로그도 동시에 남김!

CREATE TABLE APLUSORA.NEWYN_UPDATE_TRG01_LOG

(

  EMAIL        VARCHAR2(50 BYTE),

  CONFIRM5     VARCHAR2(1 BYTE),

  ACTION       VARCHAR2(6 BYTE),

  REGISTER_DT  DATE DEFAULT SYSDATE

)

 

BEFORE : 데이터 처리가 실행되기 전

AFTER : 데이터 처리가 실행 된 후

FOR EACH ROW : 데이터 처리시 건건이 모두 트리거 실행

:OLD.컬럼명 : SQL 반영전의 컬럼 데이터

:NEW.컬럼명 : SQL 반영 후의 컬럼 데이터

 

댓글을 달아 주세요

* 한 컬럼 중복제거 후 이어 붙이기

 

SELECT LAW_ID,

       SUBSTR(XMLAGG(SYS.XMLTYPE.CREATEXML('<'||FLAG||'>,' || CONTRACT_GESTALT||'</'||FLAG||'>') ORDER BY CONTRACT_GESTALT).EXTRACT('/a1/text()'), 2) CONTRACT_GESTALT,

       SUBSTR(XMLAGG(SYS.XMLTYPE.CREATEXML('<'||FLAG||'>,' || MEMO1||'</'||FLAG||'>') ORDER BY MEMO1).EXTRACT('/a1/text()'), 2) MEMO1

 FROM (

       SELECT

           LAW_ID,

           CONTRACT_GESTALT,NVL2(CONTRACT_GESTALT, 'a' || ROW_NUMBER() OVER (PARTITION BY LAW_ID, CONTRACT_GESTALT ORDER BY CONTRACT_GESTALT),

           'a2')  AS FLAG,

           MEMO1,NVL2(MEMO1, 'a' || ROW_NUMBER() OVER (PARTITION BY LAW_ID, MEMO1 ORDER BY MEMO1),

           'a3')  AS FLAG1

       FROM LAW_OP_FUND)      

GROUP BY LAW_ID

 

* 중복제거 없이 이어 붙이기

 

SELECT 

    LAW_ID,

    SUBSTR (MAX (SYS_CONNECT_BY_PATH (CONTRACT_GESTALT, ',')), 2) CONTRACT_GESTALT

FROM (SELECT LAW_ID, CONTRACT_GESTALT,

       ROW_NUMBER () OVER (PARTITION BY LAW_ID ORDER BY CONTRACT_GESTALT) rnum

       FROM LAW_OP_FUND)

START WITH rnum = 1

CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR LAW_ID = LAW_ID

GROUP BY LAW_ID

 

또는

 

SELECT

    LAW_ID,

    MAX(LTRIM(SYS_CONNECT_BY_PATH(CONTRACT_GESTALT,','),',')) AS CONTRACT_GESTALT

FROM

    (

    SELECT LAW_ID,CONTRACT_GESTALT,ROW_NUMBER() OVER(PARTITION BY LAW_ID ORDER BY ROWNUM) AS RN

    FROM LAW_OP_FUND T1

    --where LAW_ID ='2014091700002'

    )

START WITH RN = 1

CONNECT BY PRIOR LAW_ID = LAW_ID AND PRIOR RN = RN - 1

GROUP BY LAW_ID

ORDER BY LAW_ID ASC

 

출처 - http://amnesis.tistory.com/13

댓글을 달아 주세요

[ORACLE]날짜 함수 및 날짜구하기

Database 2014.09.18 13:01 Posted by 애플자라
---- 날자 계산하기 ----
 
-- 오늘날자 (현재날자 0시 0분 0초 ...)  
SELECT to_char(trunc(sysdate,'dd')    ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;                   
 
-- 내일날자 (다음날자 0시 0분 0초 ...)  
SELECT to_char(trunc(sysdate,'dd') + 1,'yyyy/mm/dd hh24:mi:ss') FROM dual ;                   
   
-- 내일날자 (다음날자 현재시 현재분 현재초 ...)  
SELECT to_char(sysdate + 1 ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;  
 
 
---- 달 계산하기 ----
 
-- 이번달 시작날자(현재달 1일 0시 0분 0초 ...)  
SELECT to_char(trunc(sysdate,'mm') ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;                      
 
-- 이번달 시작날자(현재달 1일 현재시 현재분 현재초 ...)      
SELECT to_char(sysdate - TO_CHAR(SYSDATE, 'dd') + 1 ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;     
 
-- 다음달 시작날자(다음달 1일 0시 0분 0초 ...)  
SELECT to_char(trunc(add_months(sysdate, + 1),'mm') ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;     
 
-- 다음달 시작날자(다음달 1일 현재시 현재분 현재초 ...)  
SELECT to_char(add_months(sysdate, 1) - to_char(add_months(sysdate, 1), 'dd') + 1,'yyyy/mm/dd hh24:mi:ss') FROM dual ;  
 
-- 다음달 오늘 날자(다음달 현재일 현재시 현재분 현재초 ...)  
SELECT to_char(add_months(sysdate, 1) ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;  
 
 
---- 년 계산하기 ----  
 
-- 올해 시작날자(올해 1월 1일 0시 0분 0초 ...)  
SELECT to_char(trunc(sysdate, 'yyyy') ,'yyyy/mm/dd hh24:mi:ss') FROM dual ;       
 
-- 1년전 현재일자(전년 현재달 현재일 0시 0분 0초 ...)  
SELECT to_char(trunc(add_months(sysdate, -12), 'dd'),'yyyy/mm/dd hh24:mi:ss') FROM dual ;      
 
-- 1년전 현재일자(전년 현재달 현재일 현재시 현재분 현재초 ...)  
SELECT to_char(add_months(sysdate, -12),'yyyy/mm/dd hh24:mi:ss') FROM dual ;   
 
 
---- 참고사항 ----  
 
-- TO_CHAR      : 숫자나 날짜를 문자열로 변환   
-- TO_NUMBER    : 문자를 숫자로 변환   
-- TO_DATE      : 문자를 날짜로 변환   
 
SELECT sysdate() -1 FROM dual;   -- 현재시간 - 1일  
SELECT sysdate() -1/24 FROM dual;  -- 현재시간 - 1시간   
SELECT sysdate() -1/24/60 FROM dual;  -- 현재시간 - 1분  
SELECT sysdate() -1/24/60/60 FROM dual;  -- 현재시간 - 1초  
 
-- YYYY     : 4자리 연도로 표시   
-- YY       : 끝의 2자리 연도로 표시  
-- YEAR     : 연도를 알파벳으로 표시  
-- MM       : 달을 숫자로 표시  
-- MON      : 달을 알파벳 약어 로표시  
-- MONTH    : 달을 알파벳으로 표시  
-- DD       : 일자를 숫자로 표시  
-- DAY      : 일에 해당하는 요일   
-- DY       : 일에 해당하는 요일의 약어   
-- HH       : 12시간으로 표시(1-12)  
-- HH24     : 24시간으로 표시(0-23)  
-- MI       : 분을 표시   
-- SS       : 초를 표시   
-- AM, PM   : 오전인지 오후인지를 표시  
 
 
---- 기초 날자구하기 ----  
 
-- SYSDATE          : 현재 시스템의 날짜 및 시간을 구함   
SELECT sysdate FROM dual;  
 
-- LAST_DAY         : 지정한 날짜의 해당 월의 마지막 날짜를 구함  
SELECT last_day(sysdate) FROM dual;  
 
-------------------------------------------------------------------------------  
-- 두 날자 사이의 차이 (1번째 인자가 2번째인자보다 작으면 음수, 크면 양수)  
-- 날자를 구할때 날자이후 데이터 까지 있다면 계산이 시간단위까지 계산하는듯하다  
-- 그래서 날자까지만 변환해서 잘라줘야 한다.  
 
SELECT to_date(to_char(to_date('20120220042517','yyyymmddhh24miss'), 'yyyymmdd'), 'yyyymmdd') - to_date(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd') FROM dual;  
-------------------------------------------------------------------------------  
 
-- MONTHS_BETWEEN   : 두달 사이의 개월 차이 (1번째 인자가 2번째인자보다 작으면 음수, 크면 양수)  
SELECT MONTHS_BETWEEN(to_date('20120219','yyyymmdd'), sysdate) FROM dual;  
 
-- ADD_MONTHS       : 현재달로부터 지정한 달의 날자를 구함 (즉 1달뒤 2달뒤 등의 날자를 구함)  
SELECT add_months(sysdate, -3) FROM dual;  
 
-- ROUND            : 날짜에 대한 반올림 (12시이후(12:00 00초포함)면 1일을 더함)  
SELECT round(sysdate) FROM dual;  
SELECT round(to_date('20110221120000', 'yyyymmddhh24miss')) FROM dual;  
 
-- TRUNC : 날짜에 대한 버림   
SELECT trunc(sysdate) FROM dual;  
 
 
---- TO_CHAR 의 변환 형식들 ----  
 
-- 9    : 일반적인 숫자를 나타냄   
SELECT to_char('123', '999999') FROM dual;  
 
-- 0    : 앞의 빈자리를 0으로 채움   
SELECT to_char('123', '000000') FROM dual;  
 
-- $    : dollar를 표시함   
SELECT to_char('123', '$999999') FROM dual;  
 
-- L    : 지역 통화 단위(ex \)   
SELECT to_char('123', 'L999999') FROM dual;  
 
-- . : 소숫점을 표시함   
SELECT to_char('123', '999.999') FROM dual;  
SELECT to_char('12.3', '999.999') FROM dual;  
 
-- , : 천단위를 표시함   
SELECT to_char('12345', '999,999,999') FROM dual;

댓글을 달아 주세요

[ORACLE] 없는 데이터 강제로 만들기

Database 2014.09.16 11:58 Posted by 애플자라

없는 데이터 강제로 만들기 및 정해진 데이터 표로 리스트 뿌리기

미련하면서도 억지로 만든쿼리

 

SELECT * FROM
(
SELECT SUBSTR(MARKETING_DATE,0,7) AS DAYS, G_CATE, COUNT(G_CATE) AS CNT 
FROM TB_MARKETING   
WHERE SUBSTR(MARKETING_DATE,0,4) = SUBSTR(TO_CHAR(SYSDATE,'YYYYMMDD'),0,4) 
AND G_CATE IN  ('공제회','국가기관','생손보사','은행(중앙회)','금융기관','기타')  
GROUP BY SUBSTR(MARKETING_DATE,0,7),G_CATE
UNION ALL
SELECT DAYS,G_CATE,CNT FROM APLUS_V_TB_MARKETING_ANNUAL
)
ORDER BY DAYS DESC, DECODE(G_CATE,'국가기관',1,'공제회',2,'생손보사',3,'은행(중앙회)',4,'금융기관',5,'기타',6)

 

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

APLUS_V_TB_MARKETING_ANNUAL DDL

 

 

CREATE OR REPLACE FORCE VIEW APLUSORA.APLUS_V_TB_MARKETING_ANNUAL
(
   DAYS,
   G_CATE,
   CNT
)
AS
SELECT TO_CHAR(SYSDATE,'YYYY-MM') AS DAYS, '공제회' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(SYSDATE,'YYYY-MM') AND G_CATE = '공제회'
)
UNION ALL
SELECT TO_CHAR(SYSDATE,'YYYY-MM') AS DAYS, '국가기관' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(SYSDATE,'YYYY-MM') AND G_CATE = '국가기관'
)
UNION ALL
SELECT TO_CHAR(SYSDATE,'YYYY-MM') AS DAYS, '생손보사' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(SYSDATE,'YYYY-MM') AND G_CATE = '생손보사'
)
UNION ALL
SELECT TO_CHAR(SYSDATE,'YYYY-MM') AS DAYS, '은행(중앙회)' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(SYSDATE,'YYYY-MM') AND G_CATE = '은행(중앙회)'
)
UNION ALL
SELECT TO_CHAR(SYSDATE,'YYYY-MM') AS DAYS, '금융기관' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(SYSDATE,'YYYY-MM') AND G_CATE = '금융기관'
)
UNION ALL
SELECT TO_CHAR(SYSDATE,'YYYY-MM') AS DAYS, '기타' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(SYSDATE,'YYYY-MM') AND G_CATE = '기타'
)
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AS DAYS, '공제회' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AND G_CATE = '공제회'
)
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AS DAYS, '국가기관' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AND G_CATE = '국가기관'
)
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AS DAYS, '생손보사' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AND G_CATE = '생손보사'
)
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AS DAYS, '은행(중앙회)' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AND G_CATE = '은행(중앙회)'
)
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AS DAYS, '금융기관' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AND G_CATE = '금융기관'
)
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AS DAYS, '기타' AS G_CATE, 0 AS CNT FROM DUAL
WHERE 0 =
(
    SELECT COUNT(1) AS CNT FROM TB_MARKETING WHERE SUBSTR(MARKETING_DATE,0,7) = TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM') AND G_CATE = '기타'
)

 

 

APLUS_V_TB_MARKETING_ANNUAL.SQL

 

 

댓글을 달아 주세요

[ORACLE] 오라클 재구동

Database 2014.08.13 08:21 Posted by 애플자라

### Oracle 종료 명령어 ###
aplus-svr1:/>su - oracle  // Oracle 계정으로 변경
aplus-svr1:/data/oracle>lsnrctl stop   // 리스너 종료
aplus-svr1:/data/oracle>sqlplus ' /as sysdba '     // Oracle DB로 접근

또는 sqlplus "system/패스워드 as sysdba"

 

oracle DB로 접근

SQL> shutdown immediate;   // DB UnMount

 

### Oracle 시작 명령어 ###
aplus-svr1:/>su - oracle  // Oracle 계정으로 변경
aplus-svr1:/data/oracle>lsnrctl start   // 리스너 시작
aplus-svr1:/data/oracle>sqlplus ' /as sysdba '     // Oracle DB로 접근

 

oracle DB로 접근

SQL> startup;   // DB Mount

 

댓글을 달아 주세요

[ORACLE]OUT JOIN

Database 2013.06.14 17:41 Posted by 애플자라

SELECT A.POST_ID I_POST_ID,
       A.NAME AS I_NAME,
       A.PHONE1 I_R_PHONE1,
       A.PHONE2 I_R_PHONE2,
       A.PHONE3 I_R_PHONE3,
       NVL (B.GUBUN, '신규') AS GUBUN1,
       A.REGISTER_DT I_REGISTER_DT,
       A.GUBUN GUBUN,
       A.EVENT_YN,
       ROW_NUMBER () OVER (ORDER BY REGISTER_DT DESC) RNM,
       A.CELLPHONE
  FROM EVENT A, APLUS_V_CUSTOMER_CELLPHONE B
AND A.CELLPHONE = B.CELLPHONE(+) AND A.NAME = B.CUSTOMER_NM(+)
ORDER BY A.REGISTER_DT DESC

 

A테이블보다 B테이블이 많을때 OUT JOIN

'Database' 카테고리의 다른 글

[ORACLE] 오라클 재구동  (0) 2014.08.13
[MSSQL]MSSQL 2005 유지관리 계획 등록 오류  (0) 2013.07.10
[ORACLE]OUT JOIN  (0) 2013.06.14
[ORACLE]LONG 데이터타입 -> VARCHAR2 데이터로 변환  (0) 2013.06.07
[ORACLE] MERGE INTO  (0) 2013.03.08
[ORACLE] 바이트수 확인  (0) 2013.03.07

댓글을 달아 주세요

1. 데이터를 옮길 대상 테이블을 생성한다. : "TEMP_20130607" 라하자.;

 

CREATE TABLE TEMP_20130607
(
  TXDATE               VARCHAR2(8 BYTE)         NOT NULL,
  WRAP_ACCOUNT_NO      VARCHAR2(20 BYTE)        NOT NULL,
  WRAP_ACCOUNT_AMOUNT  VARCHAR2(4000 BYTE)
)
TABLESPACE APLUS_DATA_TS
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

 

2. FUNCTION 생성

 

CREATE OR REPLACE FUNCTION APLUSORA.FNC_LONG2CHAR (  
    ori_rowid        ROWID,  
    ori_column       VARCHAR2,
    ori_table        VARCHAR2  
)  
    RETURN VARCHAR
AS  
    longCont   VARCHAR2 (32767);  
    sqlQuery   VARCHAR2 (2000);
BEGIN  
    sqlQuery :=         'select ' || ori_column || ' from '|| ori_table ||         ' where rowid = '|| CHR (39)|| ori_rowid|| CHR (39);    EXECUTE IMMEDIATE sqlQuery                INTO longCont;        longCont := SUBSTR (longCont, 1, 4000);   RETURN longCont;END;
/

 

3. 실제 사용 쿼리

INSERT INTO TEMP_20130607
(TXDATE,WRAP_ACCOUNT_NO,WRAP_ACCOUNT_AMOUNT)
(SELECT TXDATE,WRAP_ACCOUNT_NO,FNC_LONG2CHAR(ROWID,'WRAP_ACCOUNT_AMOUNT','IFK_CUSTOMER') FROM IFK_CUSTOMER
WHERE  TXDATE = (SELECT MAX(TXDATE) DT FROM IFK_CUSTOMER)
AND     ACCOUNT_STATUS_DESC = '활동')

 

댓글을 달아 주세요

[ORACLE] MERGE INTO

Database 2013.03.08 11:39 Posted by 애플자라

-- MERGE UPDATE
MERGE INTO IFT_FUND_STANDARD_PRICE_RESULT A
USING (
    SELECT TIMS_DATE,FUND_CODE,BM_INDEX,BM_RATE FROM IFT_FUND_STANDARD_PRICE_RESULT
    WHERE FUND_CODE ='10110'
    AND TIMS_DATE > '20130115'
) B
ON (
    A.TIMS_DATE = B.TIMS_DATE
    AND A.FUND_CODE ='10112'
)
WHEN MATCHED THEN
    UPDATE SET A.BM_INDEX = B.BM_INDEX, A.BM_RATE = B.BM_RATE

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

MERGE INTO를 사용하면 INSERT, UPDATE를 각 케이스 별로 처리할 수 있다.

한꺼번에 데이터를 덮어쓰거나 갱신할때 UPDATE와 INSERT가 동시에 처리되어야 할때가 있는데,

그러한 경우에 유용하게 쓸수 있는 구문이다.


MERGE INTO 대상테이블 A

USING (

) B

ON (

-- 매칭 조건

)

WHEN MATCHED THEN

-- 조건에 매칭될 경우 실행

UPDATE 문 (UPDATE SET ...)

WHEN NOT MATCHED THEN

-- 조건에 매칭되지 않을 경우 실행

INSERT 문 (특이한 점은 INSERT INTO가 아니다.)


예제

MERGE INTO TCOGRNTNUM A

USING (

    SELECT '0009' AS GTNO_KD_CD, GTNO_KEY_VAL, MAX(POL_SEQ) AS SEQ

    FROM (

        SELECT PDGP_CD || SUBSTR(TO_CHAR(INS_BGN_DT, 'YYYYMMDD'), 3,2) AS GTNO_KEY_VAL, SUBSTR(POL_NO, 6, 7) POL_SEQ FROM TCTTCOT

        WHERE

            BIZ_SYS_CD = 'CTK'

            AND JNT_TNG_YN = '2'

            AND INS_BGN_DT BETWEEN TO_DATE('20121001', 'YYYYMMDD') AND TO_DATE('20121115', 'YYYYMMDD')

    )

    GROUP BY GTNO_KEY_VAL

) B

ON (

    A.GTNO_KD_CD = B.GTNO_KD_CD

    AND A.GTNO_KEY_VAL = B.GTNO_KEY_VAL

)

WHEN MATCHED THEN

    UPDATE SET A.SEQ = B.SEQ, A.SYS_DEL_DIV_CD = '0', A.INPPE_ORG_ID = '0000000000', A.SYS_OCC_DTM = SYSDATE,

    A.OCC_IP = '0.0.0.0', A.APP_ID = 'MIG', A.DATA_CHNG_DTM = SYSDATE

WHEN NOT MATCHED THEN

    INSERT (A.GTNO_KD_CD, A.GTNO_KEY_VAL, A.SEQ, A.SYS_DEL_DIV_CD, A.INPPE_ORG_ID, A.SYS_OCC_DTM, A.OCC_IP, A.APP_ID, A.DATA_CHNG_DTM)

    VALUES (B.GTNO_KD_CD, B.GTNO_KEY_VAL, B.SEQ, '0', '0000000000', SYSDATE, '0.0.0.0', 'MIG', SYSDATE) 

;

댓글을 달아 주세요

[ORACLE] 바이트수 확인

Database 2013.03.07 09:40 Posted by 애플자라

SELECT
 CUSTOMER_NAME AS 고객명,
 LENGTHB(ADDR) BYTE, -- 바이트 수 길이
 LENGTHB(SUBSTRB(ADDR, 0, 70)) BYTE_1,
 LENGTHB(SUBSTRB(ADDR, 70, 140)) BYTE_2,
 SUBSTRB(ADDR, 0, 70) AS SUB_LEN1, -- 바이트 수 만큼 문자열 짜르기
 SUBSTRB(ADDR, 70, 140) AS SUB_LEN1,
 ADDR   AS 동이상주소,
 '' AS 동이하주소
FROM APLUSORA.TEMP_KIUM_CUSTOMER;

댓글을 달아 주세요