오라클 FOR LOOP 질문입니다. 0 5 1,974

by raksasa [SQL Query] FOR LOOP CSRSOR [2018.04.10 11:28:10]


parm1 : XXX

table A

 A1  |  A2 

100  | 200 

300  | 100

A테이블의 A1, A2 컬럼을 parm1과 계산하여 데이터 변경을 하려고 합니다. 

parm1 데이터와 A1을 계산(A1-parm1)하여 + : A1 = (A1-parm1), parm1 = 0, loop 중지

                                                        -  : A1 = 0,  parm1=ABS(A1-parm1), loop 계속

                                                        0 : A1 =0 , parm1=0, loop 중지

위에서 parm1의 값이 남아있다면

parm1 데이터와 A2을 계산(A2-parm1)하여 + : A2 = (A2-parm1), parm1 = 0, loop 중지

                                                        -  : A2 = 0,  parm1=ABS(A2-parm1), loop 계속

                                                        0 : A2 =0 , parm1=0, loop 중지

이 결과 값은 A 테이블에 update를 하고 싶습니다.

아니면 같음 구조의 테이블 B를 만들어 A위의 결과를 insert 하고 싶습니다.

CSRSOR 와 FOR LOOP를 사용하면 될듯하데.. 생각보다 잘 않되는군요...

by 마농 [2018.04.10 11:40:41]

a1 에 계산이 종료되지 않으면 a2 를 계산하는 듯 한데요.
a2 에서 끝나는 거 아닌가요? a2 에서 "loop 계속"이라는 표현이 이상하네요?
루프 라는 표현도 이상해요? a1, a2 두번만 계산하면 끝일 것 같은데요?


by raksasa [2018.04.10 13:08:55]

a1 과 parm1을 계산 해서 parm1이 남아있으면 a2와 parm1을 계산하는 것이 맞습니다.

'loop 계속' 이라는 표현은 1번쨰 row의 a1과 계산한 parm1이 0아닐때 A테이블에 row가 남아있으면

2번째 row의 a1 컬럼 값과 계산 한다는 의미로 'loop 계속' 이라고 했습니다. ^^;; (a2일때도 동일하구요)

모든 row의 a1과 계산된 parm1에 값이 남아있다면 다시 1번 row의 a2 와 계산이 되구요...

 

 

 


by 마농 [2018.04.10 13:14:33]

아!. 저는 레코드 단위 계산으로만 생각했네요.
전체 데이터를 루프 돌아야 하는 거군요.


by 마농 [2018.04.10 13:26:52]
WITH t AS
(
SELECT 1 rn, 100 a1, 200 a2 FROM dual
UNION ALL SELECT 2, 300, 100 FROM dual
)
SELECT *
  FROM (SELECT gb, rn
             , CASE WHEN b - p < 0 THEN 0
                    WHEN b - p > a THEN a
                    ELSE b - p
                END a
          FROM (SELECT 500 p
                     , gb, rn, a
                     , SUM(a) OVER(ORDER BY gb, rn) b
                  FROM t
                 UNPIVOT (a FOR gb IN (a1, a2))
                )
        )
 PIVOT (MIN(a) FOR gb IN ('A1' a1, 'A2' a2))
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입