오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

HTML에 사용되는 색 이름

* 브라우저 버전에 따라 대응여부가 다릅니다.
좌측 테이블은 색상이름을 HTML 소스에 입력한 것임.<td bgcolor='red'>
우측 테이블은 색상번호를 HTML 소스에 입력한 것임.<td bgcolor='#ff0000'>
브라우저에서 같은 색상으로 표시된다는 것을 확인하십시오.
[참고서적] "Web Safe Color 배색사전" (C.I.S./영진닷컴)


red (#FF0000)

red (#FF0000)

crimson (#DC143C)

crimson (#DC143C)

firebrick (#B22222)

firebrick (#B22222)

maroon (#800000)

maroon (#800000)

darkred (#8B0000)

darkred (#8B0000)

brown (#A52A2A)

brown (#A52A2A)

sienna (#A0522D)

sienna (#A0522D)

saddlebrown (#8B4513)

saddlebrown (#8B4513)

indianred (#CD5C5C)

indianred (#CD5C5C)

rosybrown (#BC8F8F)

rosybrown (#BC8F8F)

lightcoral (#F08080)

lightcoral (#F08080)

salmon (#FA8072)

salmon (#FA8072)

darksalmon (#E9967A)

darksalmon (#E9967A)

coral (#FF7F50)

coral (#FF7F50)

tomato (#FF6347)

tomato (#FF6347)

sandybrown (#F4A460)

sandybrown (#F4A460)

lightsalmon (#FFA07A)

lightsalmon (#FFA07A)

peru (#CD853F)

peru (#CD853F)

chocolate (#D2691E)

chocolate (#D2691E)

orangered (#FF4500)

orangered (#FF4500)

orange (#FFA500)

orange (#FFA500)

darkorange (#FF8C00)

darkorange (#FF8C00)

tan (#D2B48C)

tan (#D2B48C)

peachpuff (#FFDAB9)

peachpuff (#FFDAB9)

bisque (#FFE4C4)

bisque (#FFE4C4)

moccasin (#FFE4B5)

moccasin (#FFE4B5)

navajowhite (#FFDEAD)

navajowhite (#FFDEAD)

wheat (#F5DEB3)

wheat (#F5DEB3)

burlywood (#DEB887)

burlywood (#DEB887)

darkgoldenrod (#B8860B)

darkgoldenrod (#B8860B)

goldenrod (#DAA520)

goldenrod (#DAA520)

gold (#FFD700)

gold (#FFD700)

yellow (#FFFF00)

yellow (#FFFF00)

lightgoldenrodyellow (#FAFAD2)

lightgoldenrodyellow (#FAFAD2)

palegoldenrod (#EEE8AA)

palegoldenrod (#EEE8AA)

khaki (#F0E68C)

khaki (#F0E68C)

darkkhaki (#BDB76B)

darkkhaki (#BDB76B)

lawngreen (#7CFC00)

lawngreen (#7CFC00)

greenyellow (#ADFF2F)

greenyellow (#ADFF2F)

chartreuse (#7FFF00)

chartreuse (#7FFF00)

lime (#00FF00)

lime (#00FF00)

limegreen (#32CD32)

limegreen (#32CD32)

yellowgreen (#9ACD32)

yellowgreen (#9ACD32)

olive (#808000)

olive (#808000)

olivedrab (#6B8E23)

olivedrab (#6B8E23)

darkolivegreen (#556B2F)

darkolivegreen (#556B2F)

forestgreen (#228B22)

forestgreen (#228B22)

darkgreen (#006400)

darkgreen (#006400)

green (#008000)

green (#008000)

seagreen (#2E8B57)

seagreen (#2E8B57)

mediumseagreen (#3CB371)

mediumseagreen (#3CB371)

darkseagreen (#8FBC8F)

darkseagreen (#8FBC8F)

lightgreen (#90EE90)

lightgreen (#90EE90)

palegreen (#98FB98)

palegreen (#98FB98)

springgreen (#00FF7F)

springgreen (#00FF7F)

mediumspringgreen (#00FA9A)

mediumspringgreen (#00FA9A)

teal (#008080)

teal (#008080)

darkcyan (#008B8B)

darkcyan (#008B8B)

lightseagreen (#20B2AA)

lightseagreen (#20B2AA)

mediumaquamarine (#66CDAA)

mediumaquamarine (#66CDAA)

cadetblue (#5F9EA0)

cadetblue (#5F9EA0)

steelblue (#4682B4)

steelblue (#4682B4)

aquamarine (#7FFFD4)

aquamarine (#7FFFD4)

powderblue (#B0E0E6)

powderblue (#B0E0E6)

paleturquoise(#AFEEEE)

paleturquoise (#AFEEEE)

lightblue (#ADD8E6)

lightblue (#ADD8E6)

lightsteelblue (#B0C4DE)

lightsteelblue (#B0C4DE)

skyblue (#87CEEB)

skyblue (#87CEEB)

lightskyblue (#87CEFA)

lightskyblue (#87CEFA)

mediumturquoise (#48D1CC)

mediumturquoise (#48D1CC)

turquoise (#40E0D0)

turquoise (#40E0D0)

darkturquoise (#00CED1)

darkturquoise (#00CED1)

aqua (#00FFFF)

aqua (#00FFFF)

cyan (#00FFFF)

cyan (#00FFFF)

deepskyblue (#00BFFF)

deepskyblue (#00BFFF)

dodgerblue (#1E90FF)

dodgerblue (#1E90FF)

cornflowerblue (#6495ED)

cornflowerblue (#6495ED)

royalblue (#4169E1)

royalblue (#4169E1)

blue (#0000FF)

blue (#0000FF)

mediumblue (#0000CD)

mediumblue (#0000CD)

navy (#000080)

navy (#000080)

darkblue (#00008B)

darkblue (#00008B)

midnightblue (#191970)

midnightblue (#191970)

darkslateblue (#483D8B)

darkslateblue (#483D8B)

slateblue (#6A5ACD)

slateblue (#6A5ACD)

mediumslateblue (#7B68EE)

mediumslateblue (#7B68EE)

mediumpurple (#9370DB)

mediumpurple (#9370DB)

darkorchid (#9932CC)

darkorchid (#9932CC)

darkviolet (#9400D3)

darkviolet (#9400D3)

blueviolet (#8A2BE2)

blueviolet (#8A2BE2)

mediumorchid (#BA55D3)

mediumorchid (#BA55D3)

plum (#DDA0DD)

plum (#DDA0DD)

lavender (#E6E6FA)

lavender (#E6E6FA)

thistle (#D8BFD8)

thistle (#D8BFD8)

orchid (#DA70D6)

orchid (#DA70D6)

violet (#EE82EE)

violet (#EE82EE)

indigo (#4B0082)

indigo (#4B0082)

darkmagenta (#8B008B)

darkmagenta (#8B008B)

purple (#800080)

purple (#800080)

mediumvioletred (#C71585)

mediumvioletred (#C71585)

deeppink (#FF1493)

deeppink (#FF1493)

fuchsia (#FF00FF)

fuchsia (#FF00FF)

magenta (#FF00FF)

magenta (#FF00FF)

hotpink (#FF69B4)

hotpink (#FF69B4)

palevioletred (#DB7093)

palevioletred (#DB7093)

lightpink (#FFB6C1)

lightpink (#FFB6C1)

pink (#FFC0CB)

pink (#FFC0CB)

mistyrose (#FFE4E1)

mistyrose (#FFE4E1)

blanchedalmond (#FFEBCD)

blanchedalmond (#FFEBCD)

lightyellow (#FFFFE0)

lightyellow (#FFFFE0)

cornsilk (#FFF8DC)

cornsilk (#FFF8DC)

antiquewhite (#FAEBD7)

antiquewhite (#FAEBD7)

papayawhip (#FFEFD5)

papayawhip (#FFEFD5)

lemonchiffon (#FFFACD)

lemonchiffon (#FFFACD)

beige (#F5F5DC)

beige (#F5F5DC)

linen (#FAF0E6)

linen (#FAF0E6)

oldlace (#FDF5E6)

oldlace (#FDF5E6)

lightcyan (#E0FFFF)

lightcyan (#E0FFFF)

aliceblue (#F0F8FF)

aliceblue (#F0F8FF)

whitesmoke (#F5F5F5)

whitesmoke (#F5F5F5)

lavenderblush (#FFF0F5)

lavenderblush (#FFF0F5)

floralwhite (#FFFAF0)

floralwhite (#FFFAF0)

mintcream (#F5FFFA)

mintcream (#F5FFFA)

ghostwhite (#F8F8FF)

ghostwhite (#F8F8FF)

honeydew (#F0FFF0)

honeydew (#F0FFF0)

seashell (#FFF5EE)

seashell (#FFF5EE)

ivory (#FFFFF0)

ivory (#FFFFF0)

azure (#F0FFFF)

azure (#F0FFFF)

snow (#FFFAFA)

snow (#FFFAFA)

white (#FFFFFF)

white (#FFFFFF)

gainsboro (#DCDCDC)

gainsboro (#DCDCDC)

lightgrey (#D3D3D3)

lightgrey (#D3D3D3)

silver (#C0C0C0)

silver (#C0C0C0)

darkgray (#A9A9A9)

darkgray (#A9A9A9)

lightslategray (#778899)

lightslategray (#778899)

slategray (#708090)

slategray (#708090)

gray (#808080)

gray (#808080)

dimgray (#696969)

dimgray (#696969)

darkslategray (#2F4F4F)

darkslategray (#2F4F4F)

black (#000000)

black (#000000)



 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

No. 10445

ARCHIVE LOG MODE 운영 방법
==========================

Oracle에서 Online Backup을 받거나 완벽한 Recovery 작업을 수행하기
위해서는 DB를 Archive log mode로 운영하여야 한다.


텍스트로 만들어진 파라미터 화일을 사용하는 경우 (Oracle 8i 까지)
Archive log mode로 운영하기 위해서는 다음과 같이 변경하여야 한다.

1.  initSID.ora file과 configSID.ora 에 다음의 parameter가 이미 setting
    되어 있는지 확인한 후에 없을 경우 initSID.ora 에 setting한다.

1) LOG_ARCHIVE_START = TRUE

  * ARCH process 가 기동
  * log switch 발생 시 automatic archive를 수행한다.
    만약 이 parametrer가 false이면 manual archive를 실시하여야 한다.

2) LOG_ARCHIVE_DEST = /home/oracle7/dbs/archive_file/arc

 * archive 장소의 디렉토리와 확장자를 포함하지 않는 파일명을 지정.
 * 여기에서 archive_file까지는 directory이며 마지막에 있는 arc는
   archive log file의 initial 명이다.
              
3) LOG_ARCHIVE_FORMAT = %s.log

 * archive file의 확장자와 log sequence 번호의 형식을 지정.
 * 이는 (2)에서 정의된 archive log의 initial file 명과 함께 나타난다.

   [ 예 ]  arc123.log, arc124.log
          (123과 124는 log sequence number 이다.)
           와 같은 형태의 화일이 생성된다.


2. 다음과 같이 작업하여 archive log mode로 변환한다.

        $ svrmgrl

 SVRMGR> connect internal
 SVRMGR> startup mount                - (1)
 SVRMGR> alter database archivelog;   - (2)
 SVRMGR> archive log list             - (3)
        Database log mode                ARCHIVELOG - (4)
        Automatic archival               ENABLED    - (5)
        Archive destination           ?/dbs_ar/offline_log/offline - (6)
        Oldest online log sequence       123 - (7)
        Next log sequence to archive     125 - (8)
        Current log sequence             125 - (9)
        SVRMGR> alter database open;       - (10)
       
       
(1)  DB를 startup mount까지만 한다.
(2)  이 Command를 이용하여 archivelog mode로 DB를 변경한다.
(3)  Archivelog mode로 변경되었는지를 확인한다.
(4)  DB가 Archivelog mode임을 나타낸다.
     만약 NOARCHIVELOG로 되어 있으면 변경되지 않은 것을 의미한다.
(5)  initSID.ora file에서 LOG_ARCHIVE_START parameter를 TRUE로
     정의하였음을 나타내며 false인 경우에는 DISABLED로 나타난다.
(6)  initSID.ora file의 LOG_ARCHIVE_DEST parameter에서 정의한
     archive할 장소이다.
(7)  3 개의 redo log 중 가장 오래된 redo log의 sequence가 123임을
     의미한다.
(8)  다음에 archive 받을 file의 log sequence 번호를 나타낸다.
(9)  현재 사용 중인 redo log의 sequence가 125임을 의미한다.
     만약 이전부터 archivelog mode로 운영 중이었다면 여기에서 archivelog
     file은 log sequence 124까지 archiveing되어있다는 것을 의미한다.
(10) Archive mode로 변경 후 DB를 open한다.

바이너리로 만들어진 파라미터 화일을 사용하는 경우 (Oracle 9i 부터)
Archive log mode로 운영하기 위해서는 다음과 같이 변경하여야 한다.

1.  Parameter 확인

$sqlplus /nolog

SQL>connect sys/passwd@orcl as sysdba
Connected.
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oracle/dbs/
Oldest online log sequence     1
Current log sequence           3

SQL> select name, value from v$parameter
     where name = 'log_archive_start'
     or name = 'log_archive_dest'
     or name = 'log_archive_format' ;

2. 다음과 같이 작업하여 archive log mode로 변환한다.

SQL> ALTER SYSTEM SET LOG_ARCHIVE_START = TRUE
     SCOPE=SPFILE;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area   89201304 bytes
Fixed Size                   453272 bytes
Variable Size              67108864 bytes
Database Buffers           20971520 bytes
Redo Buffers                 667648 bytes
Database mounted.
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence     1
Current log sequence           3
SQL> alter database archivelog;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3
SQL> alter database open
  2  ;

Database altered.

반대로, archivelog mode에서 no archivelog mode로 전환하는 방법은 다음과
같습니다. archivelog mode에서 no archivelog mode로 전환하기 전에
데이터베이스는 반드시 immediate 또는 normal 로 셧다운 되어야만 전환이
가능 합니다.

먼저, 위에서 setting 했던 initSID.ora file 와 configSID.ora 에 있는
다음 parameter 앞에 # 을 넣고 저장합니다.

#LOG_ARCHIVE_START = TRUE
#LOG_ARCHIVE_DEST = /home/oracle7/dbs/archive_file/arc
#LOG_ARCHIVE_FORMAT = %s.log

  $ svrmgrl
  SVRMGR> connect internal;
  SVRMGR> shutdown immediate
  SVRMGR> startup mount
  ORACLE instance started.
  Database mounted.
  SVRMGR> alter database noarchivelog;
  Statement processed.
  SVRMGR> alter database open;
  Statement processed.

바이너리로 만들어진 파라미터 화일을 사용하는 경우 (Oracle 9i 부터)
Noarchive log mode로 운영하기 위해서는 다음과 같이 변경하여야 한다.

1.  Parameter 확인

$sqlplus /nolog

SQL>connect sys/passwd@orcl as sysdba
Connected.
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3

SQL> select name, value from v$parameter
     where name = 'log_archive_start'
     or name = 'log_archive_dest'
     or name = 'log_archive_format' ;

2. 다음과 같이 작업하여 Noarchive log mode로 변환한다.

SQL> ALTER SYSTEM SET LOG_ARCHIVE_START = FALSE
     SCOPE=SPFILE;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area   89201304 bytes
Fixed Size                   453272 bytes
Variable Size              67108864 bytes
Database Buffers           20971520 bytes
Redo Buffers                 667648 bytes
Database mounted.
SQL> alter database noarchivelog;

Database altered.
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oracle/dbs/archive/orcl/arc
Oldest online log sequence     1
Current log sequence           3
SQL> alter database open
  2  ;

Database altered.

    

 


아카이브 데스티네이션 경로 변경
-- db archive mode 로 변경시키는 방법
-- archive mode : redo log file 을 백업을 받는 방식

SQL> archive log list
데이터베이스 로그 모드              아카이브 모드가 아님
자동 아카이브             사용 안함
아카이브 대상            C:\oracle\ora92\RDBMS
가장 오래된 온라인 로그 순서     48
현재 로그 순서           51

SQL> alter system set log_archive_start = true scope=spfile;
시스템이 변경되었습니다.

-- os directory 설정
-- oracle 에선 파일은 자동으로 만들어주는데 디렉토리는 무조건
-- 사용자가 수동으로 만들어줘야 한다.

SQL> alter system set log_archive_dest_1 ='location=c:\arch1';

시스템이 변경되었습니다.

SQL> alter system set log_archive_dest_2 = 'location=c:\arch2';

시스템이 변경되었습니다.

-- log_archive_dest 확인
SQL> show parameter log_archive_dest


-- archive file 형식 지정
SQL> alter system set log_archive_format ='%t_%s.arc' scope=spfile;

-- %s 는 로그 시퀀스 번호

시스템이 변경되었습니다.

SQL> shutdown immediate

SQL> startup mount
-- control file 을 읽는다.

ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
데이터베이스가 마운트되었습니다.

-- control file 의 속성을 바꾼다.
-- archivelog mode 로 변경

SQL> alter database archivelog;

데이타베이스가 변경되었습니다.

SQL> archive log list
데이터베이스 로그 모드              아카이브 모드
자동 아카이브             사용
아카이브 대상            c:\arch2
가장 오래된 온라인 로그 순서     48
아카이브할 다음 로그   51
현재 로그 순서           51

SQL> alter database open;

데이타베이스가 변경되었습니다.

SQL> alter system switch logfile;

시스템이 변경되었습니다.

-- 그러면 c:\arch1, c:\arch2 밑에 로그파일이 생성된다.

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가


PL/SQL 이란 ?

 
- PL/SQL 은 Oracle's Procedural Language extension to SQL. 의 약자 입니다.

 - SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원하며,
   오라클 자체에 내장되어 있는 Procedure Language입니다

 - DECLARE문을 이용하여 정의되며, 선언문의 사용은 선택 사항입니다.  

 - PL/SQL 문은 블록 구조로 되어 있고 PL/SQL 자신이 컴파일 엔진을 가지고 있습니다.



PL/SQL의 장점

 - PL/SQL 문은 BLOCK 구조다수의 SQL 문을 한번에 ORACLE DB 로 보내서 처리하므로
   수행속도를 향상 시킬수 있습니다.

 - PL/SQL 의 모든 요소는 하나 또는 두개이상의 블록으로 구성하여 모듈화가 가능하다.

 - 보다 강력한 프로그램을 작성하기 위해서 큰 블록안에 소블럭을 위치시킬 수 있습니다.

 - Variable, Constant, Cursor, Exception을 정의하고, SQL문장과 Procedural 문장에서
   사용합니다. .

 - 단순, 복잡한 데이터형태의 변수를 선언합니다.

 - 테이블의 데이터 구조와 DataBase의 컬럼럼에 준하여 동적으로 변수를 선언 할 수 있습니다.

 - Exception 처리 루틴을 이용하여 Oracle Server Error를 처리합니다.

 - 사용자 정의 에러를 선언하고 Exception 처리 루틴으로 처리 가능 합니다.

 

* 교육 담당 & 관리자 : 김 윤 석
* 교육 문의 & 예약 접수 : 02) 6255-8046
* 홈페이지 http://www.itmoya.net/ocp/main_1.htm
- 오라클지정 교육원, 본원 시험실시, 40%바우쳐제공

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가


PL/SQL Block Structure

 - PL/SQL은 프로그램을 논리적인 블록으로 나누는 구조화된 블록 언어 입니다.

 - PL/SQL 블록은 선언부(선택적), 실행부(필수적),예외 처리부(선택적)로 구성되어 있고,  
   BEGIN과 END 키워드는 반드시 기술해 주어야 합니다.

 - PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있습니다.

 

● DECLARE
    - Optional
    - Variables, cursors, user-defined exceptions

● BEGIN
    - Mandatory
    - SQL Statements
    - PL/SQL Statements

● EXCEPTION
    - Actions to perform when errors occur

● END;
    - Mandatory



  ◈ Declarative Section(선언부)

   -  변수, 상수, CURSOR, USER_DEFINE Exception선언


  ◈ Executable Section(실행부)

   -  SQL, 반복분, 조건문실행
   -  실행부는 BEGIN으로 시작하고 END 로 끝납니다.
   -  실행문은 프로그램 내용이 들어가는 부분으로서 필수적으로 사용되어야 합니다.


  ◈ Exception Handling Section(예외처리)

    - 예외에 대한 처리.
    - 일반적으로 오류를 정의하고 처리하는 부분으로 선택 사항입니다.



PL/SQL 프로그램의 작성 요령

 
 - PL/SQL 블록내에서는 한 문장이 종료할 때마다 세미콜론(;)을 사용합니다. .

  - END뒤에 ;을 사용하여 하나의 블록이 끝났다는 것을 명시 합니다.

  - PL/SQL 블록의 작성은 편집기를 통해 파일로 작성할 수도 있고,
    SQL프롬프트에서 바로 작성할 수도 있습니다.

  - SLQ*PLUS환경에서는 DELCLARE나 BEGIN이라는 키워드로 PL/SQL블럭이 시작하는 것을
    알 수 있습니다.

 - 단일행 주석 : --

 - 여러행 주석 : /* */

 - PL/SQL 블록은 행에 / 가있으면 종결 됩니다.

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

UTL_SMTP PACKAGE을 사용하여 E-MAIL을 GENERATE하는 과정

======================================================

 

PURPOSE

---------

 

UTL_SMTP package는 Oracle8i Release 2 (8.1.6)이상에서 UTL_TCP package을 이용하여 e-mail 을 PL/SQL에서 generate하는 것이 가능하게 하였다.

 

Explanation

-----------

 

UTL_SMTP packag을 사용하기 위해서는 Database에 Java option이 install되어 있어야 하며 TCPConnection class인 $ORACLE_HOME/plsql/jlib/plsql.jar file이 load되어 있어야 한다. 그리고 JAVA_POOL_SIZE는 40M이상을 권장한다.

 

UTL_SMTP package을 사용하여 E-mail을 generate하는 과정을 살펴보자.

 

1. SMTP server을 이용하여 connection을 맺는다. (보통 25번 port을 사용한다)

이것은 UTL_SMTP.OPEN_CONNECTION() function call을 통해 가능하다.

 

Ex) utl_smtp.open_connection(mailhost,25)

 

2. SMTP server와 UTL_SMTP.HELO() call을 통해 초기화을 한다.

 

Ex) utl_smtp.helo(mail_conn,mailhost);

 

3. UTL_SMTP.MAIL()을 이용하여 'From' mail ID 를 지정한다.

 

Ex) utl_smtp.mail(mail_conn,sender);

 

4. UTL_SMTP.RCPT()을 이용하여 'To' mail ID 를 지정한다.

 

Ex) utl_smtp.rcpt(mail_conn,recipient);

 

5. Body의 message을 정렬시에는 <CR><LF>에 의해 line을 나눌 수 있다.

 

Ex) CHR(13)||CHR(10)

 

6. UTL_SMTP.DATA() 응 이용하여 UTL_SMTP buffer로 message을 pass한다.

 

Ex) utl_smtp.data(mail_conn,message);

 

7. UTL_SMTP.QUIT()을 call함으로써 SMTP connection을 끝내게 된다.

 

Ex) utl_smtp.quit(mail_conn);

 

좀더 자세한 sample은 bulletin : 12130에서 보기로 하고 여기선 간단히 E-mail을 보내는 sample을 보여주기로 한다.

 

Example 
-------- 

      CREATE OR REPLACE PROCEDURE send_email 
      ( sender    IN VARCHAR2, 
        recipient IN VARCHAR2, 
        message   IN VARCHAR2) 
      AS 
       
        mailhost VARCHAR2(100) := 'gmapacsmtp.oraclecorp.com'; 
        mail_conn utl_smtp.connection; 

      BEGIN 

         mail_conn :=utl_smtp.open_connection(mailhost,100);  
         utl_smtp.helo(mail_conn,mailhost);  
         utl_smtp.mail(mail_conn,sender);  
         utl_smtp.rcpt(mail_conn,recipient);  
         utl_smtp.data(mail_conn,message);  
         utl_smtp.quit(mail_conn); 

     END; 
/ 

 

SQL> exec send_email('Oracle','TTT@oracle.com','This sample is education purpose only');

 

 Sample2) 한글 data을 mail로 보낼때는 bulletin : 12130을 자세히 보면  
          알 수 있듯이 Sample1의 utl_smtp.data(mail_conn,message);  
          부분을 바꾸어 주어야 한다. 

      CREATE OR REPLACE PROCEDURE send_email 
      ( sender    IN VARCHAR2, 
        recipient IN VARCHAR2, 
        message   IN VARCHAR2) 
      AS 
       
        mailhost VARCHAR2(100) := 'gmapacsmtp.oraclecorp.com'; 
        mail_conn utl_smtp.connection; 

      BEGIN 

         mail_conn :=utl_smtp.open_connection(mailhost,100);  
         utl_smtp.helo(mail_conn,mailhost);  
         utl_smtp.mail(mail_conn,sender);  
         utl_smtp.rcpt(mail_conn,recipient);  
--         utl_smtp.data(mail_conn,message);  

         utl_smtp.open_data(mail_conn); 
         utl_smtp.write_raw_data(mail_conn, UTL_RAW.CAST_TO_RAW(message)); 
         utl_smtp.close_data(mail_conn); 

         utl_smtp.quit(mail_conn); 

     END; 
/ 

 

SQL> exec send_email('Oracle','TTT@oracle.com','이 샘플은 교육목적입니다.');

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

산술 함수
 

  • ABS(n) : 절대값 |n|
  • sin() cos() tan() sinH() cosH() tanH() : radian값을 이용
    • ex> 30' 일 경우 sin(30* (3.14.../180));
  • exp(n) : 지수값 e를 밑으로 하는 e의 n승 값;
  • LN(n):자연 log값 밑수 e 지수 n
  • SQRT(n): 루트n
  • power(m,n): m의 n승
  • MOD(m.n) : m을  n 으로 나눈 나머지
  • floor(n): n보다 작은 정수값들중에서 최대값
  • ceil(n): n보다 큰 정수값들중에서 최소값
     
    • ex> floor(3.5)   -->  3   ,    ceil (3.5)  -->  4
    •        floor(-3.2) --> -4  ,     ceil (-3.5) --> -3
  • greatest(m,n): 두 수중에서 큰것
  • least(m,n);두 수중에서 작은 것
  • TO_NUMBER('숫자형 문자열'):문자를 숫자로 변환
  • round(m,n):반올림
  • trunc(m,n):절삭한다 즉 반올림을 허용하지 않는다.
     
    • ex>  Round(2.4678, 2)   -->  2.47   ,    trunc(2.4687, 2)    -->  2.46
    •      Round(3654.26, -2) --> 3700  ,   trunc (3654.26, -2 ) --> 3600
  • NVL(col명,값): col의 값이 null를 가질때 값을 가진다.
    • ex> 100+NULL은 NULL이 되기 때문에 이러한 문제점을 해결할 때 사용한다.
    • select ename,sal,comm,sal+nvl(comm,0) from emp;

           -->sal값과 comm값을 더하는데 comm값이 null값이면 0값을 취한다...

문자열 함수

  •  lower():소문자로 변환시켜주는 함수
  • upper():대문자로 변환시켜주는 함수
  • Initcap():단어의 첫자만 대문자로 나머지는 소문자로
     
    • Initcap('i LOVE you') ---->  I Love You

 

  •  ength():문자열의 길이
  • substr(문자열,위치,갯수): 해당위치에서 갯수만큼의 문자열을 추출한다.
     
    • substr ('KOREA', 3, 2) ---->  'RE'
      -- 3번째인 R부터 2글자 출력
  • instr(문자열,찾을 문자열[,위치,찾을위치])

 :문자열에서 이 문자를 찾아라. return값은 찾은 위치
 

    • Instr("abcdabkdoerabjdlfjdg","ab") -----> 1
      -- 1번째에서 시작해서 처음  ab가 나타나는 1출력
    • Instr("abcdabkdoerabjdlfjdg","ab",4,2) ---->  12
      -- 4번째부터 시작해서 두번째 나타나는  ab 출력

 

  • user:현재 접속된 사용자를 보여준다.
  • decode(col명,비교값,취할값,비교값,취할값,....기본값)

 :col값이 비교값이면 취할값으로 대체.

 

    • decode(deptno,10,'총무부',20,'영업부',30,'전산부','관리부'):나머지는 관리부
      -- deptno가 10이면 총무부 , 20이면 영업부, 30이면 전산부 나머지 는 관리부 출력

날짜 함수

  • TO_CHAR(날짜,'포맷'): 날짜를 문자열로 바꾼다.
  • TO_DATE(문자열,'포맷'):문자열을 날짜로 ex> TO_DATE('97-10-14',' -----')
  • ADD_MONTHS(날짜,n):현재 날짜에 n개월수를 더한다.
  • MONTHS_BETWEEN(날짜1,날짜2):두 날짜의 개월수의 차를 구한다.
  • LAST_DAY(날짜):그 달의 마지막 날짜를 구한다.
  • NEXT_DAY(날짜,'요일'):날짜로 부터 다음에 나오는 요일은 며칠인가
    • next_day(sysdate,'금요일')
  • 날짜 + n : 날짜에다 n 일을 더한다.
  • 포맷:
    • yy : 년도를 2자리로
    • yyyy : 년도를 4자리로
    • year : 영어 철자로 표시
    • mm :월을 표시(01-12)
    • mon :월을 표시(DEC....):약자로 나온다.
    • month :월을 표시(1월,2월,....혹은 ,DECEMBER)
    • d :일을 표시(주에 대한 일)
    • dd :일을 표시 (월에 대한 일)
    • ddd :일을 표시 (년에 대한 일)
    • Q : 분기를 구한다.
    • DAY :요일 (월요일)
    • DY  :요일(월)
    • HH & HH12 :시간을 12시간제로
    • HH24 :24시간제로
    • MI:분
    • SS:초
    • AM & PM & A.M & P.M:12시간제 일때 오전 오후를 표시
    • 접미사로 사용하는 포맷
      • TH:서수로 표시 ex> 4 -> DD ->4
      •                               4-> DDTH -> 4TH
      • SP:철자로 표시 ex> 4 ->DDSP -> FOUR
      • SPTH & THSP  ex> 4 -> DDSPTH -> FOURTH
      •  근무한 년월 수 ex> column "근무년수" Format a 14;

그룹 함수

  •  group함수 :
    • NULL값은 계산되지 않는다.
    • 여러개의 데이타에 대한 결과 이므로 그룹함수라 한다
    • 단일 필드와 함께 사용할 수 없다.
    • 만약 단일 필드와 사용되면 group by절에 반드시 나와야 한다.
  • sum() : 합
  • avg() : 평균
  • count() : 갯수  count(*): 리턴되는 레코드의 수를 계산
    • ex> select deptno,sum(sapay) from sawon;  에러
       -->단위 필드이므로 따라서 마지막에 group by deptno;라고 지정해주면 사용가능
  • max() : 최대값
  • min() : 최소값
  • stddev : 표준편차
  • variance : 분산  

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가


★ 오라클 9i + 10g 실무중심 자격증취득 교육

 

오라클 공인 전문가 제도(Oracle Certified Professional)는 오라클 제품 사용자의 관련 업무별 전문

기술 지식 정도를 측정하여 대내외적으로 증명해 주며, 오라클의 제품과 최신 기술을 활용하여 최적의 솔루션을 설계, 개발, 응용하는데 필요한 인력의 역량을 인증해 주는 프로그램입니다.

 

* 교육 담당 & 관리자 : 김 윤 석
* 교육 문의 & 예약 접수 : 02) 6255-8046
* 홈페이지 http://www.itmoya.net/ocp/main_1.htm
- 오라클지정 교육원, 본원 시험실시, 40%바우쳐제공

 

2006 오라클 9I+10G 양성교육 일정은 국비지원 제도 사항으로 혜택을받으실수 있습니다.
자세한 교육내용를 알고 싶으시면 운영자에게 개인상담 / 전화 /메일로 주시면 자세한
세부 교육커리 와 수강료에 대해서 안내해 드리겠습니다.

 

※본원 오라클 지정 취업지원과정 교육 파트너(Oracle Workforce Development Program)

 

오라클의 정규 과정의 강의를 수행할 수 있는 강사를 보유한 기관을 대상으로 오라클의 교육과목에

대하여 공식교재와 S/W를 활용하여 교육과정을 진행하는 교육 기관입니다.

협력교육기관은 자체적으로 과정을 개설하며, 수강생을 모집하고, 강의를 수행하며, 교육 품질에 대한 책임도 협력 교육기관이 소유하는 형태의 교육 협력 파트너입니다.
오라클은 우수 IT인력 양성과 실업자/미취업자의 취업 지원을 위한 취업지원과정을 통해 오라클의 교육과정을 수강하고자 하는 수강희망자에게 폭넓은 기회를 제공하고자 노력하고 있습니다.

 

▶ 교육과정 : ORACL-DBA 9I [WDP공인지정센터]
▶ 개강안내 : 매월 초 개강 / 수시접수 / 교육시간 조정가능 / 평일,주말반 운영
▶ 교육대상 : 데이터베이스 전문가가 되기 원하는 사람
                    OCP 자격증 취득을 원하는 사람
                    오라클을 사용하여 SQL 프로그래밍을 하려는 사람
▶ 모집정원 : 15명[선착순마감]
▶ 교육혜택 : WDP지정센터로 오라클 교육과정 수강신청시 바우처 40% 할인쿠폰 증정 [재수강 무료]
▶ 교육장소 : 강남ITWILL교육센터 7층[오라클 공인 강의장]

 

<강남 국제자격증 시험센터>
전 과정 15명이내 소수 집중 강의와 30석 세미나형 강의
전 강의장 빔 프로젝트 또는 모니터 분배기를 통한 비쥬얼 교육
대학교수(경희대,중앙대,청강대 등) 및 현장경력 6년의 실무진 강사
담임선생님의 철저한 회원관리
1인 1대의 교육시스템
우수수강생중 선별하여 보원 프로젝트 참여기회 부여
노동부 지정 교육기관 - 고용보험 환급제도 실시 교육기관
제1회 KOEX전자상거래박람회 웹마스터대표교육기관선정
매일경제 TV방영
(크리에이티브21,인터넷 전문교육기관선정- 2월 18일 방영)
HOW PC 웹전문 교육기관 선정(1999년 11월호)
정통부,노동부 지정교육원
iMBC 라이프 협력업체 ,
동아일보 donga.com제휴업체
리눅스원지정교육기관
호산나넷 IT 지정교육원
KTF 지정교육기관

 

<시스템>
펜티엄 5 512MB 80GHDD LCD 모니터
최고급 강의 시스템-XGA Beam Projector
최고급 서버
전용 교육서버
HP Netserver LH4 Xeon 55O 4 Way RAID 5
및 Inter PⅢ-866 Dual 8대운영
Ciscon CCNA, CCNP, CCIE 실습용 랙 완비
SUN Ultra 10 10대보유
Unix 전용서버 운영
10M급 전용회선

 

▶ 오라클 9I 교육과정 및 세부내용
---------------------------------------------------------
1)Introduction to Oracle SQL and PL/SQL
2)Oracle9i Database: Fundamentals I
3)Oracle9i Database: Fundamentals II
4)Oracle9i Database: Performance Tuning
---------------------------------------------------------

 

교육과정 세부내용 - 8주교육 [주5일 일일3시간 진행]

 

* 1개월


<1,2주차> PL/SQL (1Z0-007)
OCP 자격증 개요
PL/SQL의 기초, 블록(선언부,실행부,예외 처리부)
제어문의 구조(IF문, CASE문, LOOP문, GOTO문, NULL문)
예외 처리(종류, 처리부의 형식, 처리 방식)
오라클 데이터 조작

(DML, CURSOR, CURSOR FOR LOOP, CURSOR Variable, CURSOR 연산식, DCL)
타입(COLLECTION, BULK BINDING, RECORD)
모듈 - 프로시저, 함수, 패키지(PRIVILEGE, 모듈 호출, FUNCTION, 패키지, 오버로딩, 외부 프로시저)
트리거(DML 트리거, INSTEAD OF TRIGGER, 시스템 이벤트 트리거)
Native Dynamic SQL(DBMS_SQL 패키지, 고유 동적 SQL)
객체(Object Type, COLLECTION, 객체 뷰, 이름 분석(Name Resolution)과 엘리어스)
상속

(Inheritance, Step by Step, 치환성(sbsstitutability), 타입의 진화(Type Evolution), 객체 뷰의 상속)

 

<3,4주차> Fundamental Ⅰ (1Z0-031)
Basic of the Oracle Database Architecture
(오라클 서버구조, 오라클 서버 시작하기, Oracle Instance의 관리,오라클 데이터베이스 생성)
Managing the Physical Database Structure
(데이터 딕셔너리의 내용과 용도, 컨트롤 파일의 유지, 리두 로그 파일 유지)
Managing Tablespaces and Datafiles
(데이터베이스의 논리적 구조에 대한 설명)
Storage Structures and Undo Data
(저장 구조 및 관계, 언두 데이터의 관리)
Managing Database Objects
(테이블의 관리, 인덱스 관리, 데이터 무결성 관리)
Managing Database Users
(사용자 관리, 비밀번호 보안 및 리소스 관리, 권한의 관리, 롤의 관리(Managing Roles)

 

* 2개월


<1,2주차> Fundamental Ⅱ (1Z0-032)
Networking 개요
Oracle Net Architecture 기본
Net Server-Side 구성의 기본
Oracle Net Services Client-Side 구성의 기본
오라클 공유 서버의 활용과 구성
Backup과 Recovery 개요
인스턴스와 미디어 복구 개요
Database Archive 모드 구성
Oracle Recovery Manager 개요와 구성
User-Managed Backups
RMAN Backups
User-Managed Complete Recovery
RMAN Complete Recovery
User-Managed Incomplete Recovery
RMAN Incomplete Recovery
RMAN Maintenance
Recovery Catalog 생성과 유지보수
데이터베이스간의 데이터 전송
데이터베이스내로 데이터 로딩

 

<3,4주차> Performance Tuning (1Z0-033)
Database Tuning 개요
오라클 성능 튜닝 방법
진단과 튜닝 도구
동적 성능 뷰의 통계
스태츠팩을 사용한 통계수집
경고 로그와 추적 파일
공유 풀 크기 조정
버퍼 개시의 크기 조정
나머지 SGA 구조의 크기 조정
데이터베이스 구성과 I/O 문제
정렬 작업의 최적화
래치 경합의 진단
롤백
언두세그먼트 튜닝
락 경합의 모니터링과 탐지
오라클 공유 서버의 튜닝
애플리케이션 튜닝
오라클 블록의 효율적 사용
SQL 구문 튜닝
OS 고려사항
데이터베이스 Resource Manager

 

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

9i설치후 8080 포트 사용하는 것 바꾸기

9i를 설치후 톰캣이나 여타 container를 설치 후 8080 포트를 오라클의 http 프로세스가 사용해서 8080 포트 사용이 불가하다는 질문을 가끔 받을 때가 있는데..

그런 경우의 처리는 이렇게 하면 된다.

 

우선, Oracle XDB 라는 녀석이 8080포트와 2100을 쓴다.

 

포트 변경 하는 법

1. [시작] -> [프로그램] -> [Oracle - OraHome92] -> [Configuration and Migration Tools] -> [Database Configuration Assistant] 선택
2. [다음] 버튼을 Click -> [데이터베이스의 데이이터베이스 옵션구성] 선택
3. 옵션을 구성하고자 하는 [사용 가능한 데이터베이스] 선택

4. Oracle XML DB 의 [사용자 정의 ...] 버튼을 Click  그리고 FTP 및 WebDAV 포트는 기본 설정인 2100 을 사용.
5. [확인] 버튼을 Click 하시고 [다음] 버튼을 Click .

    데이터베이스를 실행할 기본모드를 선택하시고 [완료]
6. 다른 db가 있다면 다시 수행

 

포트를 아예 안쓰고 싶다면  4, 5번 단계에서 'XML 프로토콜 비활성화'를 체크하면 가능 

 

설치시에 XML DB OPTION을 아예 사용하지 않도록 하면 xml db 자체를 설치 하지 않음

 

참고 - "XML Database Developer s Guide - Oracle XML DB" 책의 21장
"Configuring Oracle XML DB with Enterprise Manager"

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

MSSQL, MySQL에만 익숙해져있던 나에겐 오라클은 골치덩이 그 자체였다. 설치할 때 뜨는 무수한 오류와 (9i 버전으로 2000에 설치하니까 로그 파일을 찾을 수 없다는 오류가 계속 나왔다, 결국 xp에 설치했다) 사용하기 힘든 인터페이스, 또 왜 그리 느린지... 물론 내가 오라클에 대한 지식이 없어서 오라클의 강점을 느끼지 못하고 있는거지만 그래도 너무 불편하였다. 특히나! 설치 후 Oracle

Universal Installer 로 삭제를 해도 서비스 목록에서 나가지 않고 버팅기는 오라클의 위력이란 참...

그래서 이번엔 윈도우 2000 기준으로 오라클을 완전히 삭제하는 방법에 관한 팁이다. 이 방법은 물론 내가 알아낸 것이 아니라 여러 오라클 관련 포럼에서 보고 종합한 것이다.

 

오라클을 분명히 언인스톨 완료 까지 했는데 서비스 목록에 가보면 오라클 서비스가 지워지지 않고 계속 작동중인것을 볼 수 있을 것이다. 이런 상태에서 같은 버전, 혹은 다른 버전의 오라클을 설치했을 때 제대로 작동이 되지 않는다. (설치가 제대로 되지 않아 8i, 9i, 10g 버전을 골고루 깔아봤을 때 전 버전이 제대로 삭제되어있지 않으면 잘 설치가 되지 않았다) 이 것을 완전히 삭제 하려면 레지스트리에서 오라클에 관련된 항목을 모두 수동으로 삭제해 주어야 한다.  일단

 

1) 윈도우 서비스에 들어가서 오라클 관련 모든 서비스를 멈춘다.

 

regedit을 실행시킨 후

2) HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services

이 부분에서 Oracle로 시작되는 부분을 모두 지운다.

 

3) HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE

이 부분 마찬가지 Oracle로 시작되는 부분을 모두 지운다.

 

4) 물리적인 하드 드라이브에 존재하는 오라클 관련 폴더들을 지워준다. 하드를 파티션을 나누었을 때 C드라이브에 설치를 안해도 설치한 드라이브, C드라이브에 모두 오라클 관련 폴더가 남는다.

 

5) 재부팅 후 서비스에 오라클 서비스가 남아있는지 확인 한다.

 

실질적인 방법은 매우 간단하다. 하지만 이 과정을 거치지 않으면 제대로 삭제가 되지 않기때문에 서비스 문제 발생의 원인이 될 수 있다.

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Oracle - PL/SQL


PLSQL 이란?


PL/SQL 이란 ?

 
- PL/SQL 은 Oracle's Procedural Language extension to SQL. 의 약자 입니다.

 - SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원하며,
   오라클 자체에 내장되어 있는 Procedure Language입니다

 - DECLARE문을 이용하여 정의되며, 선언문의 사용은 선택 사항입니다.  

 - PL/SQL 문은 블록 구조로 되어 있고 PL/SQL 자신이 컴파일 엔진을 가지고 있습니다.



PL/SQL의 장점

 - PL/SQL 문은 BLOCK 구조다수의 SQL 문을 한번에 ORACLE DB 로 보내서 처리하므로
   수행속도를 향상 시킬수 있습니다.

 - PL/SQL 의 모든 요소는 하나 또는 두개이상의 블록으로 구성하여 모듈화가 가능하다.

 - 보다 강력한 프로그램을 작성하기 위해서 큰 블록안에 소블럭을 위치시킬 수 있습니다.

 - Variable, Constant, Cursor, Exception을 정의하고, SQL문장과 Procedural 문장에서
   사용합니다. .

 - 단순, 복잡한 데이터형태의 변수를 선언합니다.

 - 테이블의 데이터 구조와 DataBase의 컬럼럼에 준하여 동적으로 변수를 선언 할 수 있습니다.

 - Exception 처리 루틴을 이용하여 Oracle Server Error를 처리합니다.

 - 사용자 정의 에러를 선언하고 Exception 처리 루틴으로 처리 가능 합니다.


PL/SQL Block 구조


PL/SQL Block Structure

 - PL/SQL은 프로그램을 논리적인 블록으로 나누는 구조화된 블록 언어 입니다.

 - PL/SQL 블록은 선언부(선택적), 실행부(필수적),예외 처리부(선택적)로 구성되어 있고,  
   BEGIN과 END 키워드는 반드시 기술해 주어야 합니다.

 - PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있습니다.

 

● DECLARE
    - Optional
    - Variables, cursors, user-defined exceptions

● BEGIN
    - Mandatory
    - SQL Statements
    - PL/SQL Statements

● EXCEPTION
    - Actions to perform when errors occur

● END;
    - Mandatory



  ◈ Declarative Section(선언부)

   -  변수, 상수, CURSOR, USER_DEFINE Exception선언


  ◈ Executable Section(실행부)

   -  SQL, 반복분, 조건문실행
   -  실행부는 BEGIN으로 시작하고 END 로 끝납니다.
   -  실행문은 프로그램 내용이 들어가는 부분으로서 필수적으로 사용되어야 합니다.


  ◈ Exception Handling Section(예외처리)

    - 예외에 대한 처리.
    - 일반적으로 오류를 정의하고 처리하는 부분으로 선택 사항입니다.



PL/SQL 프로그램의 작성 요령

 
 - PL/SQL 블록내에서는 한 문장이 종료할 때마다 세미콜론(;)을 사용합니다. .

  - END뒤에 ;을 사용하여 하나의 블록이 끝났다는 것을 명시 합니다.

  - PL/SQL 블록의 작성은 편집기를 통해 파일로 작성할 수도 있고,
    SQL프롬프트에서 바로 작성할 수도 있습니다.

  - SLQ*PLUS환경에서는 DELCLARE나 BEGIN이라는 키워드로 PL/SQL블럭이 시작하는 것을
    알 수 있습니다.

 - 단일행 주석 : --

 - 여러행 주석 : /* */

 - PL/SQL 블록은 행에 / 가있으면 종결 됩니다.
 


PL/SQL 블럭의 유형


Block Type(PL/SQL 블럭의 유형)

 
[ Anonymous ]

 
[ Procedure ]

 
[ Function ]



 ◈ Anonymous Block(익명 블록)
 
    이름이 없는 블록을 의미 합니다.
    실행하기 위해 프로그램 안에서 선언되고 실행 시에 실행을 위해 PL/SQL 엔진으로 전달됩니다.
    선행 컴파일러 프로그램과 SQL*Plus 또는 서버 관리자에서 익명의 블록을 내장할 수 있습니다.
 
    
 ◈ Procedure(프로시저)
    
    특정 작업을 수행할수 있는 이름이 있는 PL/SQL 블록으로서.
    매개 변수를 받을수 있고.. 반복적으로 사용할수 있는거죠..
    보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL블록을
    데이터 베이스에 저장하기 위해 생성합니다.
 
 
 ◈ Function(함수)
 
    보통 값을 계산하고 결과값을 반환하기 위해서 함수를 많이 사용 합니다.
    대부분 구성이 프로시저와 유사하지만 IN 파라미터만 사용 할 수 있고,
    반드시 반환될 값의 데이터 타입을 RETURN문에 선언해야 합니다.
    또한 PL/SQL블록 내에서 RETURN문을 통해서 반드시 값을 반환해야 합니다.


프로시저(PROCEDURE)


프로시져란..


특정 작업을 수행할수 있고, 이름이 있는 PL/SQL 블록으로서. 매개 변수를 받을수
있고.. 반복적으로 사용
할수 있는거죠.. 보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는
PL/SQL블록을 데이터 베이스에 저장하기 위해 생성합니다.

CREATE OR REPLACE 구문을 사용하여 생성합니다.
IS 로 PL/SQL의 블록을 시작합니다.
LOCAL 변수는 IS 와 BEGIN 사이에 선언합니다.
 

    [Syntax]

    CREATE OR REPLACE procedure name
       IN argument
       OUT argument
       IN OUT argument

    IS

       [변수의 선언]

    BEGIN   
    --> 필수

       [PL/SQL Block]
       -- SQL문장, PL/SQL제어 문장

       [EXCEPTION]  --> 선택
      -- error가 발생할 때 수행하는 문장

    END;   --> 필수


프로시저 작성 예제

SQL>CREATE OR REPLACE PROCEDURE update_sal
        /* IN  Parameter */
        (v_empno         IN    NUMBER)
        
       IS

       BEGIN

       UPDATE emp
       SET sal = sal  * 1.1
       WHERE empno = v_empno;

       COMMIT;

       END update_sal;
       /

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


설명..
프로시저의 이름은 update_sal이고..
프로시저 update_sal은 사번(v_empno)를 입력받아서 급여를 update시켜주는 sql문입니다.
프로시저를 끝마칠때에는 항상 "/"를 지정 합니다.

프로시저의 실행
EXECUTE 문을 이용해 프로시저를 실행합니다.

SQL> execute update_sal(7369);
 
PL/SQL 처리가 정상적으로 완료되었습니다.

7369번 사원의 급여가 10% 인상됐습니다.
SELECT 문을 실행시켜보면 데이터가 수정된 것을 확인할수 있습니다.



Parameter란

 
실행 환경과 program사이에 값을 주고 받는 역할을 합니다.

 
블록 안에서의 변수와 똑같이 일시적으로 값을 저장하는 역할을 합니다.

 
function에서는 IN만 있고, OUT과, INOUT는 사용하지 않습니다.

 
Parameter의 타입
    - IN :  실행환경에서 program으로 값을 전달
    - OUT : program에서 실행환경으로 값을 전달
    - INOUT : 실행환경에서 program으로 값을 전달하고,
                  다시 program에서 실행환경으로 변경된 값을 전달
.
 


함수(FUNCTION)


 ◈ 함수(Function)

 - 보통 값을 계산하고 결과값을 반환하기 위해서 함수를 많이 사용 합니다.

 - 대부분 구성이 프로시저와 유사 하지만 IN 파라미터만 사용 할 수 있습니다.

 - 반드시 반환될 값의 데이터 타입을 RETURN문에 선언해야 합니다.

 - 또한 PL/SQL블록 내에서 RETURN문을 통해서 반드시 값을 반환해야 합니다.
 


[Syntax]

CREATE OR REPLACE FUNCTION function name
  [(argument...)]
  RETURN  datatype
    -- Datatype은 반환되는 값의 datatype입니다.

IS

   [변수 선언 부분]

BEGIN

  [PL/SQL Block]

    -- PL/SQL 블록에는 적어도 한 개의 RETURN 문이 있어야 합니다.
    -- PL/SQL Block은 함수가 수행할 내용을 정의한 몸체부분입니다.

END;
 



SQL> CREATE OR REPLACE FUNCTION FC_update_sal
         (v_empno         IN    NUMBER)

          -- 리턴되는 변수의 데이터타입을 꼭 정의해야 합니다
          RETURN NUMBER  .

        IS

        v_sal  emp.sal%type;

        BEGIN

        UPDATE emp
        SET sal  = sal  * 1.1
        WHERE empno  = v_empno;
   
        COMMIT;
 
        SELECT sal
        INTO v_sal
        FROM emp
        WHERE empno = v_empno;

        -- 리턴문이 꼭 존재해야 합니다
        RETURN v_sal;

       END;

함수가 생성되었습니다.
 



설명..

이 함수에는 v_sal이라는 %type 변수가 사용되고 있습니다.
스칼라 데이터 타입을 참고하세요.
프로지저와 마찬가지로 세미콜론(;)으로 블록을 종료한 뒤 "/"를 붙여 코드를 끝마칩니다.


함수의 실행

먼저 함수의 반환값을 저장할 변수를 선언합니다.

SQL> VAR salary NUMBER;


EXECUTE 문을 이용해 함수를 실행합니다.
SQL>EXECUTE :salary := FC_update_sal(7900);

PL/SQL 처리가 정상적으로 완료되었습니다.


오라클 SQL에서 선언된 변수의 출력은 PRINT문을 사용합니다.
PRINT문으로 함수의 반환값을 저장한 salary의 값을 확인하면 됩니다.

SQL>PRINT salary;
 
    SALARY
----------
      1045

결과가 이렇게 나옵니다.
 


스칼라 데이터 타입

변수 선언 방법






Identifier의 이름은 sql의 object명과 동일한 규칙을 따릅니다.

Identifier를 상수로 지정하고 싶은 경우는 CONSTANT라는 KEYWORD를 명시하고
    반드시 초기화를 할당합니다.

NOT NULL이 정의되어 있으면 초기값을 반드시 지정하고,
    정의되어 있지 않을 때는 생략 가능합니다.

초기값은 할당 연산자(:=)를 사용하여 정의 합니다.

초기값을 정의하지 않으면 Identifier는 NULL값을 가지게 됩니다.

일반적으로 한줄에 한 개의 Identifier를 정의 합니다.
 


스칼라 데이터 타입은 단수 데이터형으로 한가지의 데이터 값만 가집니다.
 

BINARY_INTEGER

-2147483647에서 2147483647 사이의 정수

NUMBER[(P, S)]

고정 및 부동 소숫점 수에 대한 기본 유형

CHAR[(최대길이)]

32767바이트까지의 고정길이 문자 데이터에 대한 기본 유형으로 최대길이를 명시하지 않으면 기본적으로 길이는 1로 설정

LONG

32760바이트까지의 가변길이 문자 데이타

VARCHAR2(최대길이)

32767바이트까지의 가변길이 문자 데이타

DATE

날짜와 시각에 대한 기본 유형

BOOLEAN

논리연산에 사용되는 세 가지 값(TRUE, FALSE, NULL) 중 하나를 저장 하는 기본 유형

 

선언 예제

v_price CONTANT NUMBER(4,2) := 12.34 ;     -- 상수 숫자 선언(변할 수 없다)

v_name VARCHAR22(20) ;

v_Bir_Type   CHAR(1) ;

v_flag   BOOLEAN  NOT NULL := TRUE ;      -- NOT NULL 값 TRUE로 초기화

v_birthday DATE;



%TYPE 데이터형


%TYPE 데이터형은 기술한 데이터베이스 테이블의 컬럼 데이터 타입을 모를 경우 사용할 수 있고,

또. 코딩이후 데이터베이스 컬럼의 데이터 타입이 변경될 경우 다시 수정할 필요가 없습니다.

이미 선언된 다른 변수나 데이터베이스 컬럼의 데이터 타입을 이용하여 선언합니다.

 데이터 베이스 테이블과 컬럼 그리고 이미 선언한 변수명이 %TYPE앞에 올수 있습니다.


%TYPE 속성을 이용하여 얻을 수 있는 장점
   - 기술한 DB column definition을 정확히 알지 못하는 경우에 사용할 수 있습니다.
   - 기술한 DB column definition이 변경 되어도 다시 PL/SQL을 고칠 필요가 없습니다.
 

예제
v_empno  emp.empno%TYPE := 7900 ;
v_ename emp.ename%TYPE;
 

예제 프로시져..

SQL>CREATE OR REPLACE PROCEDURE Emp_Info
      -- IN Parameter
      ( p_empno IN emp.empno%TYPE )

        IS

        -- %TYPE 데이터형 변수 선언
        v_empno emp.empno%TYPE;
        v_ename emp.ename%TYPE;
        v_sal   emp.sal%TYPE;

        BEGIN

        DBMS_OUTPUT.ENABLE;

        -- %TYPE 데이터형 변수 사용
        SELECT empno, ename, sal
        INTO v_empno, v_ename, v_sal  
        FROM emp
        WHERE empno = p_empno ;

        -- 결과값 출력
        DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || v_empno );
        DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || v_ename );
        DBMS_OUTPUT.PUT_LINE( '사원급여 : ' || v_sal );

        END;
       /


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

SQL>SET SERVEROUTPUT ON;     --  DBMS_OUTPUT 결과값을 화면에 출력 하기위해


실행 결과
SQL> EXECUTE Emp_Info(7369);

사원번호 : 7369
사원이름 : SMITH
사원급여 : 880
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 


%ROWTYPE


하나 이상의 데이터값을 갖는 데이터 타입으로 배열과 비슷한 역할을 하고 재사용이 가능합니다.
%ROWTYPE데이터 형과, PL/SQL테이블과 레코드가 복합 데이터 타입에 속합니다.


%ROWTYPE


 테이블이나 뷰 내부의 컬럼 데이터형, 크기, 속석등을 그대로 사용할수 있습니다.

 %ROWTYPE 앞에 오는 것은 데이터 베이스 테이블 이름입니다.

 지정된 테이블의 구조와 동일한 구조를 갖는 변수를 선언할수 있습니다.

 데이터베이스 컬럼들의 수나 DATATYPE을 알지 못할 때 편리 합니다.

 테이블의 데이터 컬럼의 DATATYPE이 변경될 경우 프로그램을 재수정할 필요가 없습니다.  
 
 


%ROWTYPE 예제 프로시져..

SQL>CREATE OR REPLACE PROCEDURE RowType_Test
        ( p_empno IN emp.empno%TYPE )

    IS

        -- %ROWTYPE 변수 선언
        v_emp   emp%ROWTYPE ;

   BEGIN

        DBMS_OUTPUT.ENABLE;

        -- %ROWTYPE 변수 사용
        SELECT empno, ename, hiredate
        INTO v_emp.empno, v_emp.ename, v_emp.hiredate
        FROM emp
        WHERE empno = p_empno;

       DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || v_emp.empno );
       DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || v_emp.ename );
       DBMS_OUTPUT.PUT_LINE( '입 사 일 : ' || v_emp.hiredate );

   END;
        /

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



실행 결과

SQL> SET SERVEROUTPUT ON ;  -- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용

SQL> EXECUTE RowType_Test(7900);

사원번호 : 7900
사원이름 : JAMES
입 사 일 : 81/12/03

PL/SQL 처리가 정상적으로 완료되었습니다.


PL/SQL 테이블


  
PL/SQL 에서의 테이블은 오라클 SQL에서의 테이블과는 다릅니다. PL/SQL에서의 테이블은
일종의 일차원 배열이라고 생각하시면 이해하기 쉬울겁니다.


테이블은 크기에 제한이 없으면 그 ROW의 수는 데이터가 들어옴에 따라 자동 증가 합니다.

BINARY_INTEGER 타입의인덱스 번호로 순서가 정해집니다.

하나의 테이블에 한 개의 컬럼 데이터를 저장 합니다.  
 




예제


TYPE prdname_table IS TABLE OF VARCHAR2(30)
INDEX BY BINARY_INTEGER;

--
prdname_table 테이블타입으로 prdname_tab변수를 선언해서 사용
prdname_tab   prdname_table ;
 



PL/SQL 테이블 예제 프로시져..

SQL>CREATE OR REPLACE PROCEDURE Table_Test
    (v_deptno IN emp.deptno%TYPE)

    IS

         -- 각 컬럼에서 사용할 테이블의 선언
         TYPE empno_table IS TABLE OF emp.empno%TYPE
         INDEX BY BINARY_INTEGER;

         TYPE ename_table IS TABLE OF emp.ename%TYPE
         INDEX BY BINARY_INTEGER;

         TYPE sal_table IS TABLE OF emp.sal%TYPE
         INDEX BY BINARY_INTEGER;

         -- 테이블타입으로 변수를 선언해서 사용
         empno_tab  empno_table ;
         
ename_tab  ename_table ;
         
sal_tab    sal_table;

         i BINARY_INTEGER := 0;

   BEGIN

         DBMS_OUTPUT.ENABLE;

         FOR emp_list IN(SELECT empno, ename, sal FROM emp WHERE deptno = v_deptno) LOOP

          /* emp_list는 자동선언되는 BINARY_INTEGER형 변수로 1씩 증가합니다.
            
emp_list대신 다른 문자열 사용가능 */

                i := i + 1;

               -- 테이블 변수에 검색된 결과를 넣습니다
                empno_tab(i) := emp_list.empno ;     
                ename_tab(i) := emp_list.ename ;
                sal_tab(i)   := emp_list.sal ;

          END LOOP;

          -- 1부터 i까지 FOR 문을 실행
          FOR cnt IN 1..i LOOP

             -- TABLE변수에 넣은 값을 뿌려줌
             DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || empno_tab(cnt) );
             DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || ename_tab(cnt) );
             DBMS_OUTPUT.PUT_LINE( '사원급여 : ' || sal_tab(cnt) );

          END LOOP;

  END;
  /

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

실행 결과

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)
SQL> EXECUTE Table_Test(10);

사원번호 : 7782
사원이름 : CLARK
사원급여 : 2450
사원번호 : 7839
사원이름 : KING
사원급여 : 5000
사원번호 : 7934
사원이름 : MILLER
사원급여 : 1300

PL/SQL 처리가 정상적으로 완료되었습니다.

 emp 테이블에 있는 데이터의 입력한 부서에 해당하는 사원번호, 사원이름, 사원급여를
 뿌려주는 프로시져 입니다


PLSQL 레코드


여러개의 데이터 타입을 갖는 변수들의 집합입니다.

스칼라, RECORD, 또는 PL/SQL TABLE datatype중 하나 이상의 요소로 구성됩니다.

논리적 단위로서 필드 집합을 처리할 수 있도록 해 줍니다.

PL/SQL 테이블과 다르게 개별 필드의 이름을 부여할 수 있고, 선언시 초기화가 가능합니다.
 

예제

  TYPE record_test IS RECORD
    ( record_empno   NUMBER,
      record_ename   VARCHAR2(30),
      record_sal        NUMBER);

      prd_record    record_test;


PL/SQL RECORD 예제 프로시져..

SQL> CREATE OR REPLACE PROCEDURE Record_Test
      ( p_empno IN emp.empno%TYPE )

     IS

         -- 하나의 레코드의 세가지의 변수타입 선언

         TYPE emp_record IS RECORD
         (v_empno    NUMBER,
          v_ename    VARCHAR2(30),
          v_hiredate  DATE );

         emp_rec   emp_record ;

   BEGIN

         DBMS_OUTPUT.ENABLE;

         -- 레코드의 사용
         SELECT empno, ename, hiredate
         INTO emp_rec.v_empno, emp_rec.v_ename, emp_rec.v_hiredate
         FROM emp
         WHERE empno = p_empno;

        DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || emp_rec.v_empno );
        DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || emp_rec.v_ename );
        DBMS_OUTPUT.PUT_LINE( '입 사 일 : ' || emp_rec.v_hiredate );

   END;
 /


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


실행 결과
SQL> SET SERVEROUTPUT ON ;  
-- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE Record_Test(7369);

사원번호 : 7369
사원이름 : SMITH
입 사 일 : 80/12/17

PL/SQL 처리가 정상적으로 완료되었습니다.

 %ROWTYPE예제와 비교해 보세요


PL/SQL Table of Record


⊙ PL/SQL TABLE변수 선언과 비슷하며 데이터타입을 %ROWTYPE으로 선언하면 됩니다.
PL/SQL TABLE과 RECORD의 복합 기능을 합니다.

 



DECLARE

TYPE dept_table_type IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;

-- Each element of dept_table  is a record
dept_table   dept_table_type ;
 



PL/SQL TABLE OF RECORD 예제 프로시져..

CREATE OR REPLACE PROCEDURE Table_Test
IS
        i BINARY_INTEGER := 0;
 
     -- PL/SQL Table of Record의 선언
    TYPE dept_table_type IS TABLE OF dept%ROWTYPE
     INDEX BY BINARY_INTEGER;
 
     dept_table dept_table_type;
 
BEGIN
 
 
    FOR dept_list IN (SELECT * FROM dept) LOOP
 
                i:= i+1;
  
        -- TABLE OF RECORD에 데이터 보관
        dept_table(i).deptno := dept_list.deptno ;     
        dept_table(i).dname := dept_list.dname ;
        dept_table(i).loc   := dept_list.loc ;
 
    END LOOP;
 
 
    FOR cnt IN 1..i LOOP
 
     -- 데이터 출력
     DBMS_OUTPUT.PUT_LINE( '부서번호 : ' || dept_table(cnt).deptno ||
                                          '부서명 : ' ||  dept_table(cnt).dname ||
                                          '위치 : ' || dept_table(cnt).loc );
 
    END LOOP;
 
 END;
/
 
 
SQL>set serveroutput on;
SQL>exec Table_test;
부서번호 : 10부서명 : ACCOUNTING위치 : NEW_YORK
부서번호 : 20부서명 : RESEARCH위치 : DALLAS
부서번호 : 30부서명 : 인사과위치 : CHICAGO
부서번호 : 40부서명 : OPERATIONS위치 : BOS%TON
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 


INSERT


PL/SQL에서의 INSERT 문은 SQL과 비슷합니다.
 

사원 등록 예제 프로시져..

SQL> CREATE OR REPLACE PROCEDURE Insert_Test
        ( v_empno  IN emp.empno%TYPE,
          v_ename  IN emp.ename%TYPE,
          v_deptno IN emp.deptno%TYPE )

        IS

      BEGIN

          DBMS_OUTPUT.ENABLE;
    
          INSERT INTO emp(empno, ename, hiredate, deptno)
          VALUES(v_empno, v_ename, sysdate, v_deptno);

          DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || v_empno );
          DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || v_ename );
          DBMS_OUTPUT.PUT_LINE( '사원부서 : ' || v_deptno );
          DBMS_OUTPUT.PUT_LINE( '데이터 입력 성공 ' );

       END ;
      /           

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


실행 결과
SQL> SET SERVEROUTPUT ON ;  
-- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL>  EXECUTE Insert_Test(1000, 'brave', 20);

사원번호 : 1000
사원이름 : brave
사원부서 : 20
데이터 입력 성공

PL/SQL 처리가 정상적으로 완료되었습니다.
 


UPDATE

상품 수정 예제 프로시저..
※ 특정 사원의 급여를 일정%센트 인상/인하하는 프로시져


SQL>CREATE OR REPLACE PROCEDURE Update_Test
       ( v_empno IN    emp.empno%TYPE,       -- 급여를 수정한 사원의 사번
         v_rate     IN    NUMBER )                     -- 급여의 인상/인하율

         IS

         -- 수정 데이터를 확인하기 위한 변수 선언
         v_emp  emp%ROWTYPE ;

         BEGIN

         DBMS_OUTPUT.ENABLE;

         UPDATE emp
         SET sal = sal+(sal * (v_rate/100))   -- 급여를 계산
         WHERE empno = v_empno ;

         DBMS_OUTPUT.PUT_LINE( '데이터 수정 성공 ' );

         -- 수정된 데이터 확인하기 위해 검색
         SELECT empno, ename, sal
         INTO v_emp.empno, v_emp.ename, v_emp.sal
         FROM emp
         WHERE empno = v_empno ;

         DBMS_OUTPUT.PUT_LINE( ' **** 수 정 확 인 **** ');
         DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || v_emp.empno );
         DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || v_emp.ename );
         DBMS_OUTPUT.PUT_LINE( '사원급여 : ' || v_emp.sal );

         END ;
         /

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

프로시저 실행
SQL> SET SERVEROUTPUT ON ;  -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE Update_Test(7900, -10);

데이터 수정 성공
**** 수 정 확 인 ****
사원번호 : 7900
사원이름 : JAMES
사원급여 : 855

PL/SQL 처리가 정상적으로 완료되었습니다.

7900번 사원의 급여를 10% 인하했습니다.


DELETE

사원 삭제 예제 프로시저..

SQL> CREATE OR REPLACE PROCEDURE Delete_Test
    ( p_empno IN  emp.empno%TYPE )

        IS

        -- 삭제 데이터를 확인하기 레코드 선언
        TYPE del_record IS  RECORD
        ( v_empno      emp.empno%TYPE,
          v_ename      emp.ename%TYPE,
          v_hiredate    emp.hiredate%TYPE) ;

          v_emp  del_record ;

        BEGIN

        DBMS_OUTPUT.ENABLE;

         -- 삭제된 데이터 확인용 쿼리
         SELECT empno, ename, hiredate
         INTO v_emp.v_empno, v_emp.v_ename, v_emp.v_hiredate
         FROM emp
         WHERE empno = p_empno ;

        DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || v_emp.v_empno );
        DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || v_emp.v_ename );
        DBMS_OUTPUT.PUT_LINE( '입 사 일 : ' || v_emp.v_hiredate );

        -- 삭제 쿼리
        DELETE
        FROM emp
        WHERE empno = p_empno ;

        DBMS_OUTPUT.PUT_LINE( '데이터 삭제 성공 ' );

       END;
 /

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


프로시저 실행 (결과화면)
SQL> SET SERVEROUTPUT ON ;  
-- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE Delete_Test(7900);
사원번호 : 7900
사원이름 : JAMES
입 사 일 : 81/12/03
데이터 삭제 성공

 
PL/SQL 처리가 정상적으로 완료되었습니다.

※ 7900사원을 삭제했습니다.


FOR LOOP

FOR LOOP문



  -  index 는 자동 선언되는 binary_integer 형 변수이고. 1씩 증가합니다.
  -  reverse 옵션이 사용될 경우 index 는 upper_bound에서 lower_bound로 1씩 감소합니다.
  -  IN 다음에는 coursor나 select 문이 올수 있습니다.



    FOR문 예제


    DECLARE

    -- 사원 이름을 출력하기 위한 PL/SQL 테이블 선언
    TYPE ename_table IS TABLE OF emp.ename%TYPE
    INDEX BY BINARY_INTEGER;

    -- 사원 급여를 출력하기 위한 PL/SQL 테이블 선언
    TYPE sal_table IS TABLE OF emp.sal%TYPE
    INDEX BY BINARY_INTEGER;

    ename_tab    ename_table;
    sal_tab      sal_table;

    i BINARY_INTEGER := 0;

    BEGIN

    DBMS_OUTPUT.ENABLE;

    FOR emp_list IN  (SELECT ename, sal FROM emp WHERE deptno = 10) LOOP

       i := i +1 ;

       ename_tab(i) := emp_list.ename;     -- 테이블에 상품 이름을 저장
       sal_tab(i)      := emp_list.sal;          -- 테이블에 상품 가격을 저장

    END LOOP;


    FOR cnt IN   1..i   LOOP         --  화면에 출력

       DBMS_OUTPUT.PUT_LINE('사원이름 : ' || ename_tab(cnt));
       DBMS_OUTPUT.PUT_LINE('사원급여 : ' || sal_tab(cnt));

    END LOOP;

    END;
    /



    사원이름 : CLARK
    사원급여 : 2450
    사원이름 : KING
    사원급여 : 5000
    사원이름 : MILLER
    사원급여 : 1300

    PL/SQL 처리가 정상적으로 완료되었습니다.


LOOP문, WHILE문



EXIT 문이 사용되었을 경우, 무조건 LOOP문을 빠져나갑니다,

EXITH WHEN 이 사용될 경우  WHEN 절에 LOOP를 빠져 나가는 조건을 제어할수 있습니다.


LOOP 문 예제

SQL> SET SERVEROUTPUT ON ;  -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL>  DECLARE

          v_cnt number(3) := 100;

          BEGIN

          DBMS_OUTPUT.ENABLE ;

          LOOP

              INSERT INTO emp(empno, ename , hiredate)
              VALUES(v_cnt, 'test'||to_char(v_cnt),  sysdate);

              v_cnt := v_cnt+1;

              EXIT WHEN v_cnt > 110;

          END LOOP;

          DBMS_OUTPUT.PUT_LINE('데이터 입력 완료');
          DBMS_OUTPUT.PUT_LINE(v_cnt-100 || '개의 데이터가 입력되었습니다');

          END;           
         /

데이터 입력 완료
11개의 데이터가 입력되었습니다

PL/SQL 처리가 정상적으로 완료되었습니다
.


WHILE LOOP 문

    WHILE LOOP문은 FOR 문과 비슷하며 조건이 TRUE일 경우만 반복되는 LOOP문 입니다.

    예제

    WHILE cnt < 10 LOOP

       INSERT INTO emp(empno, ename , hiredate)
       VALUES(emp_seq.nextval, 'test',  sysdate);

    cnt := cnt + 1 ;

    END LOOP ;

    cnt가 10이면 반복 While Loop를 탈출

    EXIT WHEN
    조건 => 조건이 만족할 때 반복 loop를 탈출합니다. .


조건제어(IF)




IF문 예제 프로시저..

SQL>CREATE OR REPLACE PROCEDURE Dept_Search
(p_empno IN emp.empno%TYPE )

IS

v_deptno emp.deptno%type ;

BEGIN

DBMS_OUTPUT.ENABLE;

SELECT deptno
INTO v_deptno
FROM emp
WHERE empno = p_empno ;

IF v_deptno = 10 THEN

DBMS_OUTPUT.PUT_LINE( ' ACCOUNTING 부서 사원입니다. ' );

ELSIF v_deptno = 20 THEN

DBMS_OUTPUT.PUT_LINE( ' RESEARCH 부서 사원입니다. ' );

ELSIF v_deptno = 20 THEN

DBMS_OUTPUT.PUT_LINE( ' SALES 부서 사원입니다. ' );

ELSIF v_deptno = 20 THEN

DBMS_OUTPUT.PUT_LINE( ' OPERATIONS 부서 사원입니다. ' );

ELSE

DBMS_OUTPUT.PUT_LINE( ' 부서가 없네요... ' );

END IF ;

END ;
/


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

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

프로시저 실행

SQL> EXECUTE Dept_Search(7900);

부서가 없네요...
PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> EXECUTE Dept_Search(7369);

RESEARCH 부서 사원입니다.
PL/SQL 처리가 정상적으로 완료되었습니다.


암시적 커서(Implicit Cursor)


  암시적인 커서는 오라클이나 PL/SQL실행 메커니즘에 의해 처리되는 SQL문장이 처리되는 곳에 대한
  익명의 에드레스입니다. 오라클 데이터 베이스에서 실행되는 모든 SQL문장은 암시적인 커서이며
  그것들과 함께 모든 암시적인 커서 속성이 사용될 수 있습니다.

     -암시적 커서의 속성

    SQL%ROWCOUNT : 해당 SQL 문에 영향을 받는 행의 수

    SQL%FOUND : 해당 SQL 영향을 받는 행의 수가 1개 이상일 경우 TRUE

    SQL%NOTFOUND : 해당 SQL 문에 영향을 받는 행의 수가 없을 경우 TRUE

    SQL%ISOPEN : 항상 FALSE, 암시적 커서가 열려 있는지의 여부 검색

    (암시적 커서는 SQL 문이 실행되는 순간 자동으로 열림과 닫힘 실행)


    암시적 커서 예제

    CREATE OR REPLACE PROCEDURE Implicit_Cursor
    (p_empno emp.empno%TYPE)

    is

    v_sal  emp.sal%TYPE;
    v_update_row NUMBER;

    BEGIN

    SELECT sal
    INTO v_sal
    FROM emp
    WHERE empno = p_empno ;

    -- 검색된 데이터가 있을경우
    IF  SQL%FOUND THEN     

        DBMS_OUTPUT.PUT_LINE('검색한 데이터가 존재합니다 : '||v_sal);

    END IF;

    UPDATE emp
    SET sal = sal*1.1
    WHERE empno = p_empno;

    -- 수정한 데이터의 카운트를 변수에 저장
    v_update_row := SQL%ROWCOUNT;

    DBMS_OUTPUT.PUT_LINE('급여가 인상된 사원 수 : '|| v_update_row);

    END;

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


    SQL> SET SERVEROUTPUT ON ;  -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)
    SQL> EXECUTE Implicit_Cursor(7369);

    검색한 데이터가 존재합니다 : 880
    급여가 인상된 사원 수 : 1

    PL/SQL 처리가 정상적으로 완료되었습니다.
     


Explicit Cursor



▣ 커서란 무엇인가?

커서는 Private SQL의 작업영역 입니다.
오라클 서버에 의해 실행되는 모든 SQL문은 연관된 각각의 커서를 소유하고 있습니다.
커서의 종류
   - 암시적 커서 : 모든 DML과 PL/SQL SELECT문에 대해 선언됩니다.
   - 명시적 커서 : 프로그래머에 의해 선언되며 이름이 있는 커서입니다.
 

▣ Explicit Cursor의 흐름도?

▣ 문법(Syntax)




▣ 커서 열기(OPEN)

커서의 열기는 OPEN문을 사용합니다.
커서안의 검색이 실행되며 아무런 데이터행을 추출하지 못해도 에러가 발생하지 않습니다.

    OPEN   cursor_name;


▣ 커서 패치(FETCH)

커서의 FETCH는 현재 데이터 행을 OUTPUT변수에 반환합니다.
커서의 SELECT문의 컬럼의 수와 OUTPUT변수의 수가 동일해야 합니다.
커서 컬럼의 변수의 타입과 OUTPUT변수의 데이터 타입도 동일해야 합니다.
커서는 한 라인씩 데이터를 패치 합니다.

    FETCH   cursor_name INTO variable1, variable2 ;


▣ 커서 닫기(CLOSE)

사용을 맞친 커서는 반드시 닫아 주어야 합니다.
필요하다면 커서를 다시 열 수 있습니다.
커서를 닫은 상태에서 FETCH를 할 수 없습니다.

    CLOSE   cursor_name;
 


Explicit Cursor 예제
특정 부서의 평균급여와 사원수를 출력..


FOR문에서 커서 사용(Cursor FOR Loops)


FOR문을 사용하면 커서의 OPEN, FETCH, CLOSE가 자동 발생하므로 따로 기술할
    필요가 없습니다
레코드 이름도 자동 선언되므로 따로 선언할 필요가 없습니다.


 

FOR문에서 커서 사용 예제
부서별 사원수와 급여 합계를 구하는 프로시저입니다.

SQL> CREATE OR REPLACE PROCEDURE ForCursor_Test
        IS

        CURSOR dept_sum IS
        SELECT b.dname, COUNT(a.empno) cnt, SUM(a.sal) salary
        FROM emp a, dept b
        WHERE a.deptno = b.deptno
        GROUP BY b.dname;

     BEGIN

       -- Cursor를 FOR문에서 실행시킨다
       FOR emp_list IN dept_sum LOOP

          DBMS_OUTPUT.PUT_LINE('부서명 : ' || emp_list.dname);
          DBMS_OUTPUT.PUT_LINE('사원수 : ' || emp_list.cnt);
          DBMS_OUTPUT.PUT_LINE('급여합계 : ' || emp_list.salary);

       END LOOP;

   EXCEPTION

       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

   END;
   /

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

실행 결과

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE ForCursor_Test;
부서명 : ACCOUNTING
사원수 : 3
급여합계 : 8750
부서명 : RESEARCH
사원수 : 6
급여합계 : 10875
부서명 : SALES
사원수 : 6
급여합계 : 9305
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 


명시적 커서의 속성(Explicit Cursor Attributes)

▣ Explicit Cursor 속성
 
%ISOPEN
      - 커서가 OPEN되어 있으면 TRUE
      -  %ISOPEN속성을 이용하여 커서가 열려있는지 알 수 있습니다.

%NOTFOUND
      - 패치한 데이터가 행을 반환하지 않으면 TRUE
      -  %NOTFOUND속성을 이용하여 루프를 종료할 시점을 찾습니다.

%FOUND
      - 패치한 데이터가 행을 반환하면 TRUE

%ROWCOUNT
     -
현재까지 반환된 모든 데이터 행의 수
      - %ROWCOUNT속성을 이용하여 정확한 숫자만큼의 행을 추출합니다.

 

커서의 속성 예제

SQL>CREATE OR REPLACE PROCEDURE AttrCursor_Test
       IS
 
       v_empno     emp.empno%TYPE;
       v_ename     emp.ename%TYPE;
       v_sal          emp.sal%TYPE;

      CURSOR emp_list IS
         SELECT empno, ename, sal
         FROM emp;    

 
    BEGIN


      DBMS_OUTPUT.ENABLE;

      OPEN emp_list;   

      LOOP    

        FETCH emp_list INTO v_empno, v_ename, v_sal;

           -- 데이터를 찾지 못하면 빠져 나갑니다
           EXIT WHEN emp_list%NOTFOUND;       
     
      END LOOP;    


       DBMS_OUTPUT.PUT_LINE('전체데이터 수 ' || emp_list%ROWCOUNT);
    

     CLOSE emp_list;
    
     EXCEPTION
    
       WHEN OTHERS THEN

         DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);
        
    END;
   /



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

실행 결과

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE AttrCursor_Test;
전체데이터 수 15

PL/SQL 처리가 정상적으로 완료되었습니다.
 


파라미터가 있는 커서(Cursors with Parameters)

커서가 열리고 질의가 실행되면 매개 변수 값을 커서에 전달한다.
다른 active set을 원할때 마다 explicit커서를 따로 선언해야 한다


▣ 문법(Syntax)

 


파라미터가 있는 커서 예제

SQL> CREATE OR REPLACE PROCEDURE ParamCursor_Test
        (param_deptno   emp.deptno%TYPE)
        IS

         v_ename     emp.ename%TYPE;

       -- Parameter가 있는 커서의 선언
        CURSOR emp_list(v_deptno emp.deptno%TYPE) IS
        SELECT ename
        FROM emp
        WHERE deptno = v_deptno;

       BEGIN

        DBMS_OUTPUT.ENABLE;
        DBMS_OUTPUT.PUT_LINE(' ****** 입력한 부서에 해당하는 사람들 ****** ');              

       -- Parameter변수의 값을 전달(OPEN될 때 값을 전달한다)
        FOR emplst IN emp_list(param_deptno) LOOP    

          DBMS_OUTPUT.PUT_LINE('이름 : ' || emplst.ename);

        END LOOP;    

        EXCEPTION     

          WHEN OTHERS THEN

             DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);         

        END;
        /

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

실행 결과

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE ParamCursor_Test(10);
****** 입력한 부서에 해당하는 사람들 ******
이름 : CLARK
이름 : KING
이름 : MILLER

PL/SQL 처리가 정상적으로 완료되었습니다.
 


The WHERE CURRENT OF Clause

WHERE CURRENT OF

   - ROWID를 이용하지 않고도 현재 참조하는 행을 갱신하고 삭제할 수 있게 합니다.
   - 추가적으로 FETCH문에 의해 가장 최근에 처리된 행을 참조하기 위해서
      "W
HERE CURRENT OF 커서이름 "    절로 DELETE나 UPDATE문 작성이 가능합니다..
   - 이 절을 사용할 때 참조하는 커서가 있어야 하며,  
      
FOR UPDATE절이 커서 선언 query문장 안에 있어야 합니다.
      그렇지 않으면 error가 발생합니다..

 

WHERE CURRENT OF 예제

SQL> SET SERVEROUTPUT ON ;  -- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용

SQL>CREATE OR REPLACE PROCEDURE where_current
         IS

        CURSOR
emp_list IS
             SELECT empno
             FROM emp
             WHERE empno = 7934
            
FOR UPDATE;

      BEGIN

        
--DBMS_OUTPUT.PUT_LINE명령을 사용하기 위해서
        DBMS_OUTPUT.ENABLE;    

        FOR emplst IN emp_list LOOP
             
 --emp_list커서에 해당하는 사람의 직업을  SALESMAN으로 업데이트 시킵니다.
              UPDATE emp
              SET job = 'SALESMAN'
            
WHERE CURRENT OF emp_list;

            DBMS_OUTPUT.PUT_LINE('수정 성공');

        END LOOP;
 
        EXCEPTION
           WHEN OTHERS THEN
                
-- 에러 발생시 에러 메시지 출력
                DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);
END;  
 

--먼저 데이터를 확인해 보세용
SQL> SELECT job FROM emp WHERE empno = 7934;

JOB
---------
CLERK

 --PLSQL을 실행시키고..
SQL> EXECUTE where_current;
수정 성공  
--DBMS_OUTPUT.PUT_LINE명령으로 출력한거..

PL/SQL 처리가 정상적으로 완료되었습니다.
 

-- 다시 데이터를 확인하면 변경된 것을 볼 수 있습니다.
SQL>  SELECT job FROM emp WHERE empno = 7934;
 
JOB
---------
SALESMAN


예외(Exception)



예외(Exception)란?

오라클 PL/SQL의 오류를 예외라고 부릅니다.

오류는 PL/SQL을 컴파일 할때 문법적인 오류로 발생하는 컴파일 타임 오류와,
    프로그램을 실행할때 발생하는 실행타임 오류로 구분할수 있습니다.
 
 



PL/SQL오류의 종류

 예  외

 설  명

 처  리


   미리 정의된 오라클 서버 오류
(Predefined Oracle Server)
 

  PL/SQL에서 자주 발생하는
  약20개의 오류

  선언할 필요도 없고, 발생시에
예외 절로 자동 트랩(Trap)
된다.


  미리 정의되지 않은 오라클
  서버 오류

  (Non-Predefined Oracle   Server)
 

  미리 정의된 오라클 서버
오류를 제외한
모든 오류

  선언부에서 선언해야 하고 발생시
  자동 트랩된다.


  사용자 정의 오류
  (User-Defined)
 

  개발자가 정한 조건에
만족하지 않을경우
발생하는 오류

   선언부에서 선언하고 실행부에서
   RAISE문을 사용하여 발생시켜야
   한다



Execption 문법(Syntax)

WHEN OTHERS절은 맨 마지막에 옵니다.

예외 처리절은 EXCEPTION부터 시작합니다.

허용합니다.

예외가 발생하면 여러 개의 예외 처리부 중에 하나의 예외 처리부에 트랩(Trap)됩니다.


 


미리 정의된 예외(Predefined Exceptions)

  오라클 PL/SQL은 자주 일어나는 몇가지 예외를 미리 정의해 놓았으며,
      이러한 예외는 개발자가 따로 선언할 필요가 없습니다
 

미리 정의된 예외의 종류?

NO_DATA_FOUND : SELECT문이 아무런 데이터 행을 반환하지 못할때

TOO_MANY_ROWS : 하나만 리턴해야하는 SELECT문이 하나 이상의 행을 반환할 때

INVALID_CURSOR : 잘못된 커서 연산

ZERO_DIVIDE : 0으로 나눌때

DUP_VAL_ON_INDEX : UNIQUE 제약을 갖는 컬럼에 중복되는 데이터가 INSERT될때

   이 외에도 몇 개가 더 있습니다.

미리 정의된 예외 예제

SQL> CREATE OR REPLACE PROCEDURE PreException_test
         (v_deptno  IN emp.empno%TYPE)  
    
   IS

       v_emp   emp%ROWTYPE;

   BEGIN

      DBMS_OUTPUT.ENABLE;

      SELECT empno, ename, deptno
      INTO v_emp.empno, v_emp.ename, v_emp.deptno
      FROM emp
      WHERE deptno = v_deptno ;

      DBMS_OUTPUT.PUT_LINE('사번 : ' || v_emp.empno);
      DBMS_OUTPUT.PUT_LINE('이름 : ' || v_emp.ename);
      DBMS_OUTPUT.PUT_LINE('부서번호 : ' || v_emp.deptno);

   EXCEPTION

      WHEN   DUP_VAL_ON_INDEX   THEN
    
          DBMS_OUTPUT.PUT_LINE('데이터가 존재 합니다.');
          DBMS_OUTPUT.PUT_LINE('DUP_VAL_ON_INDEX 에러 발생');

      WHEN   TOO_MANY_ROWS   THEN  

        DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS에러 발생');

      WHEN   NO_DATA_FOUND   THEN  

        DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND에러 발생');

      WHEN   OTHERS   THEN  

        DBMS_OUTPUT.PUT_LINE('기타 에러 발생');

  END;
  /

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




프로시저 실행

SQL> SET SERVEROUTPUT ON ;  -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE PreException_Test(20);
TOO_MANY_ROWS에러 발생

PL/SQL 처리가 정상적으로 완료되었습니다.


 TOO_MANY_ROWS에러를 타는 이유?

 -
SELECT문의 결과가 1개 이상의 행을 리턴하기 때문이다..
 - TOO_MANY_ROWS를 피하기 위해서는 FOR문이나 LOOP문으로 SELECT문을 처리해야 합니다.

아래와 같이 바꾸면 에러가 발생하지 않습니다.


    
 FOR  emp_list  IN
         
(SELECT empno, ename, deptno
         FROM emp
         WHERE deptno = v_deptno)
  LOOP

         DBMS_OUTPUT.PUT_LINE('사번 : ' || emp_list.empno);
         DBMS_OUTPUT.PUT_LINE('이름 : ' || emp_list.ename);
         DBMS_OUTPUT.PUT_LINE('부서번호 : ' || emp_list.deptno);
 
     END LOOP;
 


미리 정의되지 않은 예외(Non-Predefined Exception)


 

STEP 1 : 예외의 이름을 선언(선언절)

STEP 2 : PRAGMA EXCEPTION_INIT문장으로 예외의 이름과 오라클 서버
                  오류 번호를 결합(선언절)

STEP 3 : 예외가 발생할 경우 해당 예외를 참조한다(예외절)
 

리 정의되지 않은 예외 예제

SQL> CREATE OR REPLACE PROCEDURE NonPreException_Test
       IS

          not_null_test EXCEPTION;    -- STEP 1

          /* not_null_test는 선언된 예외 이름
             -1400
Error 처리번호는 표준 Oracle7 Server Error 번호 */
          PRAGMA EXCEPTION_INIT(not_null_test, -1400);       -- STEP 2

        BEGIN

          DBMS_OUTPUT.ENABLE;

        -- empno를 입력하지 않아서 NOT NULL 에러 발생
        INSERT INTO emp(ename, deptno)
        VALUES('tiger', 30);

        EXCEPTION

        WHEN not_null_test THEN    -- STEP 3

            DBMS_OUTPUT.PUT_LINE('not null 에러 발생 ');

       END;
        /

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

실행 결과

SQL> SET SERVEROUTPUT ON ;    -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE NonPreException_Test;
not null 에러 발생

PL/SQL 처리가 정상적으로 완료되었습니다.
 


사용자 정의 예외(User-Defined Exceptions)



 오라클 저장함수 RAISE_APPLICATION_ERROR를 사용하여 오류코드 -20000부터
   -20999의 범위 내에서 사용자 정의 예외를 만들수 있습니다.


 

STEP 1 : 예외의 이름을 선언(선언절)

STEP 2 : RAISE문을 사용하여 직접적으로 예외를 발생시킨다(실행절)

STEP 3 : 예외가 발생할 경우 해당 예외를 참조한다(예외절)
 

사용자 정의 예외 예제 Procedure

입력한 부서의 사원이 5명보다 적으면 사용자 정의 예외가 발생하는 예제 입니다.

SQL>CREATE OR REPLACE PROCEDURE User_Exception
        (v_deptno IN emp.deptno%type )
      IS

       -- 예외의 이름을 선언
       user_define_error EXCEPTION;     -- STEP 1
       cnt     NUMBER;

     BEGIN

       DBMS_OUTPUT.ENABLE;   

       SELECT COUNT(empno)
       INTO cnt
       FROM emp
       WHERE deptno = v_deptno;

       IF cnt < 5 THEN
         -- RAISE문을 사용하여 직접적으로 예외를 발생시킨다
          RAISE user_define_error;         -- STEP 2
       END IF;

      EXCEPTION
        -- 예외가 발생할 경우 해당 예외를 참조한다.
       WHEN user_define_error THEN      -- STEP 3
           RAISE_APPLICATION_ERROR(-20001, '부서에 사원이 몇명 안되네요..');

   END;
  /


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

실행 결과
SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE user_exception(10);
BEGIN user_exception(10); END;
 *
1행에 오류:
ORA-20001: 부서에 사원이 몇명 안되네요..
ORA-06512: "SCOTT.USER_EXCEPTION", 줄 17에서
ORA-06512: 줄 1에서

 10부서의 사원이 5보다 적기 때문에 사용자 정의 예외가 발생했습니다.

SQL> EXECUTE user_exception(20);
PL/SQL 처리가 정상적으로 완료되었습니다. 

20부서로 실행을 하면 에러가 발생하지 않는 것 을 알 수 있습니다..


사용자 정의 예외(User-Defined Exceptions)



 오라클 저장함수 RAISE_APPLICATION_ERROR를 사용하여 오류코드 -20000부터
   -20999의 범위 내에서 사용자 정의 예외를 만들수 있습니다.


 

STEP 1 : 예외의 이름을 선언(선언절)

STEP 2 : RAISE문을 사용하여 직접적으로 예외를 발생시킨다(실행절)

STEP 3 : 예외가 발생할 경우 해당 예외를 참조한다(예외절)
 

사용자 정의 예외 예제 Procedure

입력한 부서의 사원이 5명보다 적으면 사용자 정의 예외가 발생하는 예제 입니다.

SQL>CREATE OR REPLACE PROCEDURE User_Exception
        (v_deptno IN emp.deptno%type )
      IS

       -- 예외의 이름을 선언
       user_define_error EXCEPTION;     -- STEP 1
       cnt     NUMBER;

     BEGIN

       DBMS_OUTPUT.ENABLE;   

       SELECT COUNT(empno)
       INTO cnt
       FROM emp
       WHERE deptno = v_deptno;

       IF cnt < 5 THEN
         -- RAISE문을 사용하여 직접적으로 예외를 발생시킨다
          RAISE user_define_error;         -- STEP 2
       END IF;

      EXCEPTION
        -- 예외가 발생할 경우 해당 예외를 참조한다.
       WHEN user_define_error THEN      -- STEP 3
           RAISE_APPLICATION_ERROR(-20001, '부서에 사원이 몇명 안되네요..');

   END;
  /


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

실행 결과
SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

SQL> EXECUTE user_exception(10);
BEGIN user_exception(10); END;
 *
1행에 오류:
ORA-20001: 부서에 사원이 몇명 안되네요..
ORA-06512: "SCOTT.USER_EXCEPTION", 줄 17에서
ORA-06512: 줄 1에서

 10부서의 사원이 5보다 적기 때문에 사용자 정의 예외가 발생했습니다.

SQL> EXECUTE user_exception(20);
PL/SQL 처리가 정상적으로 완료되었습니다. 

20부서로 실행을 하면 에러가 발생하지 않는 것 을 알 수 있습니다..


Package(패키지)

package?

   패키지(package)는 오라클 데이터베이스에 저장되어 있는 서로 관련있는 PL/SQL
      프로지져와 함수들의 집합 입니다

   패키지는 선언부와 본문 두 부분으로 나누어 집니다.


패키지 선언부

- 선언절은 패키지에 포함될 PL/SQL 프로시저나, 함수, 커서, 변수, 예외절을 선언 합니다.
- 패키지 선언부에서 선언한 모든 요소들은 패키지 전체에 적용됩니다.
- 즉 선언부에서 선언한 변수는 PUBLIC 변수로 사용 됩니다.



 


패키지 본문

- 패키지 본문은 패키지에서 선언된 부분의 실행을 정의 합니다.
- 즉 실재 프로시져나 함수의 내용에 해당하는 부분이 옵니다.



 


아주 간단한 패키지 예제입니다.

4개의 프로시저가 존재하고 있습니다.

프로시저명

프로시저 기능

all_emp_info

  모든 사원의  사원 정보 (사번, 성명, 입사일)

all_sal_info

  모든 사원의  급여 정보 (평균급여, 최고급여, 최소급여)

dept_emp_info

  특정 부서의  사원 정보 (사번, 성명, 입사일)

dept_sql_info

  특정 부서의  급여 정보 (평균급여, 최고급여, 최소급여)

위 4개의 프로시저를 가지고 패키지를 생성하겠습니다.


all_sal_info

 

  1. 모든 사원의  사원 정보(사번, 성명, 입사일)를 보여 주는 프로시져

SQL> CREATE OR REPLACE PROCEDURE all_emp_info
          IS
        
            CURSOR emp_cursor IS
            SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
            FROM emp
            ORDER BY hiredate;
        
          BEGIN
        
            FOR  aa  IN emp_cursor LOOP
       
                DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
                DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
                DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);
        
            END LOOP;
        
          EXCEPTION
                WHEN OTHERS THEN
                        DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
        
          END;

Procedure created.

all_sal_info

 

  2. 모든 사원의  급여 정보 (평균급여, 최고급여, 최소급여)

SQL>CREATE OR REPLACE PROCEDURE all_sal_info
        IS
                
            CURSOR emp_cursor IS
            SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
            FROM emp;
                
        BEGIN
        
            FOR  aa  IN emp_cursor LOOP
                
                DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
                DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
                DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);
                        
            END LOOP;
        
        
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
        END;
/

Procedure created.     

dept_emp_info

 

  3. 특정 부서의  사원 정보 (사번, 성명, 입사일)

SQL> CREATE OR REPLACE PROCEDURE dept_emp_info
          (v_deptno IN  NUMBER)
          IS
        
                CURSOR emp_cursor IS
                SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
                FROM emp
                WHERE deptno = v_deptno
                ORDER BY hiredate;
        
          BEGIN
        
            FOR  aa  IN emp_cursor LOOP
       
                DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
                DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
                DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);
        
            END LOOP;
        
          EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

          END;

dept_sql_info

 

  4. 특정 부서의  급여 정보 (평균급여, 최고급여, 최소급여)   

SQL>CREATE OR REPLACE PROCEDURE dept_sal_info
          (v_deptno IN  NUMBER)
        IS
                
            CURSOR emp_cursor IS
            SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
            FROM emp
            WHERE deptno = v_deptno;
                
                
        BEGIN
        
            FOR  aa  IN emp_cursor LOOP
                
                DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
                DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
                DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);
                        
            END LOOP;
        
        
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
        END;      


선언부를 먼저 생성 합니다.

package 예제
(선언부)

SQL>CREATE OR REPLACE PACKAGE emp_info AS

            PROCEDURE all_emp_info;                                           -- 모든 사원의  사원 정보

            PROCEDURE all_sal_info                                            -- 모든 사원의  급여 정보

            PROCEDURE dept_emp_info (v_deptno IN  NUMBER)     -- 특정 부서의  사원 정보

            PROCEDURE dept_sal_info (v_deptno IN  NUMBER) ;       -- 특정 부서의  급여 정보       

        END emp_info;

Package created.


선언부를 생성 하고 나서 본문 부분을 생성 합니다.

package 예제
(본문)

SQL>
CREATE OR REPLACE PACKAGE BODY emp_info AS

                
-- 모든 사원의  사원 정보
                
PROCEDURE all_emp_info
                IS        

                        CURSOR emp_cursor IS
                        SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
                        FROM emp
                        ORDER BY hiredate;
        
                BEGIN
        
                        FOR  aa  IN emp_cursor LOOP
       
                                DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
                                DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
                                DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);
        
                        END LOOP;
        
                EXCEPTION
                        WHEN OTHERS THEN
                                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
        
                
END all_emp_info;
 

 
                
 -- 모든 사원의  급여 정보
                
PROCEDURE all_sal_info
                IS
                
                        CURSOR emp_cursor IS
                        SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
                        FROM emp;
                
                BEGIN
        
                        FOR  aa  IN emp_cursor LOOP
                
                                DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
                                DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
                                DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);
                        
                        END LOOP;
        
        
                EXCEPTION
                        WHEN OTHERS THEN
                                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
                
END all_sal_info;
 

 
                
--특정 부서의  사원 정보
                
PROCEDURE dept_emp_info (v_deptno IN  NUMBER)
                IS
        
                        CURSOR emp_cursor IS
                        SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
                        FROM emp
                        WHERE deptno = v_deptno
                        ORDER BY hiredate;
        
                BEGIN
        
                        FOR  aa  IN emp_cursor LOOP
       
                                DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
                                DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
                                DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);
        
                        END LOOP;
        
                EXCEPTION
                        WHEN OTHERS THEN
                                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
 
               
 END dept_emp_info;
 
 
                
--특정 부서의  급여 정보
                
PROCEDURE dept_sal_info (v_deptno IN  NUMBER)
                IS
                
                        CURSOR emp_cursor IS
                        SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
                        FROM emp 
                        WHERE deptno = v_deptno;
                
                
                BEGIN

                        FOR  aa  IN emp_cursor LOOP 
                
                                DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
                                DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
                                DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);
                        
                        END LOOP;
        
        
                EXCEPTION
                        WHEN OTHERS THEN
                                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

                
END dept_sal_info;        
                
        
END emp_info;
         /
 
 Package body created.

 



패키지의 실행

패키지의 실행은 패키지 명 다음에 .을 찍고 프로시저냐 함수 명을 써 줍니다.


먼저 set serveroutput on을 실행한후..
SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)


다음 명령들을 실행해 보세요..
SQL> exec emp_info.all_emp_info;

SQL> exec emp_info.all_sal_info;

SQL> exec emp_info.dept_emp_info(10);

SQL> exec emp_info.dept_sal_info(10); 


Trigger(트리거)

트리거란?

INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때
묵시적으로 수행되는 PROCEDURE 입니다.

Trigger는 TABLE과는 별도로 DATABASE에 저장됩니다.
Trigger는 VIEW에 대해서가 아니라 TABLE에 관해서만 정의될 수 있습니다.





- BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행됩니다.
- AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행됩니다.
- trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있습니다.
- FOR EACH ROW : 이 옵션이 있으면 행 트리거가 됩니다.

-- 행 트리거 : 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행되며,
그 데이터 행의 실제값을 제어할수 있습니다.
-- 문장 트리거 : 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어할수 없습니다.

간단한 행 트리거 예제

SQL>CREATE OR REPLACE TRIGGER triger_test
BEFORE
UPDATE ON dept
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값 : ' || : old.dname);
DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값 : ' || : new.dname);
END;
/


SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

-- UPDATE문을 실행시키면..
SQL>UPDATE dept
SET dname = '총무부'
WHERE deptno = 30

-- 트리거가 자동 실행되어 결과가 출력됩니당.
변경 전 컬럼 값 : 인사과
변경 후 컬럼 값 : 총무부

1 행이 갱신되었습니다.

간단한 행 트리거 예제2 (PLSQL BLOCK이 있는 트리거)

SQL>CREATE OR REPLACE trigger sum_trigger
BEFORE
INSERT OR UPDATE ON emp
FOR EACH ROW

DECLARE

-- 변수를 선언할 때는 DECLARE문을 사용해야 합니다
avg_sal NUMBER;

BEGIN

SELECT ROUND(AVG(sal),3)
INTO avg_sal
FROM emp;

DBMS_OUTPUT.PUT_LINE('급여 평균 : ' || avg_sal);

END;
/

트리거가 생성되었습니다.

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

-- INSERT문을 실행합니다..

SQL> INSERT INTO EMP(EMPNO, ENAME, JOB, HIREDATE, SAL)
VALUES(1000, 'LION', 'SALES', SYSDATE, 5000);

-- INSERT문을 실행되기 전까지의 급여 평균이 출력됩니다.
급여 평균 : 2073.214

1 개의 행이 만들어졌습니다.

출처 : http://www.oracleclub.com/

 

추천학원

오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가 데이터베이스관리자 9i 10g 오라클공인교육센터 오라클인증 sql 오라클 ocp 오라클학원 ocp학원 오라클자격증 ocp자격증 oracle oracle자격증 oracle학원 db db관리자 db전문가 데이터베이스전문가

Posted by genesmer
,