유저가 웹 시스템에서 갱신하고싶은 부품을 선택해서 갱신 의뢰를 보냅니다. 이때 단품, 부모자식품(부모부품, 자식부품)로 종류가 나늬는데 유저의 갱신 의뢰 부품이 부모부품이거나, 자식부품이면 관련된 모든 부모자식품을 찾아서 항목을 갱신해주려합니다.(부모부품은 자식부품들의 합계로 견적치를 갱신한다거나 하거든요)
유저가 의뢰한 부품에대해서 관련된 부모자식품을 다 검색하는 쿼리는 만드는데 성공했습니다. 이걸 UPDATE하는것에서 막혀있습니다.
먼저 검색 쿼리를 적겠습니다.
SELECT DISTINCT TM.INZU
FROM T_MITUMORI TM,
(SELECT * FROM T_MITUMORI WHERE MITUMORI_ID = 1031 AND MITUMORI_KBN = '1' ) TM2
WHERE TM2.MITUMORIIRAI_NO = TM.MITUMORIIRAI_NO
AND (
((CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM2.OYA_BUHIN_NO
ELSE TM2.BUHIN_NO END)
= (CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM.BUHIN_NO
ELSE TM.OYA_BUHIN_NO END) AND TM2.SUFFIX = TM.SUFFIX)
OR (TM2.OYA_BUHIN_NO = TM.OYA_BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX)
OR (TM2.BUHIN_NO = TM.BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX))
)
이렇게 적었습니다. 원래 TM2의 조건문에 1031이랑 '1'은 변수인대 테스트용으로 넣어둔 것일 뿐입니다.
DISTINCT는 유저가 동시에 여러부품을 의뢰를 보낼수 있는데 복수의 부품이 같은 부모자식관계에 있을 경우에 대비해서 넣은것입니다.
저 SELECT한 VIEW를 UPDATE에서 사용하려고 하면 ora 01732 뷰에 대한 데이터 조작이 부적합합니다. 가 나오더라구요.
UPDATE
(
SELECT DISTINCT TM.INZU
FROM T_MITUMORI TM,
(SELECT * FROM T_MITUMORI WHERE MITUMORI_ID = 1031 AND MITUMORI_KBN = '1' ) TM2
WHERE TM2.MITUMORIIRAI_NO = TM.MITUMORIIRAI_NO
AND (
((CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM2.OYA_BUHIN_NO
ELSE TM2.BUHIN_NO END)
= (CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM.BUHIN_NO
ELSE TM.OYA_BUHIN_NO END) AND TM2.SUFFIX = TM.SUFFIX)
OR (TM2.OYA_BUHIN_NO = TM.OYA_BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX)
OR (TM2.BUHIN_NO = TM.BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX))
)
SET INZU = 1
UPDATE테이블에 뷰를 넣는게 아니라 SET이랑 조건문에 뷰를 넣어서 할수도 있을 것 같기는한데...왠지 퍼포먼스적으로 너무나도 나쁠 것 같아서 위의 방법으로 하는게 맞지 않나싶은데 잘 되지않아 여쭤봅니다.