3.1.6 Bind(Host) 변수
n Bind변수는 실행계획이 세워진 후 그 값이 결정되는 변수이며 값이 바뀌더라도 실행계획에는 영향을 주지 않는다.
n SQL, PL/SQL에서 사용가능하며 SQL에서 사용하는 경우 Variable로 선언해 줘야 하며 PL/SQL Code에서 사용될 때 콜론(:)을 앞에 붙여 사용한다.
n 호스트환경에서 선언되므로 Host 변수 라고도 하며 PL/SQL 블록이 실행된 후에도 접근 가능하다.
n PRINT명령으로 값을 확인 할 수 있다.
-- 아래는 바인드변수를 이용하여 EMP 테이블의 ENAME 값을 출력했다.
SQL> edit ojc11
--바인드변수 자동출력 set autoprint on variable b_ename varchar2(20) declare begin select ename into :b_ename from emp where ename = 'SMITH'; end; /
SQL> @ojc11 PL/SQL 처리가 정상적으로 완료되었습니다.
B_ENAME -------------------------------- SMITH
-- 아래 예문을 통해 바인드변수 처리했을 때와 안했을 때의 차이에 대해 이해하자. SQL> alter system flush shared_pool; SQL> edit ojc12
variable v_empno1 number variable v_empno2 number declare v_ename emp.ename%TYPE; begin :v_empno1 := 7369; :v_empno2 := 7788; -- 아래 두문장은 동일한 SQL로 인식 execute immediate 'select ename from emp where empno = :1' using :v_empno1; execute immediate 'select ename from emp where empno = :1' using :v_empno2;
--아래 두문장은 서로다른 SQL로 인식된다. execute immediate 'SELECT ENAME FROM EMP WHERE EMPNO = ' || :v_empno1; execute immediate 'SELECT ENAME FROM EMP WHERE EMPNO = ' || :v_empno2; end; /
SQL> @ojc12 PL/SQL 처리가 정상적으로 완료되었습니다.
-- Bind변수 처리한 SQL은 두문장이 동일한 SQL로 인식됨을 알수있다. SQL> select sql_text from v$sql where lower(sql_text) like ('%emp%');
SELECT ENAME FROM EMP WHERE EMPNO = 7788 select ename from emp where empno = :1 SELECT ENAME FROM EMP WHERE EMPNO = 7369
SQL> alter system flush shared_pool; SQL> edit ojc13
variable v_empno1 number variable v_empno2 number declare v_ename emp.ename%TYPE; v_empno3 number := 7521; v_empno4 number := 7566; begin :v_empno1 := 7369; :v_empno2 := 7788;
-- 아래 두문장은 바인드변수처리되어 동일한 SQL문장으로 인식 -- SQL문장을 대문자로 변경한 후 전송 -- v_empno1, v_empno2 변수는 이름이 :B1 형태로 변환 SELECT /*+ ojcedu0 */ ename into v_ename FROM emp where to_char(empno) = :v_empno1; SELECT /*+ ojcedu0 */ ename into v_ename FROM emp where to_char(empno) = :v_empno2;
-- 아래 두문장도 동일한 SQL인식 -- SQL문장을 대문자로 변경한 후 전송 -- v_empno3, v_empno4 변수는 이름이 :B1 형태로 변환 select /*+ ojcedu1 */ ename into v_ename from emp where empno = v_empno3; select /*+ ojcedu1 */ ename into v_ename from emp where empno = v_empno4;
-- 아래 두문장은 서로다른 SQL문장으로 인식 select /*+ ojcedu2 */ ename into v_ename from emp where empno = 7369; select /*+ ojcedu2 */ ename into v_ename from emp where empno = 7788;
end; /
SQL> @ojc13 PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> select sql_text from v$sql where lower(sql_text) like ('%ojcedu%'); SELECT /*+ ojcedu1 */ENAME FROM EMP WHERE EMPNO = :B1 SELECT /*+ ojcedu2 */ ENAME FROM EMP WHERE EMPNO = 7788 SELECT /*+ ojcedu0 */ ENAME FROM EMP WHERE TO_CHAR(EMPNO) = :B1 SELECT /*+ ojcedu2 */ ENAME FROM EMP WHERE EMPNO = 7369
|