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

오라클 PLSQL %TYPE, %ROWTYPE 속성

오라클 PLSQL %TYPE, %ROWTYPE 속성

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

3.1.4 %TYPE 속성

n 실무에서 테이블의 모든 칼럼에 대해 데이터 타입 및 길이를 정확히 알고 있을 수는 없고, 가끔 칼럼 사이즈는 변하기도 한다. 이 경우 %TYPE 속성을 사용한다면 능동적으로 대처할 수 있다.

n 변수의 데이터 타입을 어떤 테이블의 어떤 칼럼과 같이 하라는 의미 또는 이전에 정의한 다른 변수와 타입을 같이하라는 의미를 지닌다.

DECLARE

v_ename emp.ename%TYPE;

v_sal emp.sal%TYPE;

tot_sal v_sal%TYPE;

3.1.5 %ROWTYPE 속성

n SELECT LIST에서 전체 칼럼을 선택해서 변수에서 받을 때(SELECT * ) 유용하게 이용된다.

n 어떤 테이블의 ROW(로우, 행, 레코드)와 타입을 같이 하라는 속성이다.

n 테이블의 칼럼에 대해 잘 모르는 경우, 칼럼의 속성들이 자주 변하는 경우에 유용하다.

SQL> edit ojc10

SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE ojc10(p_empno IN NUMBER)

IS

emp_record emp%ROWTYPE;

BEGIN

SELECT *

INTO emp_record

FROM emp

WHERE empno = p_empno ;

DBMS_OUTPUT.PUT_LINE(emp_record.empno || ',' || emp_record.ename || ',' || emp_record.sal || ',' || emp_record.deptno);

END;

/

SQL> @ojc10

프로시저가 생성되었습니다.

SQL> exec ojc10(7369)

7369,SMITH,4500,20

(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...