2010년 5월 31일 월요일

SQL*Plus : 치환 변수 및 Bind 변수

치환 변수 및 Bind 변수

===================================
 SQL*Plus : 치환 변수 및 Bind 변수 
===================================
# 치환 변수 : 교재 2-22 : &, &&, define, undefine, accept 
            :  
http://download.oracle.com/docs/cd/B10501_01/server.920/a96539/scripts.htm#31516 

#
& 에 관한 설명 
SQL> select * from emp 
 2  where deptno = &sv_deptno;
-- 위와 같은 명령을 치면
-- 아래와 같이 sv_deptno의 값을 입력하라는 메세지를 나타낸다. 
 Enter value for sv_deptno: 10 
-- 10을 입력하면 deptno = 10 에 대한 결과가 select 된다.
SQL> / 
-- '/'는 이전 sql문을 다시 실행하겠다는 의미이다.
-- 위의 sql문을 다시 실행하고 또 sv_deptno를 입력하라고 한다.
 Enter value for sv_deptno: 30 
-- 30을 입력하면 이번엔 deptno=30에 대한 결과를 select한다.

--------------   

SQL> select * from emp 
 2  where ename = &sv_ename; 
 Enter value for sv_ename: SMITH 
에러 : ORA-00904: "SMITH": invalid identifier 
-- 그냥 문자를 입력하면 error다. quota''안에 넣어야한다.
SQL> / 
-- 다시 실행

 Enter value for sv_ename: 'SMITH'
-- 'SMITH'를 입력, ename='SMITH'에 대해 select 함 

SQL> select * from emp 
 2  where ename = upper('&sv_ename'); 
 Enter value for sv_ename: sMiTH 
-- 애초에 받아들일 때 upper('&sv_ename')이라고 하면 sMiTH라고 입력을 해도 SMITH라고 입력하고 quota안에 넣어서 처리한다.

#
&& 에 관한 설명
 
SQL> select empno, ename, &&col_name 
 2  from emp 
 3  order by &col_name; 
 Enter value for col_name: deptno 
-- &&를 사용해서 입력된 deptno는 저장되고, 3행에서 order by절에서도 deptno가 사용된다.

SQL> define 
    -- 현재 define되어있는 목록을 볼 수 있다.
    -- 기본적으로 수개가 정의되어 있다.
    -- 위의 &&가 포함된 select문을 실행하고 define으로 확인하면, 
 DEFINE COL_NAME        = "deptno" (CHAR)
    -- 위와 같이 정의되있는 것을 볼 수 있다.
 
SQL> ed s1.sql
    -- ed [파일명]을 하면, 파일이 존재하면 그 파일이 열리고, 존재하지 않으면 새로만든다.
    -- instant client batch파일이 있는 곳에 생성된다.
 
 select empno, ename, &&col_name 
 from emp 
 order by &col_name; 
 undefine col_name 
-- empno와 ename, 그리고 추가로 하나의 입력될 값을 출력하고, 입력한 값으로 order by 하는 기능
-- 마지막줄에 undefine을 하여 한번 저장된 값을 지운다.

SQL> @s1 
-- 골뱅이 s1을 하면 아까 저장한 s1파일이 실행된다.
 Enter value for col_name: deptno 
SQL> @s1 
 Enter value for col_name: sal 
SQL> @s1 
 Enter value for col_name: comm 

#
Accept에 관한 설명 

SQL> ed s2
    -- 새로운 s2 메모장을 연다. 
 accept sv_deptno number prompt '부서 번호를 입력하세요 : '  
 select * from emp 
 where deptno = &sv_deptno; 
    -- sv_deptno라는 값을 number로 받아들이는데, 그 프롬프트를 '부서 번호를 입력하세요 : '라고 한다. 입력된 값을 deptno = 에 이어 실행.
    -- accept의 기능은 치환변수를 입력 받는 프롬프트를 변경하는 것

SQL> @ s2 
 부서 번호를 입력하세요 : 10 
SQL> define 
 DEFINE SV_DEPTNO       =         10 (NUMBER) 
    -- s2를 실행한 후 define으로 확인해보면 맨 밑에 줄에 위와 같이 정의되어있는 것을 볼 수 있다.

#
define
  
SQL> ed s3 
 define sv_deptno=30 
 select * from dept 
 where deptno = &sv_deptno; 
 select * from emp 
 where deptno = &sv_deptno; 
 select * from emp e, dept d 
 where e.deptno = d.deptno 
 and d.deptno = &sv_deptno; 
 undefine sv_deptno 
-- define을 해서 변수에 값을 지정하면 &을 사용해서 매번 값을 물을 때마다 define된 값을 사용한다.

SQL> @ s3 

#
&숫자

SQL> ed s4

select empno, ename, &1
from emp
where deptno = &2;
    -- &1, &2를 지정해 놓고

SQL> @s4 sal 10
    --@s4를 실행하면서 sal 과 10을 파라미터로 주면, &1=sal, &2=10이 저장되어 실행된다.
SQL> @s4 comm 30
    -- 위와 마찬가지

 - &숫자 + define + 여러 파일 연동

SQL> ed a001.sql

 define deptno = &1

 select * from dept
 where deptno = &deptno;

SQL> @a001 10

SQL> ed a002.sql

 define sal = &1

 select * from emp
 where sal >= &sal;

SQL> @a002 1000

SQL> ed mksam.sql

 define sv_deptno = &1
 define sv_sal    = &2

 @a001 &sv_deptno
 @a002 &sv_sal

SQL> @mksam.sql 10 1000
    --파일을 실행할 때 여러개의 파일을 연동하여 실행해도 가능

 - column 명령의 new_value 옵션 : http://blog.naver.com/orapybubu/40067499679

SQL> ed s5

 col avg_sal new_value sv_avg_sal

 select avg(sal) as avg_sal
 from emp;

 select * from emp
 where sal > &sv_avg_sal;

SQL> @s5

# Bind 변수 (Host 변수)

SQL> variable gv_sal number
            -- gv_sal 이라는 number형태의 변수를 만든다.

SQL> begin
 2    select sal into :gv_sal
 3    from emp
 4    where empno = 7788;
 5  end;
 6  /
        -- gv_sal이라는 곳에다가 empno가 7788인 사원의 sal을 넣는다.
        -- ... sal into :gv_sal ...

SQL> print gv_sal

   GV_SAL
----------
     3000
        -- gv_sal을 출력해본다.

SQL> select * from emp
 2  where sal >= :gv_sal;
        -- :gv_sal 을 사용해서 앞서 저장된 gv_sal을 사용할 수 있다.

댓글 없음:

댓글 쓰기