'Oracle/PL_SQL'에 해당되는 글 11건

  1. 2009.11.28 trigger(primary key & foreign key 관련)
  2. 2009.11.18 instead of trigger
  3. 2009.11.18 print_table프로시져 만들기
  4. 2009.11.17 trigger
  5. 2009.11.17 package의 overloading
  6. 2009.11.16 테이블 변경시 관련 procedure, function, package 확인
  7. 2009.11.16 wrap pld
  8. 2009.11.13 Exception handling
  9. 2009.11.12 Cursor
  10. 2009.11.12 PLS_INTEGER 1
Oracle/PL_SQL2009. 11. 28. 00:20
부모와 자식의 관계인 t1과 t2테이블이 있다.
t1테이블에 데이터가 update되면 관련된 t2테이블의 데이터도 같이 변경되는
간단한 트리거를 만들어보자.

처음에는 테이블 생성시 on delete cascade 옵션과 같이
on update cascade가 있는 줄 알았는데 그런건 없고, 따로 트리거를 만들어야 한다.

아래와 같이 t1과 t2 테이블 2개를 생성한다. t1과 t2는 부모와 자식관계이다.

create table t1
(col1 number,
 primary key(col1));

create table t2
(col1 number,
 col2 varchar2(10),
 foreign key(col1) references t1(col1));


t1과 t2에 데이터를 넣는다.

insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);

insert into t2 values(1, 'a');
insert into t2 values(2, 'b');
insert into t2 values(3, 'c');


트리거를 생성한다.
 (물론 유저는 create trigger 권한이 있어야한다.)

create or replace trigger tri1
after update on t1
for each row
begin
  update t2
  set col1=:new.col1
  where col1=:old.col1;
end;
/


 t1테이블에 데이터를 입력해본다.

update t1
set col1=9
where col1=1;

데이터가 잘 변경되었음을 확인한다.

select * from t1;
select * from t2;



cf. 테이블 생성시 on delete cascade 옵션에 따른 간단한 테스트


create table t1
(col1 number,
 primary key(col1));

create table t2
(col1 number,
 col2 varchar2(10),
 foreign key(col1) references t1(col1) on delete cascade);

insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);

insert into t2 values(1, 'a');
insert into t2 values(2, 'b');
insert into t2 values(3, 'c');

delete from t1 where col1=1;

select * from t1;
select * from t2;

'Oracle > PL_SQL' 카테고리의 다른 글

instead of trigger  (0) 2009.11.18
print_table프로시져 만들기  (0) 2009.11.18
trigger  (0) 2009.11.17
package의 overloading  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 18. 15:42
instead of trigger는 뷰에 대한 문장으로 변경 수행되는 것을 가능하게 한다.

다음의 예제는 뷰에 대하여 insert 문장을 수행할 경우
그 문장이 테이블에 대한 insert 문장으로 변경되도록 하는 예제이다.


실습용 테이블을 테이블을 만든다.
기존에 테이블이 있을 경우를 대비해 삭제 명령어도 넣었다.

SQL> drop table t1 purge;
SQL> create table t1
         (col1 varchar2(4),
          col2 varchar2(2),
          col3 varchar2(2),
          col4 varchar2(10));


다음으로 뷰를 생성한다.

create or replace view v1
as
select col4
from t1;


트리거를 생성한다.
8개의 문자가 뷰에 insert가 되면 테이블에 나눠서 입력되는 트리거이다.

SQL>create or replace trigger t1_v1_tri
         instead of insert on v1
        begin
            insert into t1 (col1, col2, co3)
        values(substr(:new.col4,1,4),substr(:new.col4,5,2),substr(:new.col4,6,2));
        end;
        /


뷰에 insert를 해본다.

SQL> insert into v1 values ('20091126');


결과를 확인해본다.

SQL> select * from t1;


결과가 잘 들어간 것을 확인할 수 있다.

COL1 COL2 COL3 COL4
2009 11 12  


출처 : http://blog.naver.com/gseducation?Redirect=Log&logNo=20092680151

'Oracle > PL_SQL' 카테고리의 다른 글

trigger(primary key & foreign key 관련)  (0) 2009.11.28
print_table프로시져 만들기  (0) 2009.11.18
trigger  (0) 2009.11.17
package의 overloading  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 18. 14:39


create or replace procedure print_table( p_query in varchar2 )
AUTHID CURRENT_USER
is
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_descTbl       dbms_sql.desc_tab;
    l_colCnt        number;
begin
    execute immediate
    'alter session set
        nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';

    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    dbms_sql.describe_columns
    ( l_theCursor, l_colCnt, l_descTbl );

    for i in 1 .. l_colCnt loop
        dbms_sql.define_column
        (l_theCursor, i, l_columnValue, 4000);
    end loop;

    l_status := dbms_sql.execute(l_theCursor);

    dbms_output.put_line( '-----------------' );
    while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value
            ( l_theCursor, i, l_columnValue );
            dbms_output.put_line
            ( rpad( l_descTbl(i).col_name, 30 )
              || ': ' ||
              l_columnValue );
        end loop;
        dbms_output.put_line( '-----------------' );
    end loop;
    execute immediate
        'alter session set nls_date_format=''dd-MON-rr'' ';
exception
    when others then
      execute immediate
          'alter session set nls_date_format=''dd-MON-rr'' ';
      raise;
end;
/

출처 : http://blog.naver.com/orapybubu?Redirect=Log&logNo=40021496289

'Oracle > PL_SQL' 카테고리의 다른 글

trigger(primary key & foreign key 관련)  (0) 2009.11.28
instead of trigger  (0) 2009.11.18
trigger  (0) 2009.11.17
package의 overloading  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 17. 18:50

trigger(이하 트리거)를 한국어로 번역하면 방아쇠다.
특정 이벤트가 발생하면 자동으로 돌아가는 블럭이라고 한다.

쓰는 형식은 다음과 같다.

create or replace trigger 트리거명
before insert or update of 컬럼명 on 테이블명
for each row
begin
    :new.ename := upper(:new.ename);
end;
/

before         이벤트가 일어나기 전에 실행
after            이벤트가 일어난 후에

for each row ->row trigger(행트리거)
                      없으면 statement trigger(문장 트리거)


그럼 trigger(이하 트리거)를 만들어 보자

트리거를 생성하고, 실습하기 위해 t1테이블을 생성해보자

drop table t1 purge;
create table t1
    (empno number primary key, 
     ename varchar2(10));

트리거를 생성하자. 아래의 트리거는 이름은 t1_ename_tri이고
t1테이블의 ename컬럼에 insert나 update가 row단위로 되면 실행되는 트리거이다.

create or replace trigger t1_ename_tri
before insert or update of ename on t1
for each row
begin
    :new.ename := upper(:new.ename);
end;
/


t1테이블에 데이터를 입력해본다.

insert into t1 values (1, 'aaa');
insert into t1 values (2, 'bbb');
commit;

들어간 데이터를 확인한다.

select *
from t1;

EMPNO ENAME
1 AAA
2 BBB


만약 t1테이블에 ename의 컬럼을 전부 대문자가 아닌, 첫 글자만 대문자로 입력하고 싶을 경우
아래와 같이 트리거를 수정한다.

create or replace trigger t1_ename_tri
before insert or update of ename on t1
for each row
begin
    :new.ename := initcap(:new.ename);
end;
/

데이터를 입력한다.

insert into t1 values (3, 'GGG');
commit;

트리거에 의해 데이터가 제대로 입력되었는지 확인한다.

select *
from t1;


EMPNO ENAME
1 AAA
2 BBB
3 Ggg


트리거 내부에서 에러가 나면 트리거를 유발한 작업이 실패한다.
절대로 안바뀌는 것은 프로그램단에 바뀔 여지가 있는 것은 서버단에 구현.
너무 트리거를 많이 만들지 말 것. 하나의 트리거가 수정되는 경우 연관된 트리거를 찾기가 쉽지 않다.


관련 예제) http://blog.naver.com/orapybubu?Redirect=Log&logNo=40025296984

'Oracle > PL_SQL' 카테고리의 다른 글

instead of trigger  (0) 2009.11.18
print_table프로시져 만들기  (0) 2009.11.18
package의 overloading  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
wrap pld  (0) 2009.11.16
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 17. 17:47
overloading이란?
같은 이름의 프로시져, 함수가 파라미터만 다르게 해서 여러개가 정의 가능합니다.


테스트를 하기 위해 테이블과 시퀀스를 생성합니다.

drop table t1 purge;
create table t1(col1 number, col2 number);

create sequence t1_col1_seq
start with 9999;





create or replace package over_pack
is
  procedure t1_insert_proc
    (p1 number,
     p2 number);
  procedure t1_insert_proc
    (p2 number);
end;
/

create or replace package body over_pack
is
    procedure t1_insert_proc
        (p1 number,
        p2 number)
    is
    begin
        insert into t1 values (p1, p2);
    end;

    procedure t1_insert_proc
        (p2 number)
    is
    begin
        insert into t1 values (t1_col1_seq.nextval, p2);
    end;
end;
/


패키지내의 하나씩 프로시져를 실행해본다.

exec over_pack.t1_insert_proc(10,100);
commit;

결과화면

COL1 COL2
10 100



두번째 프로시져를 실행해본다.

exec over_pack.t1_insert_proc(100);
commit;

결과화면
COL1 COL2
10 100
9999 100

서로 다른 프로시져가 실행된 것을 확인할 수 있다.

이것은 supplied package인 dbms_output에서도 확인가능하다.

dbms_output.put_line(1);

dbms_output.put_line('1');

'Oracle > PL_SQL' 카테고리의 다른 글

print_table프로시져 만들기  (0) 2009.11.18
trigger  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
wrap pld  (0) 2009.11.16
Exception handling  (0) 2009.11.13
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 16. 17:57
테이블 변경시에 관련된 프로시져를 확인하는 방법

anonymous procedure, function, package는 확인할 방법이 없고,
이름이 있는 procedure, function, package는 아래와 같이 확인


select *
from user_dependencies
where REFERENCED_NAME = 'EMP';


NAME TYPE REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE REFERENCED_LINK_NAME SCHEMAID DEPENDENCY_T
PROC1 PROCEDURE HR06 EMP TABLE   66 HARD
EMP_IFO PROCEDURE HR06 EMP TABLE   66 HARD
PACK1 PACKAGE HR06 EMP TABLE   66 HARD
PACK2 PACKAGE HR06 EMP TABLE   66 HARD
PACK_HR_MANAGEMENT PACKAGE HR06 EMP TABLE   66 HARD
PACK_HR_MANAGEMENT PACKAGE BODY HR06 EMP TABLE   66 HARD
UP_EMP_CNT_SUM_SAL PROCEDURE HR06 EMP TABLE   66 HARD
UP_ENAME_SAL_JOB PROCEDURE HR06 EMP TABLE   66 HARD


사용자가 정의한 procedure, function, package확인하는 방법

예)

select *
from user_source
where name = 'PROC1';


NAME TYPE LINE TEXT
PROC1 PROCEDURE 1 procedure proc1
PROC1 PROCEDURE 2 is
PROC1 PROCEDURE 3 v_sum_sal10 number;
PROC1 PROCEDURE 4 v_sum_sal20 number;
PROC1 PROCEDURE 5 begin
PROC1 PROCEDURE 6 select sum(sal) into v_sum_sal10
PROC1 PROCEDURE 7 from emp
PROC1 PROCEDURE 8 where deptno = 10;
PROC1 PROCEDURE 9  
PROC1 PROCEDURE 10 select sum(sal) into v_sum_sal20
PROC1 PROCEDURE 11 from emp
PROC1 PROCEDURE 12 where deptno = 20;
PROC1 PROCEDURE 13  
PROC1 PROCEDURE 14 dbms_output.put_line(chr(10));
PROC1 PROCEDURE 15  
PROC1 PROCEDURE 16 if v_sum_sal10 > v_sum_sal20 then
PROC1 PROCEDURE 17 dbms_output.put_line(10);
PROC1 PROCEDURE 18 elsif v_sum_sal10 < v_sum_sal20 then
PROC1 PROCEDURE 19 dbms_output.put_line(20);
PROC1 PROCEDURE 20 else
PROC1 PROCEDURE 21 dbms_output.put_line('same');
PROC1 PROCEDURE 22 end if;
PROC1 PROCEDURE 23  
PROC1 PROCEDURE 24 end;



'Oracle > PL_SQL' 카테고리의 다른 글

trigger  (0) 2009.11.17
package의 overloading  (0) 2009.11.17
wrap pld  (0) 2009.11.16
Exception handling  (0) 2009.11.13
Cursor  (0) 2009.11.12
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 16. 14:49

wrap은 오라클 서버 환경에 있는 유틸리티로, sql파일을 plb파일로 변경시 사용한다.
실제 사용자 뿐만 아니라 오라클에서도 이와같이 spec으로 패키지 내에 procedure, function등을 선언한후

배포시에 1, 2번만 배포한다.
1. pack_hr_management.sql(spec)
2. pack_hr_management.plb(소스를 감춘다.)
3. pack_hr_management_body.sql


--------------------------------
예) pack_hr_management 패키지
--------------------------------

create or replace package pack_hr_management
is
    procedure up_create_table
    (p_tab_name in  varchar2,
    p_message  out varchar2);

    function uf_dept_avg_sal
    (p_deptno emp.deptno%type)
    return number;
    end;
/

 

create or replace package body pack_hr_management
is
     procedure up_create_table
    (p_tab_name in  varchar2,
    p_message  out varchar2)
    is
    e1 exception;
 begin
    declare
        e_tab_exist exception;
        pragma exception_init(e_tab_exist, -955);
    begin
        execute immediate 'create table '||p_tab_name||'(col1 number)';
    exception
        when e_tab_exist then
            execute immediate 'drop table '||p_tab_name||' purge';
        when others then
            raise e1;
    end;

    execute immediate 'create table '||p_tab_name||'(col1 number)';
    p_message := 'Table '||p_tab_name||' created!';

exception
    when e1 then
    p_message := 'Unknown error!';
end;
/

'Oracle > PL_SQL' 카테고리의 다른 글

package의 overloading  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
Exception handling  (0) 2009.11.13
Cursor  (0) 2009.11.12
PLS_INTEGER  (1) 2009.11.12
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 13. 14:52

오라클에서의 에러는 다음과 같이 두 종류가 있다.
- Syntax Error
- Runtime Error (Exception) 

Every Oracle error has a number, but exceptions must be handled by name
모든 오라클 에러는 번호가 있지만, Exception은 반드시 이름을 가지고 처리한다.


   ○ Oracle defined error : Predefined exception                   1.When name then
                                      Non-predefined exception            2.When others then
                                                                                       3.After naming exception
   ○ User defined error                                                       4.create user defined exception
                                                                                       5.DBMS_STANDARD.RAISE_APPLICATION_ERROR


1번(Predefined exception)과 2번(Non-predefined exception) 예제

오라클의 대표적인 predefined exception 들이다.

NO_DATA_FOUND       리턴되는 행이 없을 때
TOO_MANY_ROWS     많은 행을 리턴할 때
INVALID_CURSOR       유효하지 않은 커서
ZERO_DIVIDE             0으로 나눌때
DUP_VAL_ON_INDEX  중복된 값을 입력시

drop table t1 purge;
create table t1 (col1 number constraint t1_no_nn not null);

create or replace procedure p1
          (p_no number,
           p_no2 number)
is
    v_no number;
begin
    v_no := 100/p_no;
    dbms_output.put_line(v_no);

    insert into t1 values (p_no2);
       exception
           when ZERO_DIVIDE then          -- predefined exception
                dbms_output.put_line('Your program attempts to divide a number by zero.');
           when others then                     -- non predefined exception
                dbms_output.put_line('Your program attempts to insert to null value');
end;
/

exec p1 (10, 1);
exec p1(10, 0);                --> ZERO_DIVIDE exception발생
exec p1 (10, NULL);        --> ORA-01400 상황




3번,Non-predefined exception(Atfer naming exception)

PRAGMA : 컴파일러에 대한 슈도명령어,
패키지에 선언해 두면 모든 plsql에서 exception으로 처리할 수 있다.

프로시져 내에서 Exception 정의

테이블 삭제후 생성

drop table t1 purge;
create table t1 (col1 number constraint t1_no_nn not null);



create or replace procedure p1
 (p_no number)
is
 e_null_insert exception;
 pragma exception_init(e_null_insert, -1400);

 v_no number;
begin
 insert into t1 values (p_no);
exception
 when e_null_insert then
  dbms_output.put_line('Your program attempts to insert a null into t1.col1');
end;
/

exec p1(null)     --> ORA-01400



Excetion을 package로 만듬

create or replace package exception_package
is
  e_null_insert exception;
  pragma exception_init(e_null_insert, -1400);
end;
/


 

create or replace procedure p1
  (p_no  number)
is
  v_no number;
begin
  insert into t1 values (p_no);
exception
  when exception_package.e_null_insert then
    dbms_output.put_line('Your program attempts to insert a null into hr30.t1.col1');
end;
/

exec p1 (NULL)




4번 사용자 정의 예외(User defined error)예제

먼저 아래의 SQL로 테이블의 상황을 보여주면

select sum(salary), department_id
     from employees
     group by department_id
     order by department_id

SUM(SALARY) DEPARTMENT_ID
4400 10
19000 20
17500 50
19200 60
30100 80
58000 90
20300 110
7000


create or replace procedure p2
 (p_dept_id number)
is
 v_sum_salary number;
 e1       exception;
begin
 select sum(salary) into v_sum_salary
 from employees
 where department_id = p_dept_id;

 if v_sum_salary < 20000 then
  raise e1;                         -- 예외(exception)를 발생시킨다.
 end if;

dbms_output.put_line(v_sum_salary);

exception
 when e1 then
  dbms_output.put_line('The total salary is too low!');

end;
/

exec p2(90);     --> 정상처리됨.
exec p2(10);     --> department_id 10의 sum(salary)가 4400으로 20000보다 적으므로 예외 발생




5.DBMS_STANDARD.RAISE_APPLICATION_ERROR예제

마치 oracle의 non-predicated exception이 발생한 것처럼 처리

declare
 v_sum_salary number;
 e1 exception;
begin
 select sum(salary) into v_sum_salary
 from employees
 where department_id = 20;

 if v_sum_salary < 20000 then
  dbms_standard.raise_application_error(-20001, 'too low');
 end if;
end;
/

 

declare
 v_sum_salary number;
 e1 exception;
 pragma exception_init(e1, -20001);
begin
 select sum(salary) into v_sum_salary
 from employees
 where department_id = 20;


 if v_sum_salary < 20000 then
  dbms_standard.raise_application_error(-20001, 'too low');   /* raise e1; */
 end if;

 dbms_output.put_line(v_sum_salary);
exception
 when e1 then
  dbms_output.put_line('exception arised!');
end;
/



오라클home\RDBMS\ADMIN의 아래에
stdspec.sql
predefined exception로 검색하면 exception이 선언되어 있음

참조 : http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm#784
관련 질문 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10110&docid=1105489&qb=7ZaJ7Jq07J20IOyeiOq4sOulvCBleGNlcHRpb24=&enc=utf8&section=kin&rank=10&sort=0&spq=0

'Oracle > PL_SQL' 카테고리의 다른 글

테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
wrap pld  (0) 2009.11.16
Cursor  (0) 2009.11.12
PLS_INTEGER  (1) 2009.11.12
Bind Variables(Host Variable)  (0) 2009.11.12
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 12. 22:36

커서(cursor)란?

커서는 DML(Select Update) 구문을 위한 메모리에 대한 핸들(이름 또는 포인터) 이다.
A cursor is a handle (pointer) in memory for a DML operation (Select Update).

기본적으로 sql구문을 실행하는 오라클에 의해 할당된 지역이다. 오라클은 Single row query는 암시적 커서(Implicit)를 사용하고, Multiple row query는 명시적커서(explicit)를 사용한다.


그리고 각 커서는 속성을 갖는데, 4가지가 있다.

%FOUND : 가장 최근의 FETCH가 행을 리턴하는지 판단. Boolean 타입

%ISOPEN : 커서가 열렸는지 판단함. Boolean 타입

%NOTFOUND : 가장 최근의 FETCH가 행을 리턴하지 않는지 판단. Boolean 타입

%ROWCOUNT : 리턴되는 행의 갯수가 얼마인지 판단. Number타입

 

암시적 커서

SQL> VARIABLE rows_deleted VARCHAR2(30)
SQL>

DECLARE
    empno employees.employee_id%TYPE := 176;
BEGIN
    DELETE FROM employees
    WHERE employee_id = empno;
    :rows_deleted := (SQL%ROWCOUNT ||' row deleted.');
END;
/
SQL> PRINT rows_deleted

 

명시적 커서

DECLARE
    CURSOR emp_cursor is
        select * from emp
        order by sal desc;
 
        emp_rec emp_cursor%rowtype;
BEGIN
    if emp_cursor%isopen = false then
        OPEN emp_cursor;
    end if;

    LOOP
        FETCH emp_cursor INTO emp_rec;

        exit when emp_cursor%notfound or emp_cursor%rowcount > 3;

        dbms_output.put_line(emp_rec.ename||' '||emp_rec.sal);   
    END LOOP;

    CLOSE emp_cursor;
END;
/


DECLARE
    CURSOR emp_cursor IS
        select * from emp
        order by sal desc;
BEGIN
    for emp_rec in emp_cursor loop
        exit when emp_cursor%notfound or emp_cursor%rowcount > 3;
    dbms_output.put_line(emp_rec.ename||' '||emp_rec.sal); 
    end loop;
END;
/

 

 

 

'Oracle > PL_SQL' 카테고리의 다른 글

테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
wrap pld  (0) 2009.11.16
Exception handling  (0) 2009.11.13
PLS_INTEGER  (1) 2009.11.12
Bind Variables(Host Variable)  (0) 2009.11.12
Posted by 자수성가한 부자
Oracle/PL_SQL2009. 11. 12. 09:22

PLS_INTEGER은 PL/SQL에서 사용가능한 데이터 타입입니다.
 
그런데 왜 이러한 데이터 타입이 나오게 되었을까요??

그건 바로 처리속도 때문입니다. 빠르게 된 이유로는 BINARY_INTEGER와 NUMBER 타입이 "라이브러리를 이용" 하여 수치 연산을 하는 반면, PLS_INTEGER는 실제 기계적인 연산(Machine arithmetic)을 수행하기 때문이라고 하네요.

-2147483647과 2147483647 사이의 signed 정수에 대한 기본형으로 정의 할 수 있습니다.


원문)
You use the PLS_INTEGER datatype to store signed integers. Its magnitude range is -2147483648 to 2147483647, represented in 32 bits. PLS_INTEGER values require less storage than NUMBER values and NUMBER subtypes. Also, PLS_INTEGER operations use hardware arithmetic, so they are faster than NUMBER operations, which use library arithmetic. For efficiency, use PLS_INTEGER for all calculations that fall within its magnitude range. For calculations outside the range of PLS_INTEGER, you can use the INTEGER datatype.

출처 : http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/datatypes.htm#i10726


그럼, 실제로 PLS_INTEGER이 BINARY_INTEGER나 NUMBER보다 연산을 빨리 수행하는지 테스트 해볼까요??

실제 비교를 하기 전에 똑같은 환경을 만들어 줍니다.

set timing on                     - 소요시간을 화면에 출력해주기 위해 설정

drop table t1 purge;

create table t1   
(col1 number);


BINARY_INTEGER

declare
    i number:=1;
    j number:=2;
    k number:=3;
    total number:=0;
begin
    for l in 1..100000000 loop
        total := total+i+j+k;
    end loop;
    dbms_output.put_line(total);
end;
/

소요시간 : 00:00:18.65


또 같은 환경을 만들어줍니다.

drop table t1 purge;

create table t1
(col1 number);

NUMBER

declare
    i binary_integer:=1;
    j binary_integer:=2;
    k binary_integer:=3;
    total binary_integer:=0;
begin
    for l in 1..100000000 loop
        total := total+i+j+k;
    end loop;
    dbms_output.put_line(total);
end;
/

소요시간 : 00:00:06.84

같은 환경을 만들어 줍니다.

drop table t1 purge;

create table t1
(col1 number);


PLS_INTERGER

declare
    i pls_integer:=1;
    j pls_integer:=2;
    k pls_integer:=3;
    total pls_integer:=0;
begin
    for l in 1..100000000 loop
        total := total+i+j+k;
    end loop;
    dbms_output.put_line(total);
end;
/

소요시간 : 00:00:05.20

                                                                                                                                                        단위 : 초

   NUMBER BINARY_INTEGER  PLS_INTEGER 
 소요시간  18.65  06.84  05.20


이렇게 해서 PLS_INTEGER의 연산속도가 NUMBER와 BINARY_INTEGER보다 빠르다는 것을 알 수 있었습니다.

'Oracle > PL_SQL' 카테고리의 다른 글

테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
wrap pld  (0) 2009.11.16
Exception handling  (0) 2009.11.13
Cursor  (0) 2009.11.12
Bind Variables(Host Variable)  (0) 2009.11.12
Posted by 자수성가한 부자