TRIGGER에서 INSERT 질문드립니다 0 15 1,883

by 클론울프 [PL/SQL] TRIGGER [2016.03.04 17:50:23]


특정 테이블에서 자료 삭제시 삭제된 자료를

동일한 구조의 다른 테이블로 INSERT하고자 합니다.

문제는 필드의 갯수가 너무 많아서 일일히
이런식으로 할려니 엄두가 안납니다.

INSERT INTO TABLE_B VAULES (
:OLD.FLD1, :OLD:FLD2 ..................................................
OLD.FLD1024)
WHERE FLD1 = OLD.FLD1

혹시

INSERT INTO TABLE_B 
SELECT :OLD.* FROM TABLE_A 
WHERE FLD1 = OLD.FLD1

이런 식으로 표현할 수없나요?

 

by 겸댕2후니 [2016.03.04 17:58:51]
위의 구문은 안되는걸로 알고있습니다.ㅠㅠㅠㅠ

아래와 같은 쿼리로, 모든컬럼에 대해서 뽑은 후, 사용하시면 될 듯 합니다.

현재 테스트 할 수가 없고, 사용한지가 오래되어 아래 쿼리가 확실치 않습니다.(컬럼명 OR 테이블명)

 

참고만 하시기 바랍니다^^;

select WM_CONCAT(':old.'||column_name)
 from user_tab_columns
 where table_name = '테이블명';

 


by 클론울프 [2016.03.07 09:05:34]

오! 이런 방법이 있었군요. 감사합니다

해결책이 보입니다


by swlee710 [2016.03.04 18:25:10]

겸댕2후니님 오타요..

WM_CONCAT(':old.'||column_name, ',') -> WM_CONCAT(':old.'||column_name)


by 겸댕2후니 [2016.03.07 10:18:24]

지적 감사합니다^^;


by 클론울프 [2016.03.07 13:31:04]
감사합니다. :)
혹시 아래 문장은 뭐가 문제일가요?
select (select wm_concat(':old.' || column_name) from user_tab_colums
where table_name = '인사테이블' order by column_id),
'작업자', '작업', sysdate
from 인사테이블

대충 이런식으로 할려는데 order by가 오류가 뜨네요

따로 분리해서 실행하면 문제가 없는데 괄호로 묶기만 하면 안되네요

 


by 겸댕2후니 [2016.03.07 13:37:49]

우선 테이블명이 틀렸네요.

from user_tab_colums

-> from user_tab_columns


by 클론울프 [2016.03.07 13:54:15]

헛! 그건 오탈자입니다. 실제 실행할때는 오탈자 없습니다 ㅠㅠ


by 겸댕2후니 [2016.03.07 14:27:39]

위에 말씀드린 쿼리로 해당 텍스트 출력해서,

:old.* 부분을 치환해서 사용하세요~


by 마농 [2016.03.07 13:55:06]

알려드린 방법은 필요로 하는 문자열을 생성해 내는 방법을 알려드린 것입니다.
쿼리에 의해 생성된 문자열을 이용해 소스편집작업에 이용하라고 알려드린거에요.
소스에 직접적으로 적용할 수 있는 방법이 아닙니다.
또한, 직접적으로 매번 쿼리로 읽어와 적용할 필요성도 없구요.
소스 편집작업은 어차피 단 한번 뿐입니다.


문법적으로는 order By 절을 거기에 사용할 수 없구요.
정렬된 형태의 결과물을 원한다면?
wm_concat 은 아쉽게도 정렬기능이 없네요.
listagg 를 이용하세요.
http://www.gurubee.net/article/55512


by 겸댕2후니 [2016.03.07 14:26:28]
성능상으론 이점이 없지만.. 

wm_concat은 출력행 순서로 문자열을 붙이는걸로 알고 있는데

만약 wm_concat을 이용해서 정렬된 내용이 필요하다면

서브 쿼리로 수행하면 될듯한데. 아닌가요?



select wm_concat(':old.' || column_name) 


from (


select *


from user_tab_colums


where table_name = '인사테이블' 


order by column_id);

 


by 클론울프 [2016.03.07 14:26:30]

아차! 그렇네요. 획득한 문자열을  소스에 카피해 넣으면 되는걸 SQL자체에서 해결할려고

무리수를 뒀군요. 감사합니다.


by 마농 [2016.03.07 14:30:45]

wm_concat 는 정렬된 결과대로 합쳐지져서 나오지는 않습니다.


by 클론울프 [2016.03.07 14:57:05]

네 ORDER BY로 해도 정렬이 되지 않더군요 ㅠㅠ

마농님이 링크걸어주신 포스팅으로 해결했습니다. 감사합니다


by 마농 [2016.03.07 14:59:42]

겸댕2후니 님이 제시한 방법대로 인라인뷰 안에서 정렬해 봤습니다.
정렬 결과대로 나오긴 하네요.


GROUP BY 와 함께 사용했을 때와 GROUP BY 가 없을 때의 결과가 차이가 나네요.
GROUP BY 가 없을 때는 조회 순서대로 합쳐지고요
GROUP BY 가 있을 때는 결과물의 순서를 예측 할 수 없네요.


하지만 지금 결과가 잘 나온다고 해서
나중에도 잘 나오리란 보장은 없습니다.
예전에 9i 에서 10g 로 넘오올 때 Group By 의 결과가 정렬되지 않았던 것 처럼요.


정렬된 결과물을 얻기 위해서는 정렬구문이 확실하게 보장되는 구문을 권하고 싶네요.


by 겸댕2후니 [2016.03.07 15:35:39]

항상 좋은답변 감사드립니다^^

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