티스토리 뷰

반응형

목차

 

 


 

ORACLE - DEFINE. SELECT에서 사용 하기

 

SQL을 작성하다 보면 SELECT문을 사용할 때 WHERE절에 동적으로 변수를 받아야 하는 일이 많습니다. Tool을 사용할 경우에 계속해서 변수들의 값을 변경해가며 테스트를 할 일이 생기기 마련인데요. 서브 쿼리를 많이 사용하게 되는 경우, 하나의 SQL에서 동일한 값의 변수들을 여러 번 대입하여 사용하는 일이 생깁니다.

 

일일이 변수들의 값을 변경하게 되면 시간도 낭비되고 실수를 할 수도 있지요. 그럴 때 DEFINE을 사용하여 변수들의 값을 할당해주면 실수도 적어지고 매우 편리합니다.

 

Spring Boot에 Mybatis를 사용하여 SQL을 작성하는 경우에도 필요한데요. 사용방법에 대해서 알아보도록 하겠습니다.

 

 

 

 

DEFINE 변수 선언

먼저 사용할 변수를  DEFINE으로 선언해줍니다. 

DEFINE USER_NAME = 'admin';

 

 

 

 

SELECT문 작성

 

DEFINE으로 선언한 변수명 앞에 '&'를 붙여주면 조건문에 사용할 수 있습니다.

 

SELECT *
FROM TEST_TABLE
WHERE NAME = &USER_NAME

 

하지만, 이렇게 실행을 하면 아마도 오류가 날 겁니다.

 

 

 

 

주의사항

 

아까 작성했던 SQL문이 변수의 대입이 아닌 문자열로 완성되면 다음과 같이 실행될 것입니다.

 

DEFINE USER_NAME = 'admin';

SELECT *
FROM TEST_TABLE
WHERE NAME = admin

 

자세히 보면 뭔가 이상한 점이 보이지요?

 

그렇습니다.

 

NAME = admin 이 부분이 이상합니다.

NAME = 'admin' 이라고 작성되어야 정상적으로 SQL문이 실행될 테지요.

 

 

왜 그런 것일까요?

 

 

DEFINE은 단순하게 변수를 대입하는 것이 아닙니다. 선언된 변수는 text, 즉 문자열로 인식합니다.

 

SQL문에 DEFINE 변숫값을 문자열로 이어 붙이기를 하는 것이지요.

 

 

그렇다면 어떻게 사용해야 할까요?

 

 

 

 

해결 방법

 

다음과 같이 변수를 선언해주면 정상적으로 작동합니다.

 

DEFINE USER_NAME = ''admin'';

SELECT *
FROM TEST_TABLE
WHERE NAME = &USER_NAME

 

문자열로 인식하기 때문에 ''으로 한번 더 감싸주어야 합니다. 

 

 

 

SELECT *
FROM TEST_TABLE
WHERE NAME = 'admin'

 

한번 더 감싸주게 되면 위와 같은 SQL문 결과가 나옵니다.

정상적으로 실행되겠지요.

 

 

 

 

응용 방법

 

이렇게 되면 응용을 할 수도 있습니다. SQL문을 추가로 붙여 넣을 수 있게 되는 것이지요.

예를 들어보도록 하겠습니다.

 

DEFINE USER_NAME = 'AND NAME = 'admin'';

SELECT *
FROM TEST_TABLE
WHERE 1=1
&USER_NAME

 

AND TEXT = 'admin' 값을 가지는 USER_NAME 변수를 대입시키면 아래와 같은 SQL문 결과가 나오겠지요.

 

 

SELECT *
FROM TEST_TABLE
WHERE 1=1
AND NAME = 'admin'

이런 식으로 응용이 가능하다는 것입니다.

동적인 변수가 많은 상황에서의 SQL 검증이 필요할 때 사용하면 유용하겠지요.

 

 

 

 

마무리

 

이상 ORACLE에서 DEFINE을 SELECT문을 사용하는 방법에 대해서 알아보았습니다.

 

 

반응형