procedure나 function에서 동적 쿼리 사용할 때 쿼리 자체에 따옴표가 있는 경우 관리하기가 까다롭죠.
쿼리를 바꾸려면 문자열 다 가지고 와서 ''를 '로 수정하고 쿼리 변경하고 다시 '를 ''로 바꾸고 뭐 이런 과정을 거치는데요.
10g 이후에 따옴표에 대한 처리를 할 수 있게 기능이 추가되어서 한번 적어봅니다.
DECLARE V_SQL VARCHAR2(4000); V_RESULT VARCHAR2(4000); BEGIN V_SQL := q'[select 'abcde' from dual where '1' = '1' ]' || q'[and '2' = '2']' ; EXECUTE IMMEDIATE V_SQL INTO V_RESULT; DBMS_OUTPUT.PUT_LINE(V_RESULT); END;
q'[ 문자열 ]' 이런 식으로 작성하시면 됩니다.
다들 아시는 내용인가요?^^;
대문자 Q 도 상관 없구요.
대괄호가 쿼리문에 포함되는 경우(정규식 등) 주의해야 겠네요.
대괼호 대신 다른문자로도 대체 가능합니다.
SELECT q'[select 'abcde' from dual where '1' = '1' ]' || q'[and '2' = '2']' -- || Q'[and REGEXP_LIKE(col, '[^0-9]')]' -- 대괄호가 중간에 닫히면서 오류 발생 || Q'{and REGEXP_LIKE(col, '[^0-9]')}' || Q'$and REGEXP_LIKE(col, '[^0-9]')$' FROM dual ;
역시 저처럼 어설프게 아는 것보다는 메뉴얼을 통해서 확실히 알아야겠습니다.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm