본문 바로가기

전체 글

[Oracle] 숫자 -> 한글 변환 Function

2004. 10. 1.

CREATE OR REPLACE FUNCTION NUM_TO_HANGUL (
       ARG    NUMBER
    
) RETURN VARCHAR2 IS
/**********************************************************
 * @author  : samE
 * @date    : 2004-09-21 
 * @summary : 숫자를 입력받아 한글로 돌려준다. 
 **********************************************************/

return_Val  VARCHAR2(150);

arg_Str     VARCHAR2(20); -- 현재값을 문자열로 변경
str_One     VARCHAR2(1) ; -- 한글자로 자른값
arg_Length  NUMBER      ; -- 자리수
cut_Four    NUMBER      ; -- 네자리로 자를경우 몇개 나오는가
four_Mod    NUMBER      ; -- 처음 자른 자리수(나머지)는 몇개 인가
four_Len    NUMBER      ; -- 네자리로 자른 갯수(몫, 자리수)
isZero      VARCHAR2(1) ; -- '0' 인지 체크
str_Four    VARCHAR2(4) ; -- 네자리로 자른 값


BEGIN
    arg_Str     := TO_CHAR(arg)         ;
    arg_Length  := LENGTH(arg_Str)      ;
    cut_Four    := CEIL(arg_Length / 4) ;   -- 네자리로 자른 몫
    four_Mod    := MOD(arg_Length, 4)   ;   -- 네자리로 자른 나머지
   
    -- 몫으로 루프
    FOR i IN 1..cut_Four LOOP
        str_Four := '';
       
        IF four_Mod != 0 AND i = 1 THEN
            four_Len := four_Mod;
        ELSE
            four_Len := 4;
        END IF;

        -- 나머지값 or 4번씩 루프       
        FOR j IN 1..four_Len LOOP
            IF i = 1 THEN
                str_One := SUBSTR(arg_Str, j, 1);
            ELSIF four_Mod = 0 THEN
                str_One := SUBSTR(arg_Str, ((i-2)*4) + (four_Mod+j) + 4, 1);
            ELSE
                str_One := SUBSTR(arg_Str, ((i-2)*4) + (four_Mod+j), 1);
            END IF;
           
            str_Four := str_Four || str_One;
           
            IF str_One = '0' THEN  
                isZero := 'Y';
           
            ELSE
                isZero := 'N';

                IF str_One = '1' THEN
                    return_Val := return_Val || '일';
                ELSIF str_One = '2' THEN
                    return_Val := return_Val || '이';
                ELSIF str_One = '3' THEN
                    return_Val := return_Val || '삼';
                ELSIF str_One = '4' THEN
                    return_Val := return_Val || '사';
                ELSIF str_One = '5' THEN
                    return_Val := return_Val || '오';
                ELSIF str_One = '6' THEN
                    return_Val := return_Val || '육';
                ELSIF str_One = '7' THEN
                    return_Val := return_Val || '칠';
                ELSIF str_One = '8' THEN
                    return_Val := return_Val || '팔';
                ELSIF str_One = '9' THEN
                    return_Val := return_Val || '구';
                END IF;
            END IF;
           
            -- 0이면 천, 백, 십 단위 안 붙임
            IF isZero = 'N' THEN
                IF four_Len-j = 3 THEN
                    return_Val := return_Val || '천';
                ELSIF four_Len-j = 2 THEN
                    return_Val := return_Val || '백';
                ELSIF four_Len-j = 1 THEN
                    return_Val := return_Val || '십';
                END IF;
            END IF;           
        END LOOP;
              
        -- 네자리가 0000이면 만, 억, 조, 경 안 붙임
        IF str_Four != '0000' THEN
            IF cut_Four-i = 1 THEN
                return_Val := return_Val || '만 ';
            ELSIF cut_Four-i = 2 THEN
                return_Val := return_Val || '억 ';
            ELSIF cut_Four-i = 3 THEN
                return_Val := return_Val || '조 ';
            ELSIF cut_Four-i = 4 THEN
                return_Val := return_Val || '경 ';
            END IF;
        END IF;
    END LOOP;

    RETURN trim(return_Val) || '원';
    
EXCEPTION WHEN OTHERS THEN
    RETURN null;
END;
/


'프로그래밍' 카테고리의 다른 글

[Oracle] Data Dictionary  (0) 2004.10.01
[Oracle] 숫자 -> 한글 변환 Function  (0) 2004.10.01
[Oracle] Grouping(), ROLLUP, CUBE Study 정리  (4) 2004.10.01
[PL/SQL] syntax 정리  (0) 2004.10.01
댓글 0

[Oracle] Grouping(), ROLLUP, CUBE Study 정리

2004. 10. 1.


/****************************************************************
  작성자 : 삼이
  작성일 : 2004-09-30
  제  목 : Grouping(), ROLLUP, CUBE Study 정리
 ****************************************************************/


* ROLLUP 연산자
 - GROUP BY절에 있는 컬럼들을 오른쪽에서 왼쪽의 차례로 그룹들을 생성하고,
   각 그룹에 계산함수를 적용한다.
 - GROUP BY절의 결과는 누적 계산 결과이다.
 

* CUBE 연산자
 - GROUP BY절에 있는 모든 컬럼들에 대한 가능한 모든 조합을 그룹으로 생성한다.
 

* GROUPING 함수
 - 각 결과 행이 CUBE, ROLLUP 연산자들에 의해 계산된 것인지를 알기 위해 사용된다.
 - 해당컬럼에 대해 계산되었다면 0, 그렇지 않다면(컬럼값이 NULL) 1을 반환한다.
 - GROUP BY절에 나타나는 컬럼에 적용된다.


사용 예)

  -- table생성(사원이름,급여,부서,직위,입사년도)
  CREATE TABLE roll_test (
    name   VARCHAR2(10),
    sal    NUMBER,
    dept   VARCHAR2(10),
    duty   VARCHAR2(10),
    entYear NUMBER(4)
  );

INSERT INTO roll_Test VALUES('kim' , 1000, 'AA', '00', 2004);
INSERT INTO roll_Test VALUES('no' , 1500, 'AA', '00', 2004);
INSERT INTO roll_Test VALUES('choi', 2000, 'BB', '02', 2003);
INSERT INTO roll_Test VALUES('park', 2000, 'BB', '02', 2003);
INSERT INTO roll_Test VALUES('lee' , 3000, 'CC', '03', 2002);
INSERT INTO roll_Test VALUES('cho' , 4000, 'AA', '04', 2001);
INSERT INTO roll_Test VALUES('lyu' , 4000, 'DD', '04', 2001);
INSERT INTO roll_Test VALUES('ham' , 4000, 'AA', '04', 2001);
INSERT INTO roll_Test VALUES('kang', 7000, 'DD', '05', 2001);
COMMIT;

SELECT * FROM roll_Test;


-- 1. 각 부서에 대한 급여 소계를 구하고, 총계를 구하라
--    (하나의 Column Grouping)

-----일반-----------
SELECT dept, SUM(sal)
FROM   roll_Test
GROUP BY dept;
---------------------

----- ROLLUP ---------
SELECT dept, SUM(sal), GROUPING(dept)
FROM   roll_Test
GROUP BY ROLLUP(dept);
-----------------------

----- CUBE ----------
SELECT dept, SUM(sal), GROUPING(dept)
FROM roll_Test
GROUP BY CUBE(dept);
-----------------------

-- 일반적인 GROUP BY를 사용할 경우 급여 소계만 나오고, 총계는 따로 구해야 함
-- ROLLUP과 CUBE 차이점 없음


-- 2. 각 부서별, 직위별 급여 소계를 구하고, 총계를 구하라
--    (두개의Column Grouping)

-----NORMAL-----------
SELECT dept, duty, SUM(sal)
FROM   roll_Test
GROUP BY dept, duty;
-----------------------

----- ROLLUP ----------
SELECT dept, duty, SUM(sal), GROUPING(dept), GROUPING(duty)
FROM   roll_Test
GROUP BY ROLLUP(dept, duty);
-----------------------

----- CUBE ----------
SELECT dept, duty, SUM(sal), GROUPING(dept), GROUPING(duty)
FROM   roll_Test
GROUP BY CUBE(dept, duty);
-----------------------

-- ROLLUP은 부서에 대한 소계 / 부서에 대한 직위별 소계만 볼 수 있고,
-- CUBE는 부서에 대한 소계 / 부서에 대한 직위별 소계 / 직위별 소계를 볼 수 있음
-- GROUP BY 내의 왼쪽 컬럼부터 자동으로 오름차순 정렬 됨


-- 3. 각 부서별, 직위별, 입사년도별 급여 소계를 구하고, 총계를 구하라
--    (세개의 Column Grouping)

-----NORMAL-----------
SELECT dept, duty, entYear, SUM(sal)
FROM   roll_Test
GROUP BY dept, duty, entYear;
-----------------------

----- ROLLUP ----------
SELECT dept, duty, entYear, SUM(sal), GROUPING(dept), GROUPING(duty), GROUPING(entYear)
FROM   roll_Test
GROUP BY ROLLUP(dept, duty, entYear);
-----------------------

----- CUBE ----------
SELECT dept, duty, entYear, SUM(sal), GROUPING(dept), GROUPING(duty), GROUPING(entYear)
FROM   roll_Test
GROUP BY CUBE(dept, duty, entYear);
-----------------------


- ROLLUP 사용시 3개의 소계와 1개의 총계를 구할 수 있음
  (부서별, 부서*직위별, 부서*직위*입사년도별, 총계)
  ※ GROUP BY 내의 가장 왼쪽 컬럼을 기준으로 하여 순차적으로 하위 그룹 생성

- CUBE 사용시 7개의 소계와 1개의 총계를 구할 수 있음.
  (부서별, 직위별, 입사년도별, 부서*직위별, 부서*입사년도별, 직위*입사년도별, 부서*직위*입사년도별, 총계)
  ※ 생성 가능한 모든 경우를 그룹 생성
 


사용 예)

* 부서에 대한 소계를 보고 싶을 때
HAVING GROUPING(dept) = 0 AND GROUPING(duty) = 1
AND GROUPING(entYear) = 1;

* 각 부서에 대한 직위별 소계를 보고 싶을 때
HAVING GROUPING(dept) = 0 AND GROUPING(duty) = 0
AND GROUPING(entYear) = 1;

'프로그래밍' 카테고리의 다른 글

[Oracle] Data Dictionary  (0) 2004.10.01
[Oracle] 숫자 -> 한글 변환 Function  (0) 2004.10.01
[Oracle] Grouping(), ROLLUP, CUBE Study 정리  (4) 2004.10.01
[PL/SQL] syntax 정리  (0) 2004.10.01
댓글 4
  • SQL 초보자인데 구글 검색으로 들어왔습니다.
    길지않으면서도 쉬운 설명 감사합니다. 잎으로도 좋은 포스팅 해주세요. 감사합니다.^^

  • 감동 2012.08.09 15:24 댓글주소 수정/삭제 댓글쓰기

    소계란을 따로 db에서 구하는 줄 모르고 application단에서 만들어서 처리하려고 했는데..
    이런 기능이 있었군요..
    설명 잘 보고 갑니다.
    그리고 다음에도 찾을 수 있을지 없을지 몰라서 살짝 퍼갑니다.
    쉬운 설명과 그에 걸맞는 예제...
    할 말이 없네요..;

[PL/SQL] syntax 정리

2004. 10. 1.

/****************************************
  PL/SQL syntax 정리
*****************************************/

----------------------------------------------------------
-       * syntax 기호                                                          
-                                                                                    
-         [] : 대괄호 안의 내용이 생략가능                              
-          | : 또는                                                                
-         {} : 중괄호 안의 내용이 하나 이상 올 수 있다.              
-        ... : 앞 표기와 같은 형식으로 더 올 수 있다.                  
-          , : 구분자                                                              
----------------------------------------------------------


* 기본구조
  declare : 실행부에서 참조할 모든 변수, 상수, 커서, exception을 선언
       variables, cursor, user_defined, exception

  begin : 데이터베이스의 데이터를 처리할 sql문과 pl/sql블록을 기술
       sql, pl/sql statements;

  exception : 실행부에서 에러가 발생했을때 수행될 문장을 기술
       actions to perform wher erros occur
  end;


* anonymous
syntax : [declare]
            begin
                   statements;
                   statements;
                   statements;
            [exception]
            end;


* procedure
syntax : create procedure procedure_name
            is
            begin
                   statements;
                   statements;
            [exception]
            end;


* function
syntax : create function function_name
            return datatype
            is
            begin
                  statements;
                  statements;
                  return value;
            [exception]
            end;


* PL/SQL 변수
  1) scalar : 주로 단일값을 보유. 주요 데이터형은 오라클 서버 테이블의 열 유형에 대응하는 것들입니다.
  2) composite : 레코드 같은 조합 데이터형은 PL/SQL블럭에서 조작되고 정의되는 필드그룹을 허용합니다.
  3) reference : 참조데이터형은 pointer라 불리며 다른 프로그램 항목을 지시하는 값을 보유합니다.
  4) LOB(Large Objects) : LOB데이터형은 locator라 불리며 라인 밖에서 지정된 큰 객체의 위치를 지정하는 값을 보유


* PL/SQL 변수 선언
  syntax : identifier [constant] datatype [not null] [:= | default expression];
  - identifier : 변수의 이름
  - constant : 변수의 값을 변경할 수 없도록 제약 (상수)
  - datatype : scalar, composite, reference, lob(large objects)
  - not null : 값을 포함해야만 하도록 하기 위해 변수를 제약
  - expression : literal, 다른 변수, 연산자나 함수를 포함하는 표현식


* 변수 값 지정
  syntax : identifier := expression;


* 기본 스칼라 데이터 형
  - varchar2(n) : 변수길이 문자 데이터에 대한 기본형은 32767Byte까지 디폴트 크기는 없다.
  - number(p,s) : 고정과 유동포인트 숫자에 대한 기본형 소수점 이상 p자리, 소수점 이하 s자리
  - date : 날짜와 시간에 대한 기본형, date값은 지정 이후의 초 단위로 날에 대한 시간을 포함합니다. 날짜의 범위는 bc4712년 1월1일 부터 ad9999년 12월 31일 사이
  - char(n) : 고정 길이 문자에 대한 기본형은 32767Byte까지. 디폴트길이는 1
  - long : 고정길이 문자에 대한 기본형은 32767Byte까지 long은 최대 2147483647Byte까지
  - long raw : 이진 데이터와 바이트 문자열에 대한 기본형은 32767Byte까지 long raw는 PL/SQL에 의해 해석되지 않음
  - boolean : true, false, null중 하나의 값
  - binary_integer : -2147483647~2147483637사이의 정수
  - pls_integer : -2147483647~2147483637사이의 정수에 대한 기본형 적은 기억장치를 필요로함


* %type 속성: 데이터베이스 테이블의 열이 가진 type으로 변수를 선언
  syntax : variable_name table_name.column_name%type


* table type :배열의 개념 (테이블의 두 컬럼을 인덱스와 데이터로 사용)
  syntax : type table_type_name is table of
              {column_type | variable%type | table.column%type} [not null]
              [index by binary_integer];
              identifier table_type_name;

  - table_type_name : 테이블형의 이름
  - column_type : varchar2, date, number와 같은 스칼라데이터형
  - identifier : 전체 PL/SQL테이블을 나타내는 식별자의 이름


* record type: 구조체 개념, 테이블의 row전체를 하나의 데이터형으로 나타냄
  syntax : type type_name is record
              (field_name1 {scalar_datatype|record_type} [not null] [{:=|default} expr],
              (field_name2 {scalar_datatype|record_type} [not null] [{:=|default} expr]
              ...);
              identifier_name type_name;

  - type_name : record형의 이름, 이 식별자는 record를 선언하기 위해 사용한다.
  - field_name : record내의 필드명
  - record를 참조 : record_name.field_name


* %rowtype 속성: 테이블의 열을 하나의 타입으로
  syntax : identifier reference%rowtype
  - 개별필드참조 : record_name.field_name


* LOB 데이터형(각 4GByte까지)
  1) CLOB(Character large object) : 데이터베이스내의 단일 바이트 문자 데이터의 대형블럭을 저장
  2) BLOB(Binary large object) : 데이터베이스 내의 대형 이진객체를 저장
  3) BFILE (Binary file) : 데이터베이스 외부의 운영시스템 파일의 대형 이진객체 저장
  4) NCLOB(national language character large object) : 데이터베이스내의 단일바이트, 또는 고정 길이의 멀티바이트 nchar데이터를 행의 안팎에 저장하기 위해 사용


* 바인드(bind) 변수 :SQL*PLUS에서의 변수를 PL/SQL에서 사용
  syntax : var[iable] [variable [number | char(n) | varchar2(n)]]


* 호스트(host) 변수: 호스트운영체제의 변수를 PL/SQL에서 사용
  syntax : :variable_name


* 구분문자
  + : 덧셈연산자
  - : 뺄셈연산자
  * : 곱셈연산자
  / : 나눗셈 연산자
  = : 관계형연산자
  @ : 원격엑세스지시자
  ; : 문장지시자
  <> : 관계형 연산자 (같지않다)
  != : 관계형 연산자 (같지않다)
  || : 문자열 연결 연산자
  -- : 단일라인 주석
  /* */ : 멀티라인 주석
  := : 지정연산자(대입)


* 데이터형 변환 함수
  1) to_char(value, format) : value를 문자로 전환
  2) to_date(value, format) : value를 날짜형식으로 전환
  3) to_number(value, format) : value를 숫자로 전환


* PL/SQL의 연산자와 우선순위
  1) **, not : 지수승, 논리부정
  2) +, - : 식별, 부정연산자
  3) *, / : 곱셈, 나눗셈
  4) +, -, || : 덧셈, 뺄셈, 연결
  5) =, !=, <, >, <=, >=, is null, like, between, in : 비교연산자
  6) and : 논리곱
  7) or : 논리합


* 코드규약 (권장)
  - 대문자 : sql명령어, pl/sql키워드, 데이터형
  - 소문자 : 식별자, 매개변수, 테이블명, 열명


* 코드명 지정규약 (권장)
  - 변수 : v_name
  - 상수 : c_name
  - 커서 : name_cursor
  - 예외 : e_name
  - 테이블형 : name_table_type
  - 테이블명 : name_table
  - 레코드형 : name_record_type
  - 레코드명 : name_record
  - SQL*PLUS 치환 매개변수 : p_name
  - SQL*PLUS 전역변수 : g_name


* PL/SQL에서의 select
  - 단일행을 리턴하는 select만 사용

  syntax : select select_list
              into {variable_name1[.variable_name2, ...] | record_name}
              from table_name
              where condition;


* cursor 속성
  - sql*rowcount : 가장 최근의 sql문장에 의해 영향을 받은 행의 수
  - sql%found : 가장 최근의 sql문장이 하나 또는 그 이상의 행에 영향을 미친다면 true
  - sql%notfound : 가장 최근의 sqlㄴ문장이 어떤행에도 영향을 미치지 않았다면 true
  - sql%isopen : PL/SQL이 실행된 후에 즉시 암시적 커서를 닫기때문에 항상 true


* if
  syntax : if condition then
                 statements;
              [elsif condition then]
                 statements;
              else
                 statements;
              end if;

* loop
  syntax : loop
                 statement1;
                 statement2;
                 ...
              exit [when condition];
              end loop;


* exit문
  syntax : exit [when condition];


* for loop
  syntax : for index_counter in [reverse] lower_bound..upper_bound loop
                 statement1;
                 statement2;
                 ...
              end loop;

  - index_counter : upper_bound나 lower_bound에 도달할때까지 loop를 반복함으로써 1씩 자동적으로 증가하거나 감소되는 값을 가진 암시적으로 선언된 정수
  - reverse : upper_bound에서 lower_bound까지 반복함으로써 인덱스가 1씩 감소되도록 합니다.
  - lower_bound : index_counter값의 범위에 대한 하단바운드
  - upper_bound : index_counter 값의 범위에 대한 상단 바운드


* while loop
  syntax : while condition loop
                 statement1;
                 statement2;
                 ...
              end loop;


* cursor
  - 암시적 cursor
    sql%rowcount : 지금까지 리턴된 행의 총 수(number)
    sql%found : 가장 최근의 인출(fetch)가 행을 리턴하면 true (boolean)
    sql%notfound : 가장 최근의 인출(fetch)가 행을 리턴하지 않으면 true (boolean)
    sql%isopen : cursor가 열리면 true

  - 명시적 cursor : 선언, open, fetch into, close
  syntax : cursor cursor_name is
                  select_statement;
              open cursor_name;
              fetch cursor_name into {variable1[,variable2, ...] | record_name};
              close cursor_name;


* cursor와 for loop
  syntax : for record_name in cursor_name loop
                 statement1;
                 statement2;
                 ...
              end loop;


* subquery를 사용한 cursor for loop
  syntax : for record_name in (subquery) loop
                 statement1;
                 statement2;
                 ...
              end loop;


* 매개변수와 cursor
  syntax : cursor cursor_name [(parameter_name1 datatype, ...)] is
                 select_statement;
              cursor_parameter_name [in] datatype [{:= | default} expression]


* for update절
  syntax : cursor cursor_name is
                 select_statement
                 for update [nowait] [of column1[,column2,...]];


* 정의된 oracle server 에러
  - access_into_null(ora-06530) : 초기화 되지 않은 객체의 속성에 대해 값을 지정하려고 함
  - collection_is_null(ora-06531) : 초기화 되지 않은 중첩 테이블에 대해 exists를 제외한 메소드 모음의 적용을 시도합니다.
  - cursor_already_open(ora-06511) : 이미 열린 커서의 열기를 시도합니다.
  - dup_val_on_index(ora-00001) : 중복값의 삽입을 시도합니다.
  - invalid_cursor(ora-01001) : 잘못된 커서연산이 발생합니다.
  - invalid_number(ora-01722) : 수의 문자열 전환은 실패입니다.
  - login_denied(ora-01017) : 잘못된 사용자명과 비밀번호로 오라클에 로그온합니다.
  - no_data_found(ora-01403) : 데이터를 리턴하지 않는 select문장
  - not_logged_on(ora-01012) : PL/SQL은 내부문제를 가지고 있습니다.
  - program_error(ora-06501) : PL/SQL은 내부 문제를 가지고 있습니다.
  - rowtype_mismatch(ora-06504) : 지정문에 포함된 호스트 커서변수와 PL/SQL커서변수의 리턴유형이 다릅니다.
  - storage_error(ora-06500) : PL/SQL이 메모리를 다 써버리거나 또는 메모리가 훼손됨
  - subscript_beyond_count(ora-06533) : 모음의 요소 개수보다 더 큰 인덱스 개수를 사용하는 중첩테이블을 참조합니다.
  - subscript_outside_limit(ora-06532) : 범위 밖의 인덱스 번호를 사용하여 중첩테이블을 참조
  - timeout_on_resource(ora-00051) : oracle이 리소스를 대기하는 동안 시간초과 발생
  - too_many_rows(ora-01422) : 단일행 select는 하나 이상의 행을 리턴합니다.
  - value_error(ora-06502) : 계산, 변환, 절단, 또는 크기제약 오류가 발생
  - zero_devide(ora-01476) : 0으로 배분을 시도


* 미리 정의되지 않은 오라클 서버 에러
  - 선언
    syntax : exception_name exception;

  - pragma exception_init문장을 사용해 표준에러번호와 선언된 예외를 연결
    syntax : exception_init(exception_name, error_number)


* 사용자 정의 예외
  - 선언
    syntax : exception_name exception;

  - 명시적으로 예외를 발생시킴
    syntax : raise exception_name;


* 예외 트래핑 함수
  - sqlcode : 에러 코드에 대한 숫자를 리턴
  - sqlerrm : 에러 번호에 해당하는 메세지를 리턴


* SQL코드 값
  - 0 : 예외가 없습니다.
  - 1: 사용자정의 에러번호
  - +100 : no_data_found
  - 양의 정수 : 표준 에러번호


* 어플리케이션내에서 예외 발생시키기
  syntax : raise_application_error(error_number, message[,{true|false}]);


* procedure
  syntax : create [or replace] procedure procedure_name
                 [(argument1 [mode1] datatype [{:= | default} expression]
                 [(argument1 [mode1] datatype [{:= | default} expression], ...])]
                 {is | as}
              begin
                 pl/sql block;
              end;

  - or replace : procedure_name이 존재할 경우 procedure의 내용을 지우고 다시 생성
  - procedure_name : procedure명
  - argument : 매개변수의 이름
  - mode : 3가지 (in:입력매개변수로 사용)
                       (out:출력매개변수로 사용)
                       (in out : 입출력매개변수로 사용)
  - pl/sql block : procedure를 구성하는 코드를 구성하는 pl/sql의 블럭


* function
  syntax : create [or replace] function function_name
                 [(argument1 [mode1] datatype [{:= | default} expression]
                 [(argument1 [mode1] datatype [{:= | default} expression], ...])]
                 return data_type
                 {is | as}
              begin
                 pl/sql block;
              end;

  - or replace : procedure_name이 존재할 경우 procedure의 내용을 지우고 다시 생성
  - procedure_name : procedure명
  - argument : 매개변수의 이름
  - mode : 3가지 (in:입력매개변수로 사용)
                       (out:출력매개변수로 사용)
                       (in out : 입출력매개변수로 사용)
  - data_type : 반환되는 값의 datatype
  - pl/sql block : procedure를 구성하는 코드를 구성하는 pl/sql의 블럭


* procedure와 function 비교
  - procedure : pl/sql문으로서 실행, 리턴데이터형 없음, 값을 리턴할 수도 있다.
  - function : 식의 일부로서 사용, 리턴데이터형 필수, 반드시 값을 리턴해야함


* trigger
  syntax : create [or replace] trigger trigger_name
                 {before | after} triggering_event [of column1, ...] on table_name
                 [for each row [when trigger_condition]             
                 trigger_body;

  - trigger_name : trigger의 식별자
  - before | after : DML문장이 실행되기 전에 trigger를 실행할 것인지 실행된 후에 trigger를 실행할 것인지를 정의
  - triggering_event : DML(insert, update, delete)
  - of column : trigger가 실행되는 테이블에서 컬럼명을 기술한다.
  - table name : trigger가 실행되는 테이블 명
  - for each row : 이 옵션을 사용하면 행 레벨 트리거가 되어 triggering문자에 영향받은 행에 대해 각각 한번씩 실행하고 사용하지 않으면 문장레벨 트리거가 되어 DML문장당 한번만 실행된다.


* trigger operation결정하는 세가지 함수
  - inserting : 트리거링 문장이 insert이면 true
  - updating : 트리거링 문장이 update이면 true
  - deleting : 트리거링 문장이 delete이면 true


* trigger 제거 / 활성화선택
  - 제거
     syntax : drop trigger trigger_name

  - 활성화선택
     syntax : alter trigger trigger_name {disable | enable};

'프로그래밍' 카테고리의 다른 글

[Oracle] Data Dictionary  (0) 2004.10.01
[Oracle] 숫자 -> 한글 변환 Function  (0) 2004.10.01
[Oracle] Grouping(), ROLLUP, CUBE Study 정리  (4) 2004.10.01
[PL/SQL] syntax 정리  (0) 2004.10.01
댓글 0