트리거 처리 관련 문의 0 4 545

by 햇살가득 [SQL Query] [2018.05.28 10:57:42]


안녕하세요. 평소 많은 사이트에서 많은 도움을 받고 있습니다.

개발 테스트 도중 궁금한 사항이 있어 아래와 같이 문의 드리려고 합니다.

고수님들 도움 부탁드립니다. 

 

1. 현재 상황

   : 트리거에 동적쿼리 작성 후 db_link를 통하여 타 DB DML 처리 Test 중

2. 작성 구문(일부)

     ls_query   :=  'UPDATE order_test@link_test' 
                      ||  ' SET    rmk      =''' || :NEW.rmk            ----- ①
                      || ''' WHERE  type  =' ||  'test'                   ----- ②
                      ||  ' AND   ord_no  =''' || :OLD.old_no  || '''';  ----- ③

     EXECUTE IMMEDIATE ls_query;  

3. 문의 사항

  ①    :NEW.rmk 의 앞에 ''를 붙이는 이유

  ②   트리거 컬럼값이 아닌  'test' 라는 문자값으로 조건 지정 시 ' 만 붙이는 문법이 맞는지(' 만 붙여도 처리는 정상적으로 됩니다.)

  ③   쿼리 종료 시점에 컬럼값에 '' 값을 추가로 붙여야만 하는 이유( 마지막에 '' 를 붙이지 않으면 오류가 나더군요. ㅠ)

  ④   트리거 컬럼값이 아닌 문자나 숫자로 업데이트 할 경우 ' 마크의 올바른 선언 방법

※ 질문이 좀 많네요. 부탁드립니다. 

 

 

 

by 마농 [2018.05.28 11:21:44]

지금 눈에 보이는 따옴표는 코딩용 따옴표입니다.
ls_query 변수에 저장된걸 실행될 때 사용되는 따옴표는 다릅니다.
ls_query 변수에 어떤 형태로 저장되어 있는지 확인하세요.
저장될 때 따옴표 안의 따옴표 두개가 따옴표 한개입니다.
예) ''''  ==> ' (밖의 양쪽 따옴표는 문자를 감싸는 따옴표, 안의 따옴표 두개가 하나의 따옴표를 의미함
예) '''aa''' ==> 'aa'
예) 'aa' ==> aa

다음 쿼리 실행해서 실제 실행구문 확인하세요.

SELECT 'UPDATE order_test@link_test'
    || ' SET rmk = ''' || 'aaaa'
    || ''' WHERE type =' ||  'test'
    || ' AND ord_no = ''' || 'bbbb' || ''''
  FROM dual
;


test 부분은 잘못 작성되었습니다.
정상수행되는 부분은?
1. test 라는 컬럼이 존재한다거나?
2. 오류가 발생했지만 Exception 처리되면서 인지하지 못하는 경우?


by 햇살가득 [2018.05.28 17:58:08]

Test는 부분은 숫자로 사용하고 있었습니다.

과정중에 작성된 쿼리를 그 부분만 제가 'test'라는 문자로 바꿨던게 혼란을 드렸던것 같습니다.

좋은 지적과 더불어 팁 역시 감사 드립니다.


by 오라리 [2018.05.28 11:29:57]

참고만 해주시면 됩니다..^^

작성 구문만 보았을때 테이블이나 컬럼이 동적으로 바뀐다든지 하는 경우는 아닌것으로 보아 immediate 구문을 위한 SQL 조합(?)은 불필요 하다고 생각합니다. 그저 다음과 같은 구문으로 처리해도 문제는 없을것 같습니다. 

UPDATE order_test@link_test
SET rmk = :NEW.rmk
WHERE type = 'test' 
  AND ord_no = :OLD.old_no
;

대부분의 문의사항이 '(apostrophe) 사용 방법인것 같은데요.. 간단히 문자형 대입때는 쓰시고 숫자형 대입때는 사용하지 않으셔도 됩니다. 또한, 3번 같은 경우에는 맨 처음 시작하는 ('UPDATE) 아포스트로피의 짝꿍으로 보시면 될것 같습니다. 

틀린부분은 지적 부탁 드립니다. 


by 햇살가득 [2018.05.28 17:55:40]

감사합니다. 그렇게 보니 이해가 되네요.

그리고 컬럼값은 db_user, Link 명을 동적으로 받아 올 예정입니다.

과정중에 있는 쿼리를 작성하다보니 혼란을 드렸습니다.

감사합니다.

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