안녕하세요. 평소 많은 사이트에서 많은 도움을 받고 있습니다.
개발 테스트 도중 궁금한 사항이 있어 아래와 같이 문의 드리려고 합니다.
고수님들 도움 부탁드립니다.
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' 라는 문자값으로 조건 지정 시 ' 만 붙이는 문법이 맞는지(' 만 붙여도 처리는 정상적으로 됩니다.)
③ 쿼리 종료 시점에 컬럼값에 '' 값을 추가로 붙여야만 하는 이유( 마지막에 '' 를 붙이지 않으면 오류가 나더군요. ㅠ)
④ 트리거 컬럼값이 아닌 문자나 숫자로 업데이트 할 경우 ' 마크의 올바른 선언 방법
※ 질문이 좀 많네요. 부탁드립니다.
지금 눈에 보이는 따옴표는 코딩용 따옴표입니다.
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 처리되면서 인지하지 못하는 경우?
참고만 해주시면 됩니다..^^
작성 구문만 보았을때 테이블이나 컬럼이 동적으로 바뀐다든지 하는 경우는 아닌것으로 보아 immediate 구문을 위한 SQL 조합(?)은 불필요 하다고 생각합니다. 그저 다음과 같은 구문으로 처리해도 문제는 없을것 같습니다.
UPDATE order_test@link_test SET rmk = :NEW.rmk WHERE type = 'test' AND ord_no = :OLD.old_no ;
대부분의 문의사항이 '(apostrophe) 사용 방법인것 같은데요.. 간단히 문자형 대입때는 쓰시고 숫자형 대입때는 사용하지 않으셔도 됩니다. 또한, 3번 같은 경우에는 맨 처음 시작하는 ('UPDATE) 아포스트로피의 짝꿍으로 보시면 될것 같습니다.
틀린부분은 지적 부탁 드립니다.