2020년 7월 19일 일요일

PL/SQL Bind(Host) 변수, 바인드, 호스트 변수

PL/SQL Bind(Host) 변수, 바인드, 호스트 변수

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=569

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

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...