2011. 11. 15. 10:50

[Oracle] RANK() 함수 Sample

SELECT X.BAYONG, X.YONGNM, X.GADAMT, 
             RANK() OVER(ORDER BY X.GADAMT DESC) RNKAMT
   FROM ( SELECT A.BAYONG, B.YONGNM, SUM(A.CHARGE + A.DLVAMT) GADAMT
                  FROM INVCON A
                    JOIN YNGMST B
                      ON B.YONGCD = A.BAYONG
                WHERE A.JBDATE BETWEEN '2011-11-01' AND '2011-11-02'
                GROUP BY A.BAYONG, B.YONGNM
             ) X
  ORDER BY RNKAMT

>>

BAYONG YONGNM     GADAMT   RNKAMT
--------- ---------- ---------- ----------
TG11        남대구         8909456          1
SEB8        광장            8540758          2
KGB3       파주탄현       8163140          3
JN55        장흥             7447275          4
KG14       공단안산        7071694          5
...

'Database / Sql' 카테고리의 다른 글

[Oracle] 오라클 버전 확인  (0) 2011.11.16
[Oracle] ORA-01476 : 제수가 0  (0) 2011.11.16
[Oracle] PL/SQL PROCEDURE Sample  (0) 2011.11.14
[Oracle] PL/SQL FUNCTION Sample  (0) 2011.11.14
[Oracle] SAVEPOINT & TRANSACTION  (0) 2011.09.02
2011. 11. 14. 16:35

[Oracle] PL/SQL PROCEDURE Sample

CREATE OR REPLACE PROCEDURE NOSUN.CREATE_BAEHAD
(V_LSTSEQ VARCHAR2, V_BAENUM VARCHAR2) AS

  C_JBDATE INVLOG.JBDATE%TYPE;
  C_MAINNB INVLOG.MAINNB%TYPE;

  S_CNT NUMBER;
  S_DLVGUB CHAR(1);

  CURSOR C_LIST IS
    SELECT A1.MAINNB, A1.BSTSEQ, A1.DLVAMT
       FROM INVLOG A1
     WHERE A1.MAINNB = V_LSTSEQ;   
BEGIN
  S_CNT := 0;

  UPDATE INVLOG
       SET BAENUM = V_BAENUM
   WHERE BSTSEQ = V_LSTSEQ;            

  OPEN C_LIST;
  LOOP
    <<start_point>>
       
    FETCH C_LIST INTO C_MAINNB, C_BSTSEQ, C_DLVAMT;
    EXIT WHEN C_LIST%NOTFOUND;

    IF C_DLVAMT <> 0 THEN
      S_DLVGUB := '1';
    ELSE
      S_DLVGUB := '2';
    END IF;          

    BEGIN
      SELECT APPCOD, RERAT1, RERAT2
           INTO S_APPCOD, S_RERAT1, S_RERAT2
         FROM RATTRF
       WHERE APPCOD = (CASE WHEN C_BTOCHK = 'Y' THEN 'BTOC' ELSE 'ZZ00' END);

    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        V_OUTPUT := '운송장번호 : '||C_MAINNB||'에 대한 운송요율이 등록되있지 않습니다.';
        EXIT;                               
    END;
 
    GOTO START_POINT;

  END LOOP;
  CLOSE C_LIST;
 
  UPDATE BEHEAD
     SET JNGCHK = 'Y'
   WHERE BAENUM = V_BAENUM;      

END CREATE_BAEHAD;
/


'Database / Sql' 카테고리의 다른 글

[Oracle] ORA-01476 : 제수가 0  (0) 2011.11.16
[Oracle] RANK() 함수 Sample  (0) 2011.11.15
[Oracle] PL/SQL FUNCTION Sample  (0) 2011.11.14
[Oracle] SAVEPOINT & TRANSACTION  (0) 2011.09.02
[Oracle] FLASHBACK  (0) 2011.09.02
2011. 11. 14. 16:25

[Oracle] PL/SQL FUNCTION Sample

CREATE OR REPLACE FUNCTION NOSUN.GET_RELCAR
( V_STRDAT IN VARCHAR2,  V_SUNCOD IN VARCHAR2 )
RETURN VARCHAR2 IS

    O_RELCAR VARCHAR2(30);
    S_CARNO4 VARCHAR2(4);

    CURSOR C_1 IS
      SELECT DISTINCT CARNO4
          FROM INVLOG
        WHERE BADATE= V_STRDAT
            AND SUNCOD= V_SUNCOD;
BEGIN

    OPEN C_1;
    LOOP
        FETCH C_1 INTO S_CARNO4;
        EXIT WHEN C_1%NOTFOUND;

        BEGIN
            O_RELCAR := TRIM(O_RELCAR || ' ' || S_CARNO4);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
            O_RELCAR := '';
        END;
    END LOOP;
    CLOSE C_1;

RETURN O_RELCAR;

END GET_RELCAR;
/

'Database / Sql' 카테고리의 다른 글

[Oracle] RANK() 함수 Sample  (0) 2011.11.15
[Oracle] PL/SQL PROCEDURE Sample  (0) 2011.11.14
[Oracle] SAVEPOINT & TRANSACTION  (0) 2011.09.02
[Oracle] FLASHBACK  (0) 2011.09.02
[Oracle] BIN$... 으로 시작하는 테이블  (0) 2011.08.31
2011. 9. 2. 11:12

[Oracle] SAVEPOINT & TRANSACTION

* SAVEPOINT

트랜잭션을 작은 섹션으로 나누는 SAVEPOINT 문을 사용하여 현재 트랜잭션에서 표시자를 생성할 수 있습니다.

그런 다음 ROLLBACK TO SAVEPOINT 문을 사용하여 해당 표시자에 보류 중인 변경 사항을 폐기할 수 있습니다.

이전의 저장점과 동일한 이름으로 두번째 저장점을 만들면 이전의 저장점이 삭제됩니다. 

 UPDATE...
 SAVEPOINT UPDATE_DONE;
 INSERT...
 ROLLBACK TO UPDATE_DONE;


* SET TRANSACTION READ ONLY - 읽기 일관성

이 구문을 실행하면 9시에 실행했다면, 9시 시점에서 커밋된 내용만 보여준다.

중간에 UPDATE 등 데이터 수정이 있어도 9시 시점의 데이터를 보여준다. 

명령 실행 후 READ 만 가능하다. 수정/삭제작업은 불가하다.

작업 해제는 ROLLBACK을 이용하면 된다.


'Database / Sql' 카테고리의 다른 글

[Oracle] PL/SQL PROCEDURE Sample  (0) 2011.11.14
[Oracle] PL/SQL FUNCTION Sample  (0) 2011.11.14
[Oracle] FLASHBACK  (0) 2011.09.02
[Oracle] BIN$... 으로 시작하는 테이블  (0) 2011.08.31
문자열 결합 그룹핑  (0) 2011.08.30
2011. 9. 2. 11:05

[Oracle] FLASHBACK

* 테이블을 삭제했을 때, 5분전 데이터 확인하기

DELETE EMP;  로 데이터를 모두 삭제 한 후

SELECT *
   FROM EMP AS OF TIMESTAMP (SYSDATE - INTERVAL '5' MINUTE);  -- 5분전의 데이터를 확인  (10g)
   ** 조회조건 추가 가능 **

* 삭제된 테이블 돌리기

DROP TABLE EMP;

FLASHBACK TABLE EMP TO BEFORE DROP;  -- 오라클 10g 부터 이렇게 복원 가능


'Database / Sql' 카테고리의 다른 글

[Oracle] PL/SQL FUNCTION Sample  (0) 2011.11.14
[Oracle] SAVEPOINT & TRANSACTION  (0) 2011.09.02
[Oracle] BIN$... 으로 시작하는 테이블  (0) 2011.08.31
문자열 결합 그룹핑  (0) 2011.08.30
[Oracle] JOIN UPDATE  (0) 2011.05.25
2011. 8. 31. 11:11

[Oracle] BIN$... 으로 시작하는 테이블

디비에서 테이블을 drop으로 삭제 했을때

테이블이 없어지긴 했는데 BIN$어쩌구저쩌구 테이블이 대신 생긴다.

테스트로 여러테이블을 만들고 지우는데

BIN$ 테이블이 너무 많이 생겨서 지저분해 보인다.

SQL> PURGE RECYCLEBIN; 

BIN$으로 시작하는 테이블이 모두 삭제되었다.  


결국 BIN$ 테이블은 복원할 일이 없다면 필요없는 테이블이라고 봐도 된다.

그것을 PURGE RECYCLEBIN; 을 통해

휴지통 비우기를 하면 없어지게 된다.


===========================================================================================
 
 
추가로 오라클 PURGE에 대해 검색해 보았다. 

휴지통(Recycle Bin)

오라클이 10g에서 새롭게 추가한 '휴지통' 이라는 기능.

테이블을 DROP 하더라도 언제던지 복원할 수 있게 하고자 하는 것이고요,

윈도우의 휴지통과 같다고 보시면 됩니다. 
 
 
휴지통에 들은 테이블을 조회.

SQL> show recyclebin;
  
 
휴지통의 모든 내용이 비워집니다.

SQL> purge recyclebin;
  
 
삭제된 테이블을 되살리고 싶다면

SQL> flashback table 테이블명 to before drop;
  
 
만약, 특정 테이블을 휴지통에 남기지 않고 모두 삭제하려면

SQL> drop table 테이블명 purge;
  
 
purge문 없이 그냥 drop 한 후에는

SQL> purge table 테이블명;


'Database / Sql' 카테고리의 다른 글

[Oracle] SAVEPOINT & TRANSACTION  (0) 2011.09.02
[Oracle] FLASHBACK  (0) 2011.09.02
문자열 결합 그룹핑  (0) 2011.08.30
[Oracle] JOIN UPDATE  (0) 2011.05.25
[Oracle] JOIN UPDATE (bypass_ujvc 힌트)  (0) 2011.05.25
2011. 8. 30. 15:36

문자열 결합 그룹핑

아래 처럼 두개의 테이블이 있고

TB_A
 ------      -------     ------
 A_ID        B_ID        A_DATA
 ------      -------     ------
 1           1           가가
 2           1           나나
 3           1           다다
 4           2           거거
 5           2           너너
 ....
 

TB_B
 -------    ------
 B_ID       B_DATA 
 -------    ------ 
 1          123 
 2          456 
 3          789 
 4          123 
 5          111


여기서 TB_B 의 B_ID = 1인 데이타를 조회 한 결과...
 
 -------    ------     -------
 B_ID       B_DATA     A_DATA
 -------    ------     -------
 1          123        가가, 나나, 다다   <--- 이렇게 한줄로...


[MSSQL]
  
 SELECT B_ID, B_DATA,
              STUFF( (SELECT  ',' + A_DATA 
                              FROM  TB_A A WHERE A.B_ID = B.B_ID 
                           FOR XML PATH('')),1,1,'')
    FROM TB_B B
  WHERE B_ID = 1;
  
 
[ORACLE]
 
 SELECT B_ID,
              SUBSTR(MAX(sys_connect_By_pAth(A_DATA,',')),2)
    FROM (
                SELECT A.B_ID, B_DATA,A_DATA,
                             ROW_NUMBER() OVER(PARTITION BY A.B_ID ORDER BY A.A_ID) rnum
                   FROM TB_A A, TB_B B
                 WHERE A.B_ID = B.B_ID
              )
   WHERE B_ID = 1
    START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum-1
       AND PRIOR B_ID = B_ID
   GROUP BY B_ID;


'Database / Sql' 카테고리의 다른 글

[Oracle] FLASHBACK  (0) 2011.09.02
[Oracle] BIN$... 으로 시작하는 테이블  (0) 2011.08.31
[Oracle] JOIN UPDATE  (0) 2011.05.25
[Oracle] JOIN UPDATE (bypass_ujvc 힌트)  (0) 2011.05.25
[MSSQL] WHERE 절에 CASE문 추가  (0) 2011.03.21
2011. 5. 25. 14:14

[Oracle] JOIN UPDATE

SAMPLE

UPDATE /*+ BYPASS_UJVC */
(
  SELECT A.COLNM RA
             , B.COLNM RB 
     FROM A, B
   WHERE A.KEY= B.KEY
) SET RA = RB;

 

 

CASE 1

UPDATE  /*+ BYPASS_UJVC */

  SELECT
  B.BIZREGNO,  B.POINT,  A.MPOINT 
     FROM  ISS_CUST_REM_POINT B
             ,  ( SELECT  BIZREGNO  ,SUM(POINT) AS MPOINT
                      FROM  ISS_POINT_USE_DET
                    WHERE  USE_TP_CD = 'E01'
                        AND  TRAD_DE IN ('20110303','20110317')
                        AND REG_ID = 'admin11'
                    GROUP  BY  BIZREGNO
                )  A 
   WHERE  B.BIZREGNO=A.BIZREGNO
)
SET    POINT = POINT+MPOINT; 



CASE 2

  UPDATE  /*+ BYPASS_UJVC */                    
  (                                            
  SELECT  A.IBKAMT,  A.BADATE,  A.YONGCD,  B.IMONEY 
     FROM  MULCAL A,                             
            (  SELECT  Y.BADATE,  Y.YONGCD,  Y.IMONEY 
                   FROM  MULIBK X                     
                     JOIN  MULIBL Y                     
                       ON  Y.IBKNUM  =  X.IBKNUM          
                 WHERE  X.IBKNUM  =  '201105250001'            
            ) B                                   
   WHERE  A.BADATE  =  B.BADATE                   
       AND  A.YONGCD  =  B.YONGCD                   
  )                                            
  SET  IBKAMT  =  IBKAMT  -  IMONEY                 

 

'Database / Sql' 카테고리의 다른 글

[Oracle] BIN$... 으로 시작하는 테이블  (0) 2011.08.31
문자열 결합 그룹핑  (0) 2011.08.30
[Oracle] JOIN UPDATE (bypass_ujvc 힌트)  (0) 2011.05.25
[MSSQL] WHERE 절에 CASE문 추가  (0) 2011.03.21
[MSSQL] 날짜 함수  (0) 2010.11.30
2011. 5. 25. 14:06

[Oracle] JOIN UPDATE (bypass_ujvc 힌트)

Undocumented HIT (잘못되어도 오라클에서 보장 하지 않음)

일반적으로 특정 테이블을 Update하기 위해서는 WHERE절에 EXISTS 또는 IN 등의 Sub-Query로 조인 조건을 만족하는 Row를 먼저 Check하고, 조건을 만족하는 Row에 대하여 SET 절에서 필요한 데이터를 검색하여 Update하는 것이 보통이다.
이 때, Update 해야 하는 Row가 많을 경우 WHERE절이나 SET절에서 테이블을 반복적으로 Random 액세스해야 하는 부담이 발생하므로 처리 범위가 넓은 Update문의 경우에는 'Updatable Join View'를 활용할 필요가 있다.
이 때, 조인되는 2개의 테이블은 반드시 1:1 또는 1:M의 관계여야 하며, Update되는 컬럼의 테이블은 M쪽 집합이어야 한다.
이것은 1쪽 집합인 Parent table의 조인 컬럼이 UK 또는 PK로 설정되어 있어야 함을 의미한다.
이 조건을 만족하지 못하는 Updatable Join View는 에러를 Return하며 실행되지 않는다.
(ORA-01779 cannot modify a column which maps to a non key-preserved table)
그러나, 일반적으로 View 또는 2개 이상의 테이블을 조인한 집합을 엑세스하는 경우가 많으므로 위의 UK나 PK Constraint를 설정하기 어려운 것이 현실이다.
따라서, 이러한 Constraint를 피해서 Updatable Join View를 사용할 수 있도록 BYPASS_UJVC 라는 힌트를 사용하여 튜닝할 수 있다.

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


▣ TEST 1 환경
Constraint :
DETP.DEPTNO CONSTRAINT PK_DEPT PRIMARY KEY
EMP.EMPNO CONSTRAINT PK_EMP PRIMARY KEY
EMP.DEPTNO CONSTRAINT FK_DEPTNO REFERENCES DEPT
-----------------------------


▣ VIEW 생성
create or replace view empdept_v
as
select x.empno, x.ename, x.job, y.dname, y.deptno
from emp x, dept y
where x.deptno = y.deptno;
View created.


▣ UPDATABLE JOIN VIEW 내용
SQL> select * from empdept_v;
EMPNO ENAME JOB DNAME DEPTNO
---------- ---------- --------- -------------- ----------
7369 SMITH CLERK RESEARCH 20
7499 ALLEN SALESMAN SALES 30
7521 WARD SALESMAN SALES 30
7566 JONES MANAGER RESEARCH 20
7654 MARTIN SALESMAN SALES 30
7698 BLAKE MANAGER SALES 30
7782 CLARK MANAGER ACCOUNTING 10
7788 SCOTT ANALYST RESEARCH 20
7839 KING PRESIDENT ACCOUNTING 10
7844 TURNER SALESMAN SALES 30
7876 ADAMS CLERK RESEARCH 20
7900 JAMES CLERK SALES 30
7902 FORD ANALYST RESEARCH 20
7934 MILLER CLERK ACCOUNTING 10
14 rows selected.


▣ 1쪽 컬럼 갱신
update empdept_v
set dname = 'AP_TUNNING'
where empno = '7369';
ERROR at line 2:
ORA-01779: cannot modify a column which maps to a non key-preserved table


▣ 1쪽 컬럼 갱신 WITH bypass_ujvc HIT
update /*+ bypass_ujvc */
empdept_v
set dname = 'AP_TUNNING'
where empno = '7369';
1 row updated.


▣ 변경 내역 확인
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 AP_TUNNING DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from empdept_v;
EMPNO ENAME JOB DNAME DEPTNO
---------- ---------- --------- -------------- ----------
7369 SMITH CLERK AP_TUNNING 20
7499 ALLEN SALESMAN SALES 30
7521 WARD SALESMAN SALES 30
7566 JONES MANAGER AP_TUNNING 20
7654 MARTIN SALESMAN SALES 30
7698 BLAKE MANAGER SALES 30
7782 CLARK MANAGER ACCOUNTING 10
7788 SCOTT ANALYST AP_TUNNING 20
7839 KING PRESIDENT ACCOUNTING 10
7844 TURNER SALESMAN SALES 30
7876 ADAMS CLERK AP_TUNNING 20
7900 JAMES CLERK SALES 30
7902 FORD ANALYST AP_TUNNING 20
7934 MILLER CLERK ACCOUNTING 10
14 rows selected.
-----------------------------


▣ TEST 2 환경
제약조건 : Constraint 없음.
-----------------------------


▣ 의미상 M쪽 집합을 갱신함.
update
(select b.dname, a.ename
from emp a,
dept b
where a.deptno = b.deptno
and a.empno = '7369')
set ename = 'KIMDOL';
ERROR at line 5:
ORA-01779: cannot modify a column which maps to a non key-preserved table
--> Constraint가 없으므로 oracle은 M쪽 집합인지 알지 못한다.


▣ 의미상 M쪽 집합을 갱신, With bypass_ujvc HIT
update /*+ bypass_ujvc */
(select b.dname, a.ename
from emp a,
dept b
where a.deptno = b.deptno
and a.empno = '7369')
set dname = 'KIMDOL';
1 row updated.


[출처]
bypass_ujvc 힌트|작성자 리원아빠

'Database / Sql' 카테고리의 다른 글

문자열 결합 그룹핑  (0) 2011.08.30
[Oracle] JOIN UPDATE  (0) 2011.05.25
[MSSQL] WHERE 절에 CASE문 추가  (0) 2011.03.21
[MSSQL] 날짜 함수  (0) 2010.11.30
[Oracle] 9i 이상에서 컬럼명 변경  (0) 2010.11.11
2011. 3. 21. 20:08

[MSSQL] WHERE 절에 CASE문 추가

CASE 1 :

WHERE ( CASE WHEN SJVOY1 = 'B' THEN CHLDAT
                      WHEN SJVOY1 = 'J' THEN ARIDAT
                                                 ELSE REGDAT END )
            = '2010-11-01';


CASE 2:

WHERE REGDAT
           = ( CASE WHEN VESCOD = 'DCA' THEN '2011-03-15'
                                                          ELSE '2011-03-16' END );


SJVOY1, VESCOD 의 값이 무엇인지에 따라서 조회되는 값 및 대상 필드 변경됨

'Database / Sql' 카테고리의 다른 글

[Oracle] JOIN UPDATE  (0) 2011.05.25
[Oracle] JOIN UPDATE (bypass_ujvc 힌트)  (0) 2011.05.25
[MSSQL] 날짜 함수  (0) 2010.11.30
[Oracle] 9i 이상에서 컬럼명 변경  (0) 2010.11.11
[MSSQL] 테이블 복사  (0) 2010.10.20