달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
  CREATE TABLE "TEAM3"."ACCOUNT" 
   (    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "BANK" VARCHAR2(20 BYTE), 
    "ACCOUNT_NUM" VARCHAR2(40 BYTE), 
     CONSTRAINT "IDX_ACCOUNT_PK" PRIMARY KEY ("PROJECT_NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS NOCOMPRESS LOGGING
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_ACCOUNT_FK0" FOREIGN KEY ("PROJECT_NUM")
      REFERENCES "TEAM3"."PROJECT" ("PROJECT_NUM") ENABLE
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."ACCOUNT"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."ACCOUNT"."BANK" IS '은행명';
   COMMENT ON COLUMN "TEAM3"."ACCOUNT"."ACCOUNT_NUM" IS '계좌번호';
   COMMENT ON TABLE "TEAM3"."ACCOUNT"  IS '계좌정보';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
  CREATE TABLE "TEAM3"."CATEGORY" 
   (    "CATEGORY_NUM" NUMBER(2,0NOT NULL ENABLE, 
    "NAME" VARCHAR2(20 BYTE), 
    "Depth" NUMBER(2,0), 
    "HIGH_NUM" NUMBER(2,0DEFAULT NOT NULL ENABLE, 
    "Order" NUMBER(2,0), 
    "USE_YN" CHAR(BYTE), 
     CONSTRAINT "IDX_CATEGORY_PK" PRIMARY KEY ("CATEGORY_NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."CATEGORY"."CATEGORY_NUM" IS '카테고리번호';
   COMMENT ON COLUMN "TEAM3"."CATEGORY"."NAME" IS '카테고리명';
   COMMENT ON COLUMN "TEAM3"."CATEGORY"."Depth" IS '차수';
   COMMENT ON COLUMN "TEAM3"."CATEGORY"."HIGH_NUM" IS '상위카테고리번호';
   COMMENT ON COLUMN "TEAM3"."CATEGORY"."Order" IS '순서';
   COMMENT ON COLUMN "TEAM3"."CATEGORY"."USE_YN" IS '사용여부';
   COMMENT ON TABLE "TEAM3"."CATEGORY"  IS '카테고리';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
  CREATE TABLE "TEAM3"."EXAM" 
   (    "NUM" NUMBER(9,0NOT NULL ENABLE, 
    "PROJECT_NUM" NUMBER(9,0), 
    "ID" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "STEP" NUMBER(1,0DEFAULT 1
    "MEMBER_NAME" VARCHAR2(20 BYTE), 
    "REG_DATE" DATE, 
    "FILE_IDX" NUMBER(9,0), 
     CONSTRAINT "IDX_EXAM_PK" PRIMARY KEY ("NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_EXAM_FK0" FOREIGN KEY ("ID")
      REFERENCES "TEAM3"."MEMBER_DETAIL" ("ID") ENABLE, 
     CONSTRAINT "IDX_EXAM_FK1" FOREIGN KEY ("PROJECT_NUM")
      REFERENCES "TEAM3"."PROJECT" ("PROJECT_NUM") DISABLE, 
     CONSTRAINT "IDX_EXAM_FK2" FOREIGN KEY ("STEP")
      REFERENCES "TEAM3"."EXAM_STATE" ("STEP") ENABLE, 
     CONSTRAINT "IDX_EXAM_FK4" FOREIGN KEY ("NUM")
      REFERENCES "TEAM3"."PRE_EXAM" ("NUM") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."EXAM"."NUM" IS '심사번호';
   COMMENT ON COLUMN "TEAM3"."EXAM"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."EXAM"."ID" IS '회원아이디';
   COMMENT ON COLUMN "TEAM3"."EXAM"."STEP" IS '단계';
   COMMENT ON COLUMN "TEAM3"."EXAM"."MEMBER_NAME" IS '회원이름';
   COMMENT ON COLUMN "TEAM3"."EXAM"."REG_DATE" IS '심사등록일';
   COMMENT ON COLUMN "TEAM3"."EXAM"."FILE_IDX" IS '파일번호';
   COMMENT ON TABLE "TEAM3"."EXAM"  IS '심사';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
  CREATE TABLE "TEAM3"."EXAM_ATTACHFILE" 
   (    "NUM" NUMBER(9,0NOT NULL ENABLE, 
    "FILE_IDX" NUMBER(9,0NOT NULL ENABLE, 
    "ORIGINE" VARCHAR2(100 BYTE), 
    "ATTACH" VARCHAR2(100 BYTE), 
    "FILE_SIZE" NUMBER(10,0), 
    "PATH" VARCHAR2(50 BYTE) DEFAULT '/upload'
    "FILE_TYPE" VARCHAR2(30 BYTE) DEFAULT 'image/png'
    "REG_DATE" DATE, 
     CONSTRAINT "IDX_EXAM_ATTACHFILE_PK" PRIMARY KEY ("NUM""FILE_IDX")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."NUM" IS '심사번호';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."FILE_IDX" IS '파일번호';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."ORIGINE" IS '업로드파일명';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."ATTACH" IS '서버파일명';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."FILE_SIZE" IS '파일사이즈';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."PATH" IS '저장경로';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."FILE_TYPE" IS '확장자';
   COMMENT ON COLUMN "TEAM3"."EXAM_ATTACHFILE"."REG_DATE" IS '등록일';
   COMMENT ON TABLE "TEAM3"."EXAM_ATTACHFILE"  IS '심사첨부파일';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
  CREATE TABLE "TEAM3"."EXAM_STATE" 
   (    "STEP" NUMBER(1,0NOT NULL ENABLE, 
    "STATE" VARCHAR2(30 BYTE), 
     CONSTRAINT "IDX_EXAM_STATE_PK" PRIMARY KEY ("STEP")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."EXAM_STATE"."STEP" IS '단계';
   COMMENT ON COLUMN "TEAM3"."EXAM_STATE"."STATE" IS '상태';
   COMMENT ON TABLE "TEAM3"."EXAM_STATE"  IS '심사상태';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
  CREATE TABLE "TEAM3"."INVESTMENT" 
   (    "ID" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "REWARD_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "TOTAL" NUMBER(10,0), 
    "ADDR" VARCHAR2(500 BYTE), 
    "CARD_NUM" VARCHAR2(30 BYTE), 
    "CARD_EXDATE" VARCHAR2(10 BYTE), 
    "CARD_PWD" VARCHAR2(BYTE), 
    "CARD_BIRTH" NUMBER(6,0), 
     CONSTRAINT "IDX_INVESTMENT_PK" PRIMARY KEY ("ID""PROJECT_NUM""REWARD_NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_INVESTMENT_FK0" FOREIGN KEY ("ID")
      REFERENCES "TEAM3"."MEMBER_DETAIL" ("ID") ENABLE, 
     CONSTRAINT "IDX_INVESTMENT_FK1" FOREIGN KEY ("PROJECT_NUM""REWARD_NUM")
      REFERENCES "TEAM3"."REWARD" ("PROJECT_NUM""REWARD_NUM") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."ID" IS '회원아이디';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."REWARD_NUM" IS '리워드번호';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."TOTAL" IS '총금액';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."ADDR" IS '배송지';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."CARD_NUM" IS '카드번호';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."CARD_EXDATE" IS '카드유효기간';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."CARD_PWD" IS '비밀번호';
   COMMENT ON COLUMN "TEAM3"."INVESTMENT"."CARD_BIRTH" IS '생년월일';
   COMMENT ON TABLE "TEAM3"."INVESTMENT"  IS '투자';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
  CREATE TABLE "TEAM3"."MEMBER_ATTACHFILE" 
   (    "ID" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "FILE_IDX" NUMBER(9,0NOT NULL ENABLE, 
    "ORIGINE" VARCHAR2(100 BYTE), 
    "ATTACH" VARCHAR2(100 BYTE), 
    "FILE_SIZE" NUMBER(10,0), 
    "PATH" VARCHAR2(50 BYTE) DEFAULT '/upload'
    "FILE_TYPE" VARCHAR2(30 BYTE) DEFAULT 'image/png'
    "REG_DATE" DATE, 
     CONSTRAINT "IDX_MEMBER_ATTACHFILE_PK" PRIMARY KEY ("ID""FILE_IDX")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."ID" IS '회원아이디';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."FILE_IDX" IS '파일번호';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."ORIGINE" IS '업로드파일명';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."ATTACH" IS '서버파일명';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."FILE_SIZE" IS '파일사이즈';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."PATH" IS '저장경로';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."FILE_TYPE" IS '확장자';
   COMMENT ON COLUMN "TEAM3"."MEMBER_ATTACHFILE"."REG_DATE" IS '등록일';
   COMMENT ON TABLE "TEAM3"."MEMBER_ATTACHFILE"  IS '회원첨부파일';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
  CREATE TABLE "TEAM3"."MEMBER_CLASS" 
   (    "CODE" NUMBER(2,0NOT NULL ENABLE, 
    "NAME" VARCHAR2(10 BYTE), 
     CONSTRAINT "IDX_MEMBER_CLASS_PK" PRIMARY KEY ("CODE")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."MEMBER_CLASS"."CODE" IS '회원구분코드';
   COMMENT ON COLUMN "TEAM3"."MEMBER_CLASS"."NAME" IS '회원구분명';
   COMMENT ON TABLE "TEAM3"."MEMBER_CLASS"  IS '회원분류';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
  CREATE TABLE "TEAM3"."MEMBER_DETAIL" 
   (    "ID" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "CODE" NUMBER(2,0DEFAULT 10 NOT NULL ENABLE, 
    "MEMBER_NAME" VARCHAR2(20 BYTE) NOT NULL ENABLE, 
    "COMPANY_NAME" VARCHAR2(40 BYTE), 
    "PWD" VARCHAR2(30 BYTE), 
    "BIRTH" DATE, 
    "TEL" VARCHAR2(20 BYTE), 
    "EMAIL" VARCHAR2(30 BYTE), 
    "ADDR" VARCHAR2(50 BYTE), 
     CONSTRAINT "IDX_MEMBER_DETAIL_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_MEMBER_DETAIL_FK0" FOREIGN KEY ("CODE")
      REFERENCES "TEAM3"."MEMBER_CLASS" ("CODE") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."ID" IS '아이디';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."CODE" IS '회원구분코드';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."MEMBER_NAME" IS '이름';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."COMPANY_NAME" IS '회사명';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."PWD" IS '비밀번호';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."BIRTH" IS '생년월일';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."TEL" IS '핸드폰번호';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."EMAIL" IS '이메일';
   COMMENT ON COLUMN "TEAM3"."MEMBER_DETAIL"."ADDR" IS '주소';
   COMMENT ON TABLE "TEAM3"."MEMBER_DETAIL"  IS '회원상세';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
  CREATE TABLE "TEAM3"."PRE_EXAM" 
   (    "NUM" NUMBER(5,0NOT NULL ENABLE, 
    "ID" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "EX1" NUMBER(1,0), 
    "EX2" NUMBER(1,0), 
    "EX3" NUMBER(1,0), 
    "EX4" NUMBER(1,0), 
    "EX5" VARCHAR2(20 BYTE), 
    "EX6" VARCHAR2(500 BYTE), 
    "EX7" VARCHAR2(20 BYTE), 
    "EX8" VARCHAR2(20 BYTE), 
    "EX9" VARCHAR2(20 BYTE), 
    "EX10" VARCHAR2(30 BYTE), 
    "EX11" VARCHAR2(50 BYTE), 
    "EX12" VARCHAR2(50 BYTE), 
    "EX13" VARCHAR2(100 BYTE), 
    "EX14" VARCHAR2(100 BYTE), 
    "EX15" VARCHAR2(100 BYTE), 
     CONSTRAINT "IDX_PRE_EXAM_PK" PRIMARY KEY ("NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."NUM" IS '심사번호';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."ID" IS '아이디';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX1" IS '1번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX2" IS '2번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX3" IS '3번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX4" IS '4번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX5" IS '5번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX6" IS '6번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX7" IS '7번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX8" IS '8번'
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX9" IS '9번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX10" IS '10번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX11" IS '11번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX12" IS '12번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX13" IS '13번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX14" IS '14번';
   COMMENT ON COLUMN "TEAM3"."PRE_EXAM"."EX15" IS '15번';
   COMMENT ON TABLE "TEAM3"."PRE_EXAM"  IS '예비심사';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
  CREATE TABLE "TEAM3"."PROJECT" 
   (    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "ID" VARCHAR2(30 BYTE), 
    "CATEGORY_NUM" NUMBER(2,0), 
    "TITLE" VARCHAR2(30 BYTE), 
    "REG_DATE" DATE DEFAULT SYSDATE, 
    "NAME" VARCHAR2(30 BYTE), 
    "INTRODUCTION" VARCHAR2(2048 BYTE), 
    "START_DATE" DATE, 
    "END_DATE" DATE, 
    "TARGET" NUMBER(10,0), 
    "COLLECTION" NUMBER(10,0), 
    "INVESTOR" NUMBER(10,0), 
    "USE_YN" CHAR(BYTE), 
    "FILE_IDX" NUMBER(9,0), 
     CONSTRAINT "IDX_PROJECT_PK" PRIMARY KEY ("PROJECT_NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_PROJECT_FK0" FOREIGN KEY ("CATEGORY_NUM")
      REFERENCES "TEAM3"."CATEGORY" ("CATEGORY_NUM") ENABLE, 
     CONSTRAINT "IDX_PROJECT_FK1" FOREIGN KEY ("ID")
      REFERENCES "TEAM3"."MEMBER_DETAIL" ("ID") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."PROJECT"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."ID" IS '회원아이디';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."CATEGORY_NUM" IS '카테고리번호';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."TITLE" IS '제목';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."REG_DATE" IS '프로젝트등록일';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."NAME" IS '프로젝트이름';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."INTRODUCTION" IS '소개';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."START_DATE" IS '시작일';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."END_DATE" IS '마감일';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."TARGET" IS '목표금액';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."COLLECTION" IS '현재모금액';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."INVESTOR" IS '투자인원';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."USE_YN" IS '사용여부';
   COMMENT ON COLUMN "TEAM3"."PROJECT"."FILE_IDX" IS '파일번호';
   COMMENT ON TABLE "TEAM3"."PROJECT"  IS '프로젝트';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
  CREATE TABLE "TEAM3"."PROJECT_ATTACHFILE" 
   (    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "FILE_IDX" NUMBER(9,0NOT NULL ENABLE, 
    "ORIGINE" VARCHAR2(100 BYTE), 
    "ATTACH" VARCHAR2(100 BYTE), 
    "FILE_SIZE" NUMBER(10,0), 
    "PATH" VARCHAR2(50 BYTE) DEFAULT '/upload'
    "FILE_TYPE" VARCHAR2(30 BYTE) DEFAULT 'image/png'
    "REG_DATE" DATE, 
     CONSTRAINT "IDX_PROJECT_ATTACHFILE_PK" PRIMARY KEY ("PROJECT_NUM""FILE_IDX")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."FILE_IDX" IS '파일번호';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."ORIGINE" IS '업로드파일명';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."ATTACH" IS '서버파일명';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."FILE_SIZE" IS '파일사이즈';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."PATH" IS '저장경로';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."FILE_TYPE" IS '확장자';
   COMMENT ON COLUMN "TEAM3"."PROJECT_ATTACHFILE"."REG_DATE" IS '등록일';
   COMMENT ON TABLE "TEAM3"."PROJECT_ATTACHFILE"  IS '프로젝트첨부파일';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
  CREATE TABLE "TEAM3"."REPLY" 
   (    "RNO" NUMBER(9,0NOT NULL ENABLE, 
    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "REPLYER_ID" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "REPLYER_NAME" VARCHAR2(20 BYTE) NOT NULL ENABLE, 
    "REPLYTEXT" VARCHAR2(1000 BYTE) NOT NULL ENABLE, 
    "REG_DATE" DATE DEFAULT SYSDATE NOT NULL ENABLE, 
    "UPDATE_DATE" DATE DEFAULT SYSDATE NOT NULL ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."REPLY"."RNO" IS '댓글번호';
   COMMENT ON COLUMN "TEAM3"."REPLY"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."REPLY"."REPLYER_ID" IS '댓글작성자(ID)';
   COMMENT ON COLUMN "TEAM3"."REPLY"."REPLYER_NAME" IS '댓글작성자(이름)';
   COMMENT ON COLUMN "TEAM3"."REPLY"."REPLYTEXT" IS '댓글내용';
   COMMENT ON COLUMN "TEAM3"."REPLY"."REG_DATE" IS '댓글작성일자';
   COMMENT ON COLUMN "TEAM3"."REPLY"."UPDATE_DATE" IS '댓글수정일자';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
  CREATE TABLE "TEAM3"."REWARD" 
   (    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "REWARD_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "NAME" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "PRICE" NUMBER(10,0), 
    "ITEM" VARCHAR2(100 BYTE), 
    "MIN" NUMBER(10,0), 
    "COUNT" NUMBER(10,0), 
     CONSTRAINT "IDX_REWARD_PK" PRIMARY KEY ("PROJECT_NUM""REWARD_NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_REWARD_FK0" FOREIGN KEY ("PROJECT_NUM")
      REFERENCES "TEAM3"."PROJECT" ("PROJECT_NUM") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS MAXEXTENTS 2147483645
  PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."REWARD"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."REWARD"."REWARD_NUM" IS '리워드번호';
   COMMENT ON COLUMN "TEAM3"."REWARD"."NAME" IS '리워드이름';
   COMMENT ON COLUMN "TEAM3"."REWARD"."PRICE" IS '리워드금액';
   COMMENT ON COLUMN "TEAM3"."REWARD"."ITEM" IS '아이템';
   COMMENT ON COLUMN "TEAM3"."REWARD"."MIN" IS '최소금액';
   COMMENT ON COLUMN "TEAM3"."REWARD"."COUNT" IS '갯수';
   COMMENT ON TABLE "TEAM3"."REWARD"  IS '리워드';
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
  CREATE TABLE "TEAM3"."STORY" 
   (    "PROJECT_NUM" NUMBER(9,0NOT NULL ENABLE, 
    "CONTENT" VARCHAR2(4000 BYTE), 
     CONSTRAINT "IDX_STORY_PK" PRIMARY KEY ("PROJECT_NUM")
  USING INDEX PCTFREE 10 INITRANS MAXTRANS 255 COMPUTE STATISTICS NOCOMPRESS LOGGING
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "IDX_STORY_FK0" FOREIGN KEY ("PROJECT_NUM")
      REFERENCES "TEAM3"."PROJECT" ("PROJECT_NUM") ENABLE
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS" ;
 
   COMMENT ON COLUMN "TEAM3"."STORY"."PROJECT_NUM" IS '프로젝트번호';
   COMMENT ON COLUMN "TEAM3"."STORY"."CONTENT" IS '내용';
   COMMENT ON TABLE "TEAM3"."STORY"  IS '스토리';
 
cs


'Legend 개발자 > Oracle' 카테고리의 다른 글

오라클 시험  (0) 2017.06.23
No.019 PL/SQL 커서 [2017-06-14]  (0) 2017.06.19
No.018 PL/SQL 조건문 [2017-06-14]  (0) 2017.06.19
No.017 PL/SQL 쿼리 [2017-06-14]  (0) 2017.06.19
No.016 PL/SQL 변수 [2017-06-14]  (0) 2017.06.16
Posted by 전설의아이
|

과목 1

1.  데이터 베이스 선정할 때 고려할 사항이 아닌 것

답 : 비용/안정성/범용성/용량/성능(속도)

계층형 데이터베이스 : 계층형 데이터 베이스는 데이터의 관계를 트리 구조로 정의하고, 부모, 자식 형태를 갖는 구조이다. 풀어서 말하면 상위에 레코드가 복수의 하위 레코드를 갖는 구조이다. 하지만 데이터의 중복이 문제가 생긴다.

네트워크형 데이터베이스 : 네트워크형 데이터베이스는 계층형 데이터의 데이터 중복 문제를 해했고, 레코드간의 다양한 관계를 그물처럼 갖는 구조이다. 하지만 복잡한 구조 때문에 추후에 구조를 변경한다면 많은 어려움이 따른다.

관계형 데이터 베이스 : 관계형 데이터베이스는 우리가 흔히 표현하는 행(Column), 열(Record)로 구성된Table간의 관계를 나타낼때 사용한다. 우리는 이렇게 표현된 데이터를  SQL(Structured Query Language)을 사용하여 데이터 관리 및 접근을 한다.

NoSQL 데이터베이스 : NoSQL 데이터베이스는 관계형 데이터베이스보다 덜 제한적인 일관성 모델을 이용한다. 키(key)와 값(value)형태로 저장되고, 키를 사용해 데이터 관리 및 접근을 한다.


 

2.  데이터 베이스 생성할 때 사용하는 명령어

답 : CREATE

- DDL(CREATE)

- CREATE DATABASE [DB명];


3.  데이터 베이스 정의(어)와 관련 없는 것

답 : (DDL, DML, DCL) (CREATE, ALTER, DROP, TRUNCATE)

DDL;Data Definition Language : 스키마를 정의하거나 조작하기 위해 사용

- CREATE : 정의

- ALTER : 수정

- DROP : 삭제

- TRUNCATE : DROP 후 CREATE

DML;Data Manipulation Language : 데이터를 조작하기 위해 사용

- SELECT : 조회

- INSERT : 추가

- DELETE : 삭제

- UPDATE : 변경

DCL;Data Control Language : 데이터를 제어하기 위해 사용

- COMMIT : 트랜잭션 작업 결과를 반영

- ROLLBACK : 트랜잭션의 작업 취소 및 원상복구

- GRANT : 사용자에게 권한 부여

- REVOKE : 사용자 권한 취소

 

4.  데이터 베이스 용량 산정할 때 고려할 사항이 아닌 것

답: 데이터 건수 및 용량 산정(조사), 헤더 사이즈 평균 길이, 30% 여유공간,

3. 테이블 설계

3.1 데이터 건수 및 용량 산정

 1) 데이터 건수와 길이 산정

 - 테이블 크기를 산정하기 위한 양식을 업무 담당자에게 배포하여 데이터 건수와 산정근거를 조사한다.

업무명 

테이블명 

초기건수 

월발생건수 

보관기간 

 

 

 

 

 

 - 데이터 없이 빈 테이블을 구성하여 SQL문을 통하여 정확한 테이블별 row의 길이를 구할 수 있다.

2) 테이블 총크기 산정

 - 조사된 데이터 건수와 길이를 바탕으로, 계산 공식이 반영된 Excel 양식을 이용하여 자동으로 산정한다.

 - Row 길이에 헤더 사이즈를 감안하여 평균 길이를 구한다.

 - 30% 정도의 여유공간을 감안하여 테이블의 총크기를 구한다.

테이블명 

최종길이 

초기건수 

월발생건수 

보관기간 

총데이터건수 

총크기 

 

 

 

 

 

 

 

 

한 개의 BLOCK에 Available 한 Bytes - 1958

각 initrans 는 23 Bytes

PCT_FREE : Table 의 pctfree 값(default 10)

ADJ_ROW_SIZE : 각 row 의 평균 SIZE 추정치

ROW_COUNT : table 의 row 의 갯수

BLOCK_SIZE : 1 block의 크기 (단위: K)

 

5.  테이블을 생성하거나 삭제하는 명령어는 무엇인가?

답 : (DDL, DML, DCL) (CREATE, ALTER, DROP, TRUNCATE)

CREATE TABLE 문장을 실행하여 테이블을 생성 합니다.


No.032 테이블 삭제

DROP TABLE 문장은 Oracle8 테이블의 정의를 삭제 합니다. 테이블을 삭제할 때 데이터베이스는 테이블에 있

는 모든 자료와 그와 연관된 모든 INDEX를 DROP 하고 사용하고 있던 공간을 돌려줍니다.

- 테이블의 모든 구조와 데이터가 삭제 됩니다.

- DDL 문장이기 떄문에 TRANSACTION 이 COMMIT 됩니다.

- 모든 인덱스가 삭제 됩니다.

- VIEW나 SYNONYM은 남지만 사용시 ERROR가 발생합니다.

- 테이블의 OWNER 나 DROP ANY TABLE 권한을 가진 사용자만이 테이블을 삭제할 수 있습니다.

- Syntax

 DROP TABLE table_name [CASCADE CONSTRAINT] 

- 일단 실행된 DROP TABLE 문장은 복구(ROLLBACK)할 수 없습니다. ORACLE SERVER 은 DROP TABLE 문장을

실행할 때 삭제 여부를 질문하지 않습니다.


No.012 DELETE 문장

- DELETE 문장을 사용하여 테이블로부터 기존의 자료를 삭제할 수 있다.

- WHERE 절을 명시하여 특정 행이나 행들을 삭제할 수 있다.

- WHERE 절을 생략하면 테이블의 모든 행이 삭제 된다.

- Syntax

 DELETE [FROM] table_name

 [WHERE condition];


No.030 TRUNCATE TABLE 문장

- 테이블의 OWNER 이거나 DELETE TABLE 권한을가진 사용자가 테이블의 모든 행을 삭제(구조는 삭제되지 않

는다)하고 사용하고 있던 기억 공간을 모두 해체할 경우에 사용합니다.

- 삭제된 행은 복구(ROLLBACK)할 수 없습니다.

- Syntax

  TRUNCATE TABLE table_name;

- DELETE 문장은 테이블의 모든 행을 삭제할 수 있지만, 저장 공간을 해제할 수 없습니다.



6.  사용권한을 줄 때 사용하는 명령어?

답: GRANT

GRANT


7.  테이블 수정할 때 사용하는 쿼리문

답: ALTER - ADD(열 추가), MODIFY(수정), RENAME(이름 수정), UPDATE(행 수정) 

No.020 테이블을 수정

- 테이블을 생성한 이후에 열을 생략 되었거나, 열 정의를 변경할 필요가있을 수 있다.

- 테이블의 구조를 변경할 경우 ALTER TABLE 명을 사용하여 변경 한다.


No.021 새로운 열 추가

- 새로운 열을 추가 할 수는 있지만 테이블에 있는 기존의 열은 DROP 할 수 없다.

- 열이 위치를 기술할 수 없으며 항상 테이블에서 마지막에 위치 합니다.

- 열을 추가할 때 테이블이 행을 포함하고 있다면 새로운 열은 이미 존재하는 열을 NULL로 초기화 한다.

- Syntax

 ALTER TABLE table_name

 ADD (column datatype [DEFAULT expr ]

 [,column datatype [DEFAULT expr ], , , , , , , , ] 


No.022 열 수정

- ALTER TABLE의 MODIFY 절을 사용하여 열의 정의를 수정할 수 있습니다.

- 열의 수정은 열의 자료형, 크기, DEFAULT VALUE입니다.

- Syntax

 ALTER TABLE table_name

 MODIFY (column datatype [DEFAULT expr ]

 [,column datatype [DEFAULT expr ], , , , , , , , ] 

- 숫자열의 정밀도나 폭을 증가할 수 있다.

- 열이 모두 NULL이거나 테이블에 자료가 없으면 열의 폭을 감소시킬 수 있다.

- 열이 NULL 을 포함하면 열의 자료형을변경할 수 있다.

- 열이 NULL을 포함하거나 크기를 변경하지 않으면 CHAR을 VARCHAR2로 변경하거나 그 반대의 겨우도 가능하다.

- 열의 DEFAULT VALUE를 변경하는 것은 이후의 INSERT 문장에만 영향을 미칩니다.



8.  테이블 구조 확인

답: DESC table_name;

DESC table_name;


9.  다음중 NULL 값에 대한 설명으로 부적절한 것

답: NULL IS 값, 산술X, PK NOT NULL, NULL타입 

No.010 Null 값의 처리

행이 특정 열에 대한 데이터 값이 없다면, 값은 null이 됩니다. null 값은 이용할 수 없거나 지정되지 않았거나, 알 수 없거나 또는 적용할 수 없는 값입니다. null 값은 0 이나 공백과는 다릅니다. 0은 숫자이며 공백은 문자입니다. 열이 NOT NILL 로 정의되지 않았거나, 열이 생성될 때 PRIMARY KEY로 정의되지 않았다면, 어떤 데이터형의 열은 null 값을 포함할 수 있습니다.


No.011 Null에 대하여

- NULL은 이용할 수 없고 할당되지 않고 알려져 있지않고 적용 불가한 값을 의미한다.

- NULL이란 0이나 공백(space)과 다르다.

- NULL 값을 포함한 산술 표현식 결과는 NULL이 된다.

- column에 데이터 값이 없으면 그 값 자체가 널 또는 널 값을 포함하고 있다.

- NULL 값은 1 바이트의 내부 저장


No.012 NVL 함수

- Null값을 어떤 특정한 값(실제 값)으로 변환하는데 사용한다.

- 사용될 수 있는 데이터 타입은 날짜, 문자, 숫자입니다.

- NVL 함수를 사용할 때 전환되는 값의 데이터 타입을 일치 시켜야 한다.



10. 외래키에 대한 설명 중 옳은 것

답: 아래읽어야함

No.012 FOREIGN KEY(FK)

- FOREIGN KEY는 DETAIL 쪽에서 정의한다.

- MASTER TABLE 의 PRIMARY KEY, UNIQUE KEY로 정의된 열을 지정할 수 있으며 열의 값과 일치하거나

NULL 값이어야 한다.

- FOREIGN KEY는 열 또는 열의 집합을 지정할 수 있으며 동일 테이블 또는 다른 테이블간의 관계를 지정할

수 있다.

- ON, DELETE, CASCADE 을 사용하여 DETAIL TABLE 에서 관련된 행을 삭제하고 MASTER TABLE에서 삭제를

허용할 수 있다.

- Syntax

 column datatype [CONSTRAINT constraint_name]

 REFERENCES table_name (column1[,column2, , , ] [ON DELETE CASCADE])

 column datatype,

 , , , , , , , , , , ,

 [CONSTRAINT constraint_name] FOREIGN KEY (column1[,column2, , ,])

 REFERENCES table_name (column1[,column, , , ] [ON DELETE CASCADE]) 


No.013 PRIMARY KEY(PK) 와 FOREIGN KEY(FK)

- FOREIGN KEY 값은 MASTER TABLE 에서 존재하는 값과 일치해야 하거나 NULL 이 되어야 한다.

- FOREIGN KEY 값은 데이터 값을 기초로 하여 순전히 논리적이지 분리적이거나 포인터가 아니다.

- MASTER TABLE(parent)은 참조 당하는 쪽(DEPT TABLE)을 테이블을 의미하고 DETAIL TABLE(child)은 참조하는

쪽(EMP TABLE)의 테이블을 의미한다.

- MASTER TABLE(참조 당하는 쪽)을 먼저 생성하여야 한다.

- MASTER TABLE 에 PRIMARY KEY 또는 UNIQUE KEY로 설정된 열을 DETAIL TABLE 에서 참조하여야 한다.

- MASTER TABLE 과 DETAIL TABLE의 참조하는 열과 참조 당하는 쪽의 자료형과 크기가 일치해야 한다.



 

과목2

1.  오라클 데이터 타입이 아닌것?

답: VARCHAR2, CHAR, NUMBER, DATE, LONG, CLOB, RAW, LONG RAW, BLOB, BFILE

VARCHAR2(n)  : 가변 길이 문자 데이터(1~4000byte)

CHAR(n)         : 고정 길이 문자 데이터(1~2000byte)

NUMBER(p,s)   : 전체 p자리 중 소수점 이하 s자리(p:1~38, s:-84~127)

DATE             : 7byte (BC 4712년 1월 1일부터 AD 9999년 12월 31일)

LONG            : 가변 길이 문자 데이터(1~2Gbyte)

CLOB             : 단일 바이트 가변 길이 문자 데이터(1~4Gbyte)

RAW(n)          : n byte의 원시 이진 데이터(1~2000)

LONG RAW     : 가변 길이 원시 이진 데이터(1~2Gbyte)

BLOB             : 가변 길이 이진 데이터(1~4Gbyte)

BFILE             : 가변 길이 외부 파일에 저장된 이진 데이터(1~4Gbyte)


2.  모든 컬럼열을 검색하는 쿼리문

답: ALL_TAB_COLUMNS;

모든 SYSTEM테이블 정보 : SELECT * FROM ALL_TABLES;

모든 SYSTEM컬럼열 정보 : SELECT * FROM ALL_TAB_COLUMNS;

모든 현재사용자컬럼열 SELECT * FROM COLS;


 

3.  이름이 n문자로 끝나는 것을 검색하는 쿼리문

답: WHERE column LIKE %n

No.008 LIKE 연산자

- 검색 STRING 값에 대한 와일드 카드 검색을 위해서 LIKE 연산자를 사용한다.

- 검색 조건은 LITERAL 문자나 숫자를 포함할 수 있다.

- '%'는 문자가 없거나 하나 이상의 문자를 '_'는 하나의 문자와 대치됩니다.

- 패턴 일치 문자를 조합할 수 있습니다.

- '%' 나 '_'에 대해서 검색하기 위해서는 Escape 식별자를 이용할 수 있습니다.

- WHERE column LIKE ‘%A\_A% ESCAPE’\’;’

(해석 : \문자를 _ 앞에 작성하여 ESCAPE를 활성화하고 _를 문자로 인식하게 만든다.)

- 기본 날짜 형식이 'YY-MM-DD'일 경우는 WHERE hiredate LIKE '82%';로 기술한다.

- SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YY-MM-DD'; 명령어로 연결되어 있는 SQL*Plus 창

(SESSION)에서 날짜 타입을 바꿀 수 있다.


4.  오라클 논리연산자가 아닌것

답: AND, OR, NOT

논리연산자는 AND, OR, NOT이 있다.


5.  ORDER BY 절에서 낮은 순으로 정렬할 때 쓰는 키워드

답: ASC

오름차순 ASC   저→고 낮은 순서대로

내림차순 DESC 고→저 높은 순서대로


6.  데이터 양이 많을 경우 검색 속도를 향상시키기 위한 것

답: INDEX

INDEX

No.002 인덱스의 특징

- 인덱스는 테이블의 값을 빠르게 액세스 하도록 하는 데이터베이스 객체이다.

- 데이터를 빠르게 찾기 위한 B*TREE을 써서 디스크 입출력 횟수를 줄인다.

- Oracle8 Server가 인덱스를 자동적으로 사용하고 유지 보수 한다.

- 인덱스를 만들면 사용자가 직접 조작할 필요가 없게 된다.

- 인덱스는 논리적으로도 물리적으로도 테이블과는 독립적이다.

- 언제든지 생성하거나 삭제할 수 있으며 이는 테이블이나 다른 인덱스에 영향을 주지 않는다는 의미이다.


7.  오라클 함수중 대소문자를 조작하는 함수가 아닌 것

답: LOWER, UPPER, INITCAP

LOWER : 대소문자가 혼합되어 있거나 대문자인 문자열을 소문자로 변환합니다

UPPER : 대문자가 혼합되어 있거나 소문자인 문자열을 대문자로 변환 합니다.

INITCAP : 각 단어의 첫번째 문자를 대문자로 나머지 문자는 소문자로 변경합니다.



8.  게시판 날짜를 저장할 때 사용하는 오라클 키워드

답: TO_DATE

To_DATE

No.004 특정 날짜 값 삽입

- 형식 DD-MON-YY 는 항상 날짜 값을 입력할 때 사용한다. 이 형식은 현재 세기에 대한 DEFAULT 세기를 다시 호출한다. 또한 날짜가 시간 정보를 포함하므로 DEFAULT 시간은 자정(00:00:00)이다. 날짜를 다른 세기로 입력하거나 또는 특정 시간을 요구 한다면 TO_DATE 함수를 사용하여라.


9.  뷰

답: 아래읽어야함

No.001 VIEW의 개념

테이블이나 다른 VIEW을 기초로 한 논리적인 테이블이고 VIEW는 자체의 데이터는 없지만 테이블의 데이터를

보거나 변경할 수 있는 창과 같다. VIEW은 실제적으로는 질의 문장을 가진다.


No.002 VIEW의 장점

- VIEW은 데이터베이스의 선택적인 내용을 보여줄 수 있기 때문에 데이터베이스에 대한 액세스를 제한한다.

- 복잡한 질의어를 통해 얻을 수 있는 결과를 간단한 질의어를 써서 구할 수 있게 한다.

- 데이터 독립성을 허용한다.

- 동일한 데이터의 다른 VIEW를 나타낸다.

- 조인을 한 것처럼 여러 테이블에 대한 데이터를 VIEW을 통해볼 수 있다.

- 한 개의 VIEW로 여러 테이블에 대한 데이터를 검색할 수 있다.

- 특정 평가기준에 따른 사용자 별로 다른 데이터를 액세스 할 수 있다.


No.003 Simple VIEW와 Complex VIEW

Simple VIEW

 Complex VIEW

- 오직 하나의 테이블에서만 데이터가 유래된다

- 데이터 그룹 또는 함수를 포함하지 않는다.

- VIEW를 통해 DML 수행 가능

- 다중 테이블에서 데이터가 유래된다.

- 데이터 그룹 또는 함수를 포함한다.

- VIEW을 통한 DML을 항상 허용하지 않는다.


No.004 VIEW의 생성

- CREATE VIEW 문장 내에서 SUBQUERY을 내장하여 VIEW를 생성한다.

- SUBQUERY은 복합 SELECT 구문을 포함할 수 있고 ORDER BY 절을 포함할 수 없다.

- Syntax

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name [(alias[,alias, , , , ])]

 AS Subquery

 [WITH CHECK OPTION [CONSTRAINT constraint ]]

 [WITH READ ONLY]

OR REPLACE                 이미 존재한다면 다시 생성한다.

FORCE Base Table          유무에 관계없이 VIEW을 만든다.

NOFORCE                    기본 테이블이 존재할 경우에만 VIEW를 생성한다.

view_name                   VIEW의 이름

Alias                           Subquery를 통해 선택된 값에 대한 Column명이 된다.

Subquery                     SELECT문장을 기술한다.

WITH CHECK OPTION     VIEW에 의해 액세스 될 수 있는 행만이 입력, 갱신될 수 있다.

Constraint                    CHECK OPTION 제약 조건에 대해 지정된 이름이다.

WITH READ ONLY          이 VIEW에서 DML이 수행될 수 없게 한다.

- VIEW을 정의하는 질의어는 조인, 그룹, Subquery를 포함하는 복잡한 SELECT 문장으로 구성될 수 있다.

- VIEW을 정의하는 질의어에는 ORDER BY절을 쓸 수 없다.

- 제약 조건의 이름을 명시하지 않으면 시스템이 SYS_Cn 형태의 이름을 지정한다.

- VIEW을 삭제하거나 재생성하지 않고 VIEW의 정의를 변경하려면 OR REPLACE 옵션을 쓸 수 있다.


No.005 VIEW의 구조 및 이름 확인

- 일단 VIEW가 생성되면, VIEW의 이름과 VIEW 정의를 보기 위해 USER_VIEWS 라는 데이터 사전 테이블을 질

의할 수 있습니다.

- VIEW을 만드는 SELECT 문장의 텍스트는 LONG 열에 저장됩니다.


No.006 데이터 액세스 VIEW

- VIEW을 사용하여 데이터를 액세스할 때 ORACLE SERVER은 다음 작업을 수행합니다.

- USER_VIEWS 데이터 사전 테이블에서 VIEW 정의를 검색합니다.

- VIEW 기반 테이블에 대한 액세스 권한을 확인합니다.

- VIEW 질의를 기본 테이블 또는 테이블들에서의 동등한 작업으로 전환합니다.


No.007 VIEW의 수정

- OR REPLACE 옵션은 비록 이 이름이 이미 존재할지라도 VIEW가 생성될 수 있도록 해주므로 그 소유자에 대

한 오래된 VIEW 버전업할 수 있다.

- CREATE VIEW 절에서 열 별칭을 지정할 때 별칭은 SUBQUERY 의 열과 동일한 명령으로 나열됨을 명심하십

시오.


No.008 복합 VIEW 생성

- 두 테이블로부터 값을 출력하는 그룹 함수를 포함하는 복잡한 VIEW를 생성합니다.

- VIEW의 어떤 열이 함수나 표현식에서 유래되었다면 별칭은 필수적입니다.


No.009 VIEW에서 DML 연산 수행

- 단순 VIEW에서 DML 연산을 수행할 수 있습니다.

- VIEW가 다음을 포함 한다면 행을 제거할 수 없습니다.

① 그룹 함수 ② GROUP By절 ③ DISTINCT 키워드

- 다음을 포함한다면 VIEW에서 데이터를 수정할 수 없습니다.

① 그룹 함수 ② GROUP BY 절 ③ DISTINCT 키워드 ④ 표현식으로 정의된 열 ⑤ ROWNUM 의사열

- 다음을 포함한다면 VIEW에서 데이터를 추가할 수 없습니다.

① 그룹 함수 ② GROUP BY절 ③ DISTINCT 키워드 ④ 표현식으로 정의된 열 ⑤ ROWNUM의사열

⑥ VIEW에 의해 선택되지 않은 NOT NULL열이 기본 테이블에 있을 경우


No.010 WITH CHECK OPTION 절 사용

- VIEW을 통해 참조 무결성 체크를 수행하는 것이 가능합니다. 또한 데이터베이스 LEVEL 에서 제약 조건을 적

용할 수 있습니다.

- VIEW은 데이터 무결성을 보호하기 위해 사용될 수 있지만, 사용은 매우 제한됩니다.

- VIEW을 통해 수행되는 INSERT와 UPDATE는 WITH CHECK OPTION 절이 있으면 VIEW을 가지고 검색할 수

없는 행 생성을 허용하지 않음을 명시합니다. 그러므로 삽입되거나 갱신되는 데이터에 대해서 무결성 제약 조

건과 데이터 검증 체크를 허용합니다.

- VIEW가 선택하지 않은 행에 대해 DML 작업을 수행하려고 하면, 지정된 제약 조건 명과 함께 에러가 출력됩

니다.


No.011 DML 연산 부정

- WITH READ ONLY 옵션으로 VIEW을 생성하면 VIEW에서 DML 연산을 수행할 수 없습니다.

- VIEW에서 임의의 행에서 DML 연산을 수행하려고 하면 ORACLE SERVER 에러 ORA-01752가 발생합니다.


No.012 VIEW의 제거

- VIEW는 데이터베이스에서 기본 테이블을 기반으로 하기 때문에 테이터 손실 업이 VIEW를 제거할 수 있다.

- Syntax

DROP VIEW view_name; 



10. 프로시져

답: 프로시져

Procedure

CREATE PROCEDURE name

IS

BEGIN

statements;

statements;

[EXCEPTION]

END:

'Legend 개발자 > Oracle' 카테고리의 다른 글

Team Project SQL  (0) 2017.11.07
No.019 PL/SQL 커서 [2017-06-14]  (0) 2017.06.19
No.018 PL/SQL 조건문 [2017-06-14]  (0) 2017.06.19
No.017 PL/SQL 쿼리 [2017-06-14]  (0) 2017.06.19
No.016 PL/SQL 변수 [2017-06-14]  (0) 2017.06.16
Posted by 전설의아이
|

1. 커서의 개념

 ORACLE SERVER은 SQL 문장을 실행하기 위하여 Private SQL Area 이라 불리는 작업 영역을 사용합니다. Private SQL Area에 이름을 붙이고 저장된 정보를 액세스하기 위해 PL/SQL CURSOR를 사용한다. 블록의 실행 부분이 SQL 문장을 실행할 때 PL/SQL은 SQL 식별자를 가지는 암시적 CURSOR를 생성하고 자동적으로 이 CURSOR를 관리합니다. 명시적 CURSOR는 명시적으로 선언되고 프로그래머에 의해 명명됩니다.

 

1.1 CURSOR의 종류

1.1.1 암시적 CURSOR

 ORACLE SERVER은 명시적으로 선언된 CURSOR 와 관련 없는 각 SQL 문장을 수행하기 위해 CURSOR를 암시적으로 생성하여 사용한다. PL/SQL 은 SQL CURSOR 로써 가장 최근의 암시적 CURSOR를 참조할 수 있도록 해 줍니다. SQL CURSOR 를 제어하기 위해 OPEN, FETCH, CLOSE 를 사용할 수 없지만 가장 최근에 실행된 SQL 문장에 대한 정보를 얻기 위한 CURSOR 속성을 사용할 수 있다. (SQL%ROWCOUNT, SQL%NOTFOUND, SQL%ISOPEN 등)

 

1.1.2 명시적 CURSOR

 다중 행 SELECT 문장에 의해 RETURN 되는 각 행을 개별적으로 처리하기 위해 명시적 CURSOR를 사용합니다. 다중 행 질의에 의해 RETURN 된 행의 집합은 result set 이라 불립니다. 그것의 크기는 검색 조건에 일치하는 행의 수입니다.

 

가) 명시적 CURSOR의 함수

 1) 질의에 의해 RETURN된 첫번째 행부터 행 하나씩 처리할 수 있다.

 2) 현재 처리되는 행의 특랙을 유지 합니다.

 3) 프로그래머가 PL/SQL 블록에서 수동으로 제어할 수 있습니다.

 

참고

 암시적 CURSOR에 대한 인출(FETCH)은 배열 인출(FETCH)이며, 두번째 행의 존재는 여전히 TOO_MANY_ROWS 예외가 발생합니다. 그러므로 다중 인출을 수행하고 작업 영역에서 구문 분석된 질의를 재실행하기 위해 명시적 CURSOR를 사용할 수 있습니다.

 

1.2 명시적 CURSOR의 제어

 명시적 CURSOR를 사용하기 위해서는 4가지 단계를 거처야 한다.

 1) 수행되기 위한 질의의 구조를 정의하고 이름을 지정함으로써 CURSOR를 선언한다.

 2) CURSOR를 OPEN한다. OPEN 문장은 질의를 실행하고 참조되는 임의의 변수를 바인드 합니다. 질의에 의해 식별된 행을 active set이라 불리고 인출(FETCH) 가능합니다.

 3) CURSOR에서 데이터를 인출(FETCH)합니다. FETCH 문장은 CURSOR에서 변수로 현재 행을 로드합니다. 각 인출(FETCH)은 활성 셋(active set)에서 다음 행으로 그 포인터를 이동하도록 합니다.

 4) CURSOR를 CLOSE 합니다. CLOSE 문장은 행의 활성 셋(active set)을 해제 합니다. 이제 새로운 활성 셋(active set)을 생성하기 위해 CURSOR를 다시 OPEN할 수 있습니다.

 

1.3 DECLARE CURSOR

 명시적으로 CURSOR를 선언하기 위해 CURSOR 문장을 사용한다. 질의 내에서 변수를 참조할 수 있지만 CURSOR 문장 전에 선언되어야 한다.

 

1.3.1 Syntax

 cursor_name        PL/SQL 식별자

 select_statement   INTO절이 없는 SELECT 문장

 

1.4 OPEN CURSOR

 질의를 수행하고 검색 조건을 충족하는 모든 행으로 구성된 결과 셋을 생성하기 위해 CURSOR를 OPEN한다. CURSOR는 이제 결과 셋에서 첫번째 행을 가리킴니다.

 

1.4.1 Syntax

 

나) OPEN 문장은 다음의 작업을 수행한다.

 1) 문맥 영역에 대해 동적으로 메모리를 할당하여 중요한 프로세싱 정보를 포함 합니다.

 2) SELECT 문장을 구문 분석합니다.

 3) 입력 변수를 바인드 합니다.

 4) 결과 셋을 식별합니다. 즉 검색 조건을 충족시키는 행의 집합입니다. OPEN 문장이 실행될 때 결과 셋에 있는 행을 변수로 읽어 들이지 않습니다. 그대신 FETCH 문장이 행을 읽습니다.

 5) 포인터는 활성 셋에서 첫번째 행에 위치합니다.

 

1.5 FETCH CURSOR

 FETCH 문장은 결과 셋에서 하나의 행을 읽어 들입니다. 각 인출(FETCH) 후에 CURSOR 는 결과 셋에서 다음 행으로 이동한다.

 

1.5.1 Syntax

 

Guidelines

 1) SELECT 문장의 열과 같은 개수의 변수를 FETCH 문장의 INTO 절에 포함시켜 좌측부터 1대 1대응 되도록 데이터 형과 길이가 같아야 합니다.

 2) CURSOR에 대한 레코드를 정의하고 FETCH INTO 절에서 레코드를 참조할 수 있습니다.

 3) CURSOR가 RETURN 할 행을 포함하는지 테스트합니다. FETCH 시 아무 값도 읽지 않아도 즉 활성 셋에서 프로세스할 남겨진 행이 없는 경우에도 오류가 발생되지 않습니다.

 4) FETCH 문장은 다음 작업을 수행합니다.

  ①활성 셋에서 다음 행으로 포인터를 이동합니다.

  ②현재 행에 대한 정보를 출력 PL/SQL 변수로 읽어 들입니다.

  ③포인터가 활성 셋의 끝에 위치하게 되면 CURSOR 는 FOR LOOP를 탈출 합니다.

 

1.6 CLOSE CURSOR

 CLOSE 문장은 CURSOR를 사용할 수 없게 하고 결과 셋의 정의를 해제합니다. SELECT 문장이 다 처리된 완성 후에는 CURSOR를 닫습니다. 필요하다면 CURSOR를 다시 열수도 있습니다. 그러므로 활성 셋을 여러 번 설정할 수 있다.

 

1.6.1 Syntax

 

Guidelines

 CLOSE문장은 context area를 해제 합니다. 커서를 닫지 않고 PL/SQL 블록을 종료하는 것이 가능하다 할 지라도 리소스를 다시 가능하게 하기 위해 명시적으로 선언된 임의의 커서를 닫는 습관을 들여야 합니다. 데이터베이스 매개변수(initial parameter file)에서 OPEN_CURSORS 매개변수에 의해 결정되는 사용자마다 해당하는 커서의 수에는 최대 한계가 있습니다. 디폴트로 OPEN_CURSORS=50 입니다.

 

1.7 명시적 CURSOR의 속성

 명시적 CURSOR로 CURSOR에 대해 상태 정보를 얻기 위한 4가지 속성이 있습니다.

속성

타입 

설명 

%ISOPEN 

BOOLEAN 

CURSOR가 열리면 TRUE 

%NOTFOUND 

BOOLEAN 

가장 최근의 인출(FETCH)이 행을 RETURN하지 않으면 TRUE 

%FOUND 

BOOLEAN 

가장 최근의 인출(FETCH)이 행을 RETURN하면 TRUE

%ROWCOUNT

NUMBER

지금까지 RETURN된 행의 총 수

 

1.8 복수 인출(FETCH) 제어

 명시적 CURSOR에서 여러 행을 처리하기 위해서 반복적으로 인출(FETCH)을 수행하는 루프를 정의합니다. 결과적으로 활성 셋의 모든 행은 처리되고 인출(FETCH)이 실패하면 %NOTFOUND 속성을 TRUE로 설정한다. CURSOR에 대해 참조하기 전에 각 이눌(FETCH)의 성공을 테스트 하기 위해 명시적 CURSOR를 사용합니다.

 

문제 1) 부서번호를 입력받아 사원번호, 이름, 급여를 출력하는 SCRIPT를 작성하여라.

 

1.9 CURSOR 와 RECORD

 테이블에서 열의 구조를 사용하기 위해 RECORD를 정의할 수 있다. 또한 명시적 CURSOR에서의 열 목록을 기초로 하여 RECORD를 정의할 수 있습니다. 이것은 단순히 인출할 수 있기 때문에 활성 셋의 행을 처리하기가 편리하다. 그러므로 행 값은 RECORD의 해당 필드 안으로 직접 LOAD 된다.

 

문제2)DEPT 테이블의 내용을 조회하는 SCRIPT을 작성하여라. 단 %ROWTYPE을 사용하여라.

 

문제 3) DEPT 테이블의 내용을 조회하는 SCRIPT을 작성하여라. 단 RECORD TYPE을 선언하여 사용하여라.

 

1.10 CURSOR와 FOR LOOP

 CURSOR FOR LOOP는 명시적 CURSOR 에서 행을 처리합니다. LOOP에서 각 반복마다 CURSOR를 열고 행을 인출(FETCH)하고 모든 행이 처리되면 자동으로 CURSOR가 CLOSE 되므로 사용하기가 편리합니다.

 

1.10.1 Syntax

  record_name   암시적으로 선언된 RECORD 이름

  cursor_name   선언되어 있는 CURSOR의 이름

 

Guidelines

 1) LOOP를 제어하는 RECORD를 선언하지 마십시오.

 2) 필요하다면 LOOP내에서 CURSOR의 속성을 이용하십시오.

 3) 필요하다면 FOR문 안에서 CURSOR 이름 다음에 괄호로 CURSOR 에 대한 매개변수를 묶어 사용하십시오.

 4) CURSOR 작업이 수동으로 처리되어야 할 때는 FOR LOOP를 사용하지 마십시오.

 5) LOOP가 시작될 때 질의를 정의할 수 있습니다. 질의 표현식은 SELECT 부속문장이라 불리고 CURSOR는 FOR LOOP 내에서만 사용할 수 있습니다. 이름을 가지고 CURSOR가 선언되지 않기 때문에 그속성을 사용할 수는 없습니다.

 

문제 4) CURSOR FOR LOOP를 사용하여 DEPT 테이블의 자료를 조회하여라.

 

1.11 SUBQUERY를 사용한 CURSOR FOR LOOP

 PL/SQL 이 SUBQUERY를 치환 하도록 하기 때문에 CURSOR는 선언할 필요가 없다.

 

1.11.1 Syntax

  subquery     SELECT 문장을 기술

 

문제 5) SUNQUERY를 사용한 CURSOR FOR LOOP를 이용하여 DEPT 테이블의 내용을 조회하여라.

'Legend 개발자 > Oracle' 카테고리의 다른 글

Team Project SQL  (0) 2017.11.07
오라클 시험  (0) 2017.06.23
No.018 PL/SQL 조건문 [2017-06-14]  (0) 2017.06.19
No.017 PL/SQL 쿼리 [2017-06-14]  (0) 2017.06.19
No.016 PL/SQL 변수 [2017-06-14]  (0) 2017.06.16
Posted by 전설의아이
|

1. 개요

 여러 가지 제어 구조를 이용하여 PL/SQL 블럭에 있는 문장들의 논리적 흐름을 변경할 수 있다. 조건에 의해 분기하는 IF문을 이용한 조건 구조와 LOOPING 구조(조건 없이 반복하는 BASIC 루프, 계수를 이용하여 반복을 하는 FOR 루프, 문장이 TRUE인 동안에 반복을 하는 WHILE 루프, 루프를 종료하는 EXIT문)가 있다.

 

1.1 IF문

 PL/SQL 의 IF 문장은 다른 언어의 IF 문장과 거의 유사하다. 즉 일치하는 조건(TRUE, FALSE, NULL)에 따라 선택적으로 작업을 수행할 수 있게 해준다. TRUE 면 THEN과 ELSE 사이의 문장을 수행하고 FALSE나 NULL이면 ELSE와 END IF 사이의 문장을 수행한다.

1.1.1 Syntax

  condition    BOOLEAN 변수 또는 표현식을 기술할 수 있다. (TRUE, FALSE, NULL)

  statements  하나 이상의 PL/SQL 또는 SQL 문장을 기술한다.

  ELSIF          처음식이 FALSE 또는 NULL일 경우 추가적인 조건이 필요한 경우에 사용   

 

1.1.2 단순 IF 문장

 조건이 TRUE 이면 THEN 이하의 문장을 실행하고 조건이 FALSE나 NULL이면 END IF 다음 문장을 수행한다.

 

가) Syntax

 

문제 1) 이름, 급여, 부서번호를 입력받아 EMP 테이블에 자료를 등록하는 SCRIPT를 작성하여라. 단 10번 부서일 경우 입력한 급여의 20%를 추가하고 초기값이 9000부터 9999까지 1씩 증가하는 SEQUENCE(EMP_EMPNO_SEQ) 작성하여 사용하고 아래의 표를 참고하여라.

 

Guidelines

 1) 충족하는 조건에 따라 선택적으로 작업을 수행할 수 있다.

 2) 코드를 사용할 때 키워드의 철자를 바르게 기술하시오.(ELSIF, END IF)

 3) 제어의 조건들이 TRUE이면 THEN과 END IF 사이의 관련된 문장들이 수행됩니다.

    그러나 FALSE나 NULL이면 END IF 다음의 문장으로 제어가 넘어 갑니다.

 4) ELSE 절은 한번만 사용 가능 합니다.

 5) 명확성을 위해 조건적으로 실행되는 문장을 들여쓰기 하는 것이 좋습니다.

 

1.1.3 IF -THEN - ELSE 문장의 실행 흐름

 조건이 TRUE 이면 THEN 부터 ELSE 사이의 문장을 수행하고 제어는 END IF 다음 문장으로 넘어가고 FALSE 나 NULL 이면 ELSE 부터 END IF 사이의 문장을 수행하고 제어는 END IF 다음의 문장으로 이동 된다.

 

가) Syntax

 

문제 2) 이름을 입력받아 그 사람의 업무가 MANAGER', 'ANALYST' 이면 급여의 50%를 가산하여 갱신하고 업무가 MANAGER', 'ANALYST'이 아니면 20%를 가산하는 SCRIPT를 작성하여라.

 

1.1.4 IF-THEN-ELSIF 문장의 실행 흐름

 가능하면 중첩 IF 문장 대신 ELSIF 절을 사용하여라. 코드를 읽고 이해하기가 더 쉬우며 로직을 정확하게 식별됩니다. ELSE 절 안의 작업이 순수하게 다른 IF 문으로 구성된다면 이것은 ELSIF 절을 사용하는 것이 더욱 편리합니다. 조건과 수행이 각각 종료 시에 중첩 END IF에 대해 일일이 요구하지 않음으로써 코드를 더 명확하게 만들어 줍니다.

 

가) Syntax

 

문제 3) 이름을 입력받아 업무를 조회하여 업무별로 급여를 갱신하는 SCRIPT를 작성하여라. 단 PRESIDENT : 10%, MANAGER : 20%, ANALYST : 30%, SALESMAN : 40%, CLERK : 50%를 적용한다.

 

1.2 논리적 조건 설정

 비교 연산자를 써서 숫자, 문자 또는 날짜 식을 결합한 간단한 논리 조건을 만든다. 일반적으로 IS NULL 연산자로 NULL 값을 처리할 수 있다.

 

1.2.1 식과 비교에서 널(NULL) 논리적 조건 설정

 널 값을 공 문자열로 처리하는 연결식(Concatenation)은 예외이지만 기타 다른 널 값을 포함하는 식은 널 값을 return 하고 IS NULL 비교의 결과는 TRUE나 FALSE로 return된다.

 

1.2.2 논리 테이블

 논리연산자 AND, OR, NOT을 가지고 단순한 BOOLEAN 조건을 조합함으로써 복잡한 BOOLEAN 조건을 구축할 수 있다.

AND 

TRUE 

FALUE

NULL

 

OR

TRUE

FALUE

NULL

 

NOT

 

TRUE

TRUE 

FALUE

NULL

 

TRUE

TRUE

TRUE

TRUE

 

TRUE

FALUE

FALUE

FALUE

FALUE

FALUE

 

FALUE

TRUE

FALUE

NULL

 

FALUE

TRUE

NULL

NULL

FALUE

NULL

 

NULL

TRUE

NULL

NULL

 

NULL

NULL

 

1.3 LOOP문

 LOOP문은 일련의 문장(SQL, PL/SQL)들을 여러 번 반복하기 위해 많은 편의를 제공한다.

 1) 조건 없이 반복 작업을 제공하기 위한 BASIC LOOP문

 2) COUNT를 기본으로 작업의 반복 제어를 제공하는 FOR LOOP문

 3) 조건을 기본으로 작업의 반복 제어를 제공하기 위한 WHILE LOOP문

 4) LOOP를 종료하기 위한 EXIT문

 

1.4 BASIC LOOP문

 가장 간단한 루프는 구분 문자인 LOOP 와 END LOOP 사이에 반복되는 문장 부분들로 이루어져 있다. 실행상의 흐름이 END LOOP에 도달할 때마다 그와 짝을 이루는 LOOP문으로 제어가 되돌아간다. 이러한 루프를 무한 루프라 하며, 여기서 빠져나가려면 EXIT 문을 사용한다. 기본 LOOP는 LOOP에 들어갈 때 조건이 이미 일치했다 할지라도 적어도 한번은 문장이 실행된다.

 

1.4.1 Syntax

 

1.5 EXIT 문

 EXIT 문을 이용하면 END LOOP 문 다음 문으로 제어를 보내기 때문에 루프를 종료할 수 있다. EXIT는 IF 문 내의 처리 작업으로서 또는 루프 내의 독립적인 문장으로서도 사용할 수 있다. 조건에 따라 루프를 종료할 수 있도록 WHEN 절을 덧붙일 수 있다. EXIT 문에 직면하게 되면 조건이 평가 됩니다. 조건이 TRUE를 RETURN하면 LOOP을 끝내고 LOOP 후의 다음 문장으로 제어를 전달합니다. 기본 LOOP는 여러 개의 EXIT 문장을 포함할 수 있다.

 

1.5.1) Syntax

 

문제 4) LOOP문으로 아래와 같이 출력하는 SCRIPT를 작성하여라.

 

문제 5)EVEN_ODD(ID:NUMBER(4) GUBIN : VARCHAR2(4)) 테이블을 작성하여 START 숫자와 END 숫자를 입력 받아 그 사이의 숫자를 ID에 ID의 숫자가 짝수이면 GUBUN에 "짝수"를 홀수이면 GUBUN에 "홀수"라고 입력하는 SCRIPT를 LOOP문으로 작성하여라.

 

1.6FOR LOOP 문

 FOR LOOP는 기본 LOOP와 동일한 일반 구조를 가집니다. 그리고 PL/SQL이 수행되는 수를 정하기 위해 LOOP키 워드 앞에 제어문을 기술합니다. FOR LOOP 문에서 사용되는 인덱스는 정수로 자동 선언되므로 따로 선언할 필요가 없다. FOR LOOP 문은 LOOP 을 반복할 때마다 자동적으로 1씩 증가 또는 감소한다. REVERSE는 1씩 감소함을 의미한다.

 

1.6.1) Syntax

 index_counter    upper_bound나 lower_bound에 도달할 때까지 LOOP를 반복함으로써 1씩 자동적으로 증가하거나 감소되는 값을 가진 암시적으로 선언된 정수입니다.

 REVERSE           upper_bound 나 lower_bound까지 반복함으로써 인덱스가 1씩 감소되도록 합니다.

 lower_bound      index_counter 값의 범위에 대한 하단 바운드값을 지정한다.

 upper_bound     index_counter 값의 범위에 대한 상단 바운드값을 지정한다.

 

Guidelines

 1) 일련의 문장들은 두 바운드에 의해 카운트가 결정되고 증가될 때마다 실행 됩니다.

 2) 루프 범위의 하단 바운드와 상단 바운드는 리터럴, 변수, 표현식이 가능하지만 정수로 기술되어야 합니다.

 3) 루프 범위의 하단 바운드가 상단 바운드보다 더 큰값이 기술되면 일련의 문장들은 수행되지 않습니다.

 4) 루프 내에서만 인덱스 카운터를 참조할 수 있다. 즉 루프 밖에서는 정의되지 않는다.

 5) 인덱스 카운터의 값을 참조하기 위해서 표현식을 사용한다.

 6) := 좌측에 인덱스 카운터를 기술할 수 없다.

 

문제 6) FOR 문으로 아래와 같이 출력하는 SCRIPT를 작성하여라.

 

문제 7) EVEN_ODD(ID:NUMBER(4), GUBUN:VARCHAR(4)) 테이블을 작성하여 START 숫자와 END 숫자를 입력 받아 그 사이의 숫자를 ID에 ID의 숫자가 짝수이면 GUBUN에 "짝수"를 홀수이면 GUBUN에 "홀수"라고 입력하는 SCRIPT를 FOR문으로 작성하여라.

 

1.7 WHILE LOOP 문

 제어 조건이 TRUE 인 동안만 일련의 문장을 반복하기 위해 WHILE LOOP 문장을 사용한다. 조건은 반복이 시작될 때 체크하게 되어 LOOP 내의 문장이 한번도 수행되지 않을 경우도 있다. LOOP을 시작할 때 조건이 FALSE이면 반복 문장을 탈출하게 된다.

 

1.7.1 Syntax

 condition          BOOLEAN 변수 또는 표현식을 기술(TRUE,FALSE,NULL)

 

문제 8) WHILE 문으로 아래와 같이 출력하는 SCRIPT를 작성하여라.

 

문제 9) EVEN_ODD(ID:NUMBER(4) GUBUN:VARCHAR2(4)) 테이블을 작성하여 START 숫자와 END 숫자를 입력 받아 그 사이의 숫자를 ID에 ID의 숫자가 짝수이면 GUBUN에 "짝수"를 홀수이면 GUBUN에 "홀수"라고 입력하는 SCRIPT를 WHILE문으로 작성하여라.

 

1.8 중첩 LOOP와 레이블

 여러 단계로 루프를 중첩할 수 있습니다. WHILE 루프 내에서 FOR 루프를, FOR루프 내에서 WHILE 루프를 중첩할 수 있습니다. 대개 중첩 루프가 종결되면 예외가 발생하지 않는 한 둘러싸는 루프가 종결되지 않습니다. 레이블 명은 다른 식별자들과 동일한 규칙을 따릅니다. 레이블은 같은 라인 또는 다음 라인에서 문장 앞에 위치됩니다. 레이블 구분 문자 안에 LOOP라는 글자 앞에 레이블을 위치 시킴으로써 루프를 레이블 시킵니다. 루프가 레이블이 되면 END LOOP 문장 후에 루프 이름을 선택적으로 쓸 수 있습니다.

 

1.8.1) 사용 예

 

'Legend 개발자 > Oracle' 카테고리의 다른 글

오라클 시험  (0) 2017.06.23
No.019 PL/SQL 커서 [2017-06-14]  (0) 2017.06.19
No.017 PL/SQL 쿼리 [2017-06-14]  (0) 2017.06.19
No.016 PL/SQL 변수 [2017-06-14]  (0) 2017.06.16
No.015 PL/SQL 개요 [2017-06-14]  (0) 2017.06.15
Posted by 전설의아이
|

1. PL/SQL에서 SQL문장

 데이터베이스에서 정보를 추출할 필요가 있을 때 또는 데이터베이스로 변경된 내용을 적용할 필요가 있을 때 SQL을 사용합니다. PL/SQL은 SQL.에 있는 DML과 TRANSACTION 제어명령을 모두 지원합니다. 테이블의 행에서 질의된 값을 변수에 할당 시키기 위해 SELECT 문장을 사용합니다. DML 문장은 다중 행 처리를 할 수 있지만 SELECT 문장은 하나의 행만을 처리할 수 있습니다.

 

1.1 PL/SQL 에서 SQL문장 사용

 1) SELECT 명령어를 사용하여 데이터베이스에서 한 행의 데이터를 추출합니다.

 2) DML 명령어를 사용하여 데이터베이스의 행에 대해 갱신할 수 있습니다.

 3) COMMIT, ROLLBACK, SAVEPOINT 명령어로 TRANSACTION을 제어 합니다.

 4) 암시적인 커서로 DML 결과를 결정합니다.

 

1.1.1 SQL과 PL/SQL 문장의 유형 비교

 1) PL/SQL 블록은 TRANSACTION 단위가 아닙니다. COMMIT, ROLLBACK, SAVEPOINT는 블록과는 독립적이지만 블록에서 이 명령어를 사용할 수 있습니다.

 2) PL/SQL은 CREATE TABLE, ALTER TABLE, DROP TABLE 같은 DDL을 지원하지 않습니다.

 3) PL/SQL은 GRANT, REVOKE과 같은 DCL을 지원하지 않습니다.

 

1.2 PL/SQL에서 SELECT 문장

 데이터베이스에서 데이터를 읽어 들이기 위해 SELECT 문장을 사용합니다. SELECT 문장은 INTO 절이 필요한데, INTO 절에는 데이터를 저장할 변수를 기술한다. SELECT 절에 있는 Column 수와 INTO 절에 있는 변수의 수는 좌측부터 1대 1대응을 하며 개수와 데이터의 형, 길이가 일치하여야 한다. SELECT 문은 INTO 절에 의해 하나의 행만을 저장할 수 있다. 그러므로 SELECT 문장에서 조건을 만족하는 ROW가 한 개도 없거나 여러 행이 있으면 에러를 발생한다.

 

1.2.1 Syntax

 select_list          열의 목록이며 행 함수, 그룹 함수, 표현식을 기술할 수 있다.

 variable_name    읽어 들인 값을 저장하기 위한 스칼라 변수

 record_name      읽어 들인 값을 저장하기 위한 PL/SQL RECORD 변수

 Condition          PL/SQL 변수와 상수를 포함하여 열명, 표현식, 상수, 비교 연산자로 구성되며 오직 하나의 값을 RETURN 할 수 있는 조건이어야 한다.

 

참고

 질의는 하나의 행만 RETURN 해야 합니다. PL/SQL 블록 내의 SELECT 문장은 다음 규칙을 적용하는 Embedded SQL의 ANSI 범주에 속합니다. 질의의 결과는 하나의 행만을 RETURN 해야 하고 하나의 행 이상 또는 행이 없는 것은 에러를 생성합니다. PL/SQL은 NO_DATA_FOUND와 TOO_MANY_RoWS를 예외로 블록의 예외 섹션에서 추적할 수 있는 표준 예외를 조성하여 처리 합니다.

 1) SELECT 문 사용시 한개 이상의 ROW가 검색되면 Oracle8 Server는 미리 정해진 EXCEPTION 인 TOO_MANY_ROWS라고 부르는 에러 번호 -1422를 발생한다.

 2) SELECT 문 사용시 아무런 ROW도 검색되지 않으면 Oracle8 Server는 미리 정해진 EXCEPTION인 NO_DATA_FOUND라고 부르는 에러 번호 +1403이 발생한다.

 

문제 1) 이름을 입력받아 급여와 입사일을 출력하는 SCRIPT를 작성하여라.

 

참고

 위 문제에서 SET VERIFY OFF은 old 와 new 값을 출력하지 않고, SET SERVEROUTPUT ON은 DBMS_OUTPUT 이라는 PACKAGE 내의 PUT_LINE 함수를 사용한다. 이 함수를 SQL*Plus 에서 사용하려면 환경 변수를 사용하기 위하여 사용하였다.

 

문제 2) 부서번호를 입력받아 급여의 합을 출력하는 SCRIPT를 작성하여라. 

 

Guidelines

 1) 세미콜론(;)으로 개별 SQL 문장을 종료한다.

 2) SELECT 문장이 PL/SQL에 내장될 때 INTO 절을 사용한다.

 3) WHERE 절은 선택적이며 입력변수, 상수, 리터럴, 또는 PL/SQL의 표현식을 지정하기 위해 사용될 수 있다.

 4) SELECT 절에서의 데이터베이스 열과 INTO 절에서의 출력 변수의 수를 동일하게 좌측부터 1대1대응되게 지정해야 한다.

 5) 식별자의 데이터형과 열의 데이터형을 갖도록 보증하기 위해 %TYPE 속성을 사용합니다. INTO 절의 변수의 데이터형과 변수의 수는 SELECT에서 기술한 Column의 수와 일치하여야 합니다.

 6) 그룹 함수는 테이블의 행 그룹에 적용되기 때문에 SUM 같은 그룹 함수는 SQL에서 사용합니다.

 

1.3 PL/SQL을 이용한 데이터 조작

 DML 명령어를 사용하여 데이터베이스 테이블에 대한 내용을 변경할 수 있다.

 1) INSERT 문장은 테이블에 데이터의 새로운 행을추가한다.

 2) UPDATE 문장은 테이블에 존재하는 행을 수정한다.

 3) DELETE 문장은 테이블에서 원치 않는 행을 제거한다.

 

1.3.1 데이터 삽입

 1) USER와 SYSDATE 같은 SQL 함수를 사용합니다.

 2) 데이터베이스 시퀀스를 사용하여 기본키 값을 생성합니다.

 3) PL/SQL 블록에서 값을 얻거나 DEFAULT 값을 이용합니다.

 

문제3) 초기값이 8000부터 9999까지 1씩 증가하는 SEQUENCE(EMPNO_SEQUENCE)를 생성하여 EMP 테이블에 등록하는 SCRIPT를 작성하여라. 단 이름은 JONG, 업무는 MANAGER, 부서번호는 10 이다.

 

1.3.2 데이터 갱신

 1) 지정 연산자 좌측에 있는 식별자는 항상 데이터베이스 열이지만 오른쪽에 있는 식별자도 데이터베이스 열 또는 PL/SQL 에서 사용되는 변수도 기술 가능하다.

 2) PL/SQL 에서의 SELECT 문장과 달리 수정된 행이 없으면 에러가 발생하지 않는다.

 

문제 4) 사원번호가 7369인 사원의 급여에 1000을 더하여 갱신하여라.

 

1.3.3 데이터 삭제

 PL/SQL 에서 SQL의 DELETE문장을 사용하여 필요 없는 자료를 삭제할 수 있다.

 

문제 5) 사원번호가 7654인 사원의 정보를 삭제하여라.

 

1.4 이름 지정 규약

 1) WHERE 절에서 모호성을 피하기 위해 이름 지정 규약을 사용한다.

 2) 데이터베이스 열과 식별자는 다른 이름을 가져야 한다.

 3) PL/SQL이 테이블의 열을 첫번째로 조사하기 때문에 구문 오류가 발생할 수도 있다.

 

1.5 COMMIT과 ROLLBACK 문장

 COMMIT 또는 ROLLBACK SQL 문장으로 트랜잭션 논리를 제어 함으로써 데이터베이스를 영구적으로 변경하게 합니다. ORACLE SERVER 에서와 마찬가지로 DML 트랜잭션은 COMMIT 또는 ROLLBACK을 수행한 다음에 시작하고 성공적인 COMMIT 또는 ROLLBACK 다음에 종료합니다.

 

1.6 SQL CURSOR

 SQL 문장을 실행할 때마다 ORACLE SERVER은 명령이 분석되고 실행되는 곳에서 메모리 영역을 개방합니다. 이 영역을 CURSOR라 합니다. 블록의 실행 부분이 SQL 문장을 실행할 때 PL/SQL은 SQL 식별자를 가지는 암시적 CURSOR는 명시적으로 선언되고 프로그래머에 의해 명명됩니다.

 1) CURSOR는 개별 SQL 작업 영역입니다.

 2) CURSOR에는 임시적 커서와 명시적 커서가 있습니다.

 3) ORACLE SERVER은 SQL 문장을 분석하고 실행하기 위해 암시적 커서를 사용합니다.

 4) 명시적 커서는 프로그램에 의해 명시적으로 선언 됩니다.  

 

1.6.1 CURSOR의 속성

 SQL CURSOR의 속성을 사용하여 SQL 문장의 결과를 테스트할 수 있다.

 종류

설명 

SQL%ROWCOUNT 

가장 최근의 SQL 문장에 의해 영향을 받은 행의 수 

SQL%FOUND 

가장 최근의 SQL 문장이 하나 또는 그 이상의 행에 영향을 미친다면 TRUE로 평가한다. 

SQL%NOTFOUND 

가장 최근의 SQL 문장이 어떤 행에도 영향을 미치지 않았다면 TRUE로 평가한다. 

SQL%ISOPEN 

PL/SQL 이 실행된 후에 즉시 암시적 커서를 달기 때문에 항상 FALSE로 평가된다. 

 

문제 6) ITEM 테이블에서 ORDID가 605인 자료를 모두 삭제하여라.

Posted by 전설의아이
|

1. 변수

 SQL과 절차적인 문장 안에서 PL/SQL로써 변수를 선언할 수 있고 그것을 사용할 수 있다.

 

1.1 변수 사용

 변수는 자료를 일시적으로 저장하고 변경하고 검증하기 위해 하나 또는 그 이상의 변수를 선언하여 사용한다. 또한 변수는 데이터베이스를 액세스하지 않고 계산이나 다른 데이터 조작에 사용할 수 있다. 이러한 변수는 일단 선언되면 다른 선언적 문장을 포함한 다른 문장에서 간단하게 그것을 반복적으로 참조하여 사용할 수 있다.

 %TYPE와 %ROWTYPE을 사용하여 변수를 선언하면 테이블의 구조가 변경(데이터형과 길이)되어도 Application에서는 실행 시간에 테이블을 참조하여 변수가 정의되므로 데이터의 독립성, 유지비용 절감을 제공하고, 새로운 업무 요구에 충족시키기 위해 데이터베이스 변경에 따라 프로그램의 적응, 수정되는 것을 허용한다.

 

1.2 PL/SQL에서 변수 처리

 1) 선언 섹션 내에서 변수를 선언하고 초기화하여 사용합니다.

 2) 실행 섹션에서 변수에 대한 새 값을 할당 합니다.

 3) 매개변수를 통해 PL/SQL 블록으로 값을 전달합니다.

 4) 출력 변수를 통해 결과를 봅니다.

 

문제 1) EMp 테이블에 EMPNO_SEQUENCE의 SEQUENCE를 이용하여 이름, 급여, 부서번호를 입력받아 등록하는 SCRIPT를 작성하여라. 단 10번부서는 입력된 급여에20%의 가산하여 등록하고 30번부서는 10% 가산 점이 있다.

 

1.3 변수 유형

 모든 PL/SQL 변수는 저장 포맷, 제약 조건, 값의 유효 범위를 지정하는 데이터형을 가지고 있다. PL/SQL은 변수, 상수, 포인터를 선언하기 위해 사용할 수 있는 4가지 데이터형(Scalar, Composite, Reference, LOB(large objects:Oracle8)을 지원합니다.

 

1.3.1 PL/SQL 변수

 1) Scalar : 주로 단일 값을 보유합니다. 주요 데이터형은 ORACLE SERVER 테이블의 열 유형에 대응하는 것들입니다.

 2) Composite : 레코드 같은 조합 데이터형은 PL/SQL 블록에서 조작되고 정의되는 필드 그룹을 허용합니다.

 3) Reference : 참조 데이터형은 pointer 라 불리며 다른 프로그램 항목을 지시하는 값을 보유합니다.

 4) LOB(large objects) : LOB 데이터형은 locator라 불리며 라인 밖에서 지정된 큰 객체의 위치를 지정하는 값을 보유합니다.

 

1.3.2 Non-PL/SQL 변수

 1) Bind와 host variables

 

1.4 PL/SQL 변수 선언

 PL./SQL 블록에서 그것을 참조하기 전에 선언 섹션에서 모두 PL/SQL 식별자를 선언할 필요가 있습니다. 초기값을 할당하기 위해 옵션을 가집니다. 변수를 선언하기 위해 변수에 대한 값을 할당할 필요는 없습니다. 선언에서 다른 변수를 참조한다면 이전 문장에서 개별적으로 그것들을 반드시 선언해 놓아야 합니다.

 

1.4.1 Syntax

 identifier         변수의 이름

 CONSTANT      변수의 값을 변경할 수 없도록 제약합니다.

 datatype          Scalar, Composite, Reference, LOB(large objects)

 NOT NULL       값을 포함해야만 하도록 하기 위해 변수를 제약 합니다.

 Expression        Literal, 다른 변수, 연산자나 함수를 포함하는 표현식

 

1.4.2 사용 예

 

Guideline

 1) SQL 객체에 대해 사용된 동일한 이름 지정 규칙에 따라 식별자의 이름을 지정한다.

 2) 이름 지정 규약을 사용할 수 있습니다. (예: v_name는 변수를 나타내고 c_name 는 상수를 나타낸다.)

 3) NOT NULL 로 지정된 변수를 초기화 합니다.

 4) 지정 연산자(:=)를 사용하거나 예약어 DEFAULT 를 사용하여 식별자를 초기화 합니다.

 5) 한 라인에 하나의 식별자만 선언 합니다.

 6) 상수 선언에서 CONSTRAINT는 형 지정자보다 먼저 기술되어야 한다.

 

1.5 이름 지정 규칙

 1) 하나의 블록에서 동일 이름의 변수를 선언할 수 없습니다.

 2) 블록이 다르면 동일 이름을 선언할 수 있습니다. 객체들이 동시에 존재하는 곳에서는 현재 블록에서 정의된 객체들만이 사용될 수 있습니다.

 3) 변수에 대한 이름을 블록에서 사용되는 테이블 열의 이름과 동일하게 선택해서는 안됩니다. PL/SQL 변수가 SQL 명령에서 사용되고 열과 동일 이름을 가지면 ORACLE SERVER은 참조되는 열로 간주 합니다.

 

1.6 변수의 값 지정

 변수의 값을 지정하거나 재지정하기 위해 PL/SQL 지정 문자를 사용합니다. 지정 연산자(:=)의 좌측에 새 값을 받기 위한 변수를 적습니다.

 

1.6.1 Syntax

 

1.6.2 사용 예

 

주의

 Oracle Server 에서 DEFAULT 날짜 형식 설정이 데이터베이스마다 차이가 있을 수 있기 때문에 DEFAULT 날짜 형식을 알아야 한다. DEFAULT 날짜 형식이 YY-MM-DD 이면 v_hiredate := '99-01-01'로 값을 설정하여야 한다. 일반적으로 날짜의 형식에 의존하지 않고 사용하고자 할 경우에는 v_hiredate := TO_DATE('99-01-01','YY-MM-DD');을 사용한다.

 

1.7 스칼라 데이터 형

 1) 단일 값을 유지 합니다.

 2) 내부적인 구성 요소는 없습니다.

 

1.7.1 기본 스칼라 데이터 형

 데이터 형

설명 

VARCHAR2(n) 

변수 길이 문자 데이터에 대한 기본형은 32767Byte까지 입니다.

VARCHAR2 변수와 상수에 대한 디폴트 크기는 없습니다. 

NUMBER(p,s)

고정(fixed)과 유동(floating)포인트 숫자에 대한 기본형 

DATE 

날짜와 시간에 대한 기본형. DATE 값은 지정 이후의 초 단위로 날에 대한 시간을 포함합니다. 날짜의 범위는 BC 4712년 1월 1일부터 AD 9999년 12월 31일 사이 입니다. 

CHAR(n)

고정 길이 문자에 대한 기본형은 32767 바이트까지 입니다. 지정하지 않는다면 디폴트 길이는 1로 설정됩니다. 

LONG 

고정 길이 문자에 대한 기본형은 32760 바이트까지 입니다.

LONG 데이터베이스 열의 최대 폭은 2147483647 바이트입니다. 

LONG RAW

이진 데이터와 바이트 문자열에 대한 기본형은 32760Byte 까지 입니다. LONG RAW 데이터는 PL/SQL 에 의해 해석되지 않습니다. 

BOOLEAN

계산에 사용되는 3가지 가능한 값 가운데 기본형(TRUE,FALSE,NULL) 

BINARY_INTEGER

-2147483647~2147483647 사이의 정수에 대한 기본 형 

PLS_INTEGER 

-2147483647~2147483647 사이의 signed 정수에 대한 기본형으로 PLS_INTEGER 값은 NUMBER와 BINARY_INTEGER 값보다 적은 기억장치를 필요로 합니다. 

 

참고

 LONG 데이터 형은 LONG 값의 최대 길이가 32767 바이트인 것을 제외하고는 VARCHAR2와 유사합니다. 그러므로 32760 바이트보다 더 긴 값은 LONG 데이터베이스 열에서 LONG PL/SQL 변수로 사용할 수 없습니다.

 

1.7.2 스칼라 변수 선언의 예

 

1.7.3 %TYPE 속성

 변수의 데이터 형과 정밀도를 직접 코딩하기 보다는 이전에 선언된 다른 변수 또는 데이터베이스 열에 맞추어 변수를 선언하기 위해 %TYPE 속성을 사용할 수 있습니다. 변수에 저장되는 값이 데이터베이스의 테이블에서 오거나 변수가 테이블에 쓰여지기로 되었다면 %TYPE 속성은 자주 사용됩니다. 변수 선언에서 필요한 데이터형 대신에 속성을 사용하려면 데이터베이스 테이블과 열 이름을 접두어로 사용합니다. 또한 이전에 선언된 변수를 참조한다면 속성 앞에 변수명을 기술합니다. 데이터베이스 수준에서 테이블의 데이터형을 변경하여도 PL/SQL을 고칠 필요가 없습니다.

 

가) 사용 예

 

1.7.4 BOOLEAN 변수 선언

 1) TRUE, FALSE, NULL 값만을 BOOLEAN 변수에 대해 지정할 수 있습니다.

 2) 변수는 논리연산자 AND, OR, NOT 에 의해 접속 됩니다.

 3) 변수는 항상 TRUE, FALSE, NULL을 생성 합니다.

 4) 산술, 문자, 날짜 표현식은 BOOLEAN 값을 리턴하기 위해 사용될 수 있습니다.

 

가) 사용 예

 

1.8 조합 데이터 형(Composite Datatype)

 Composite Datatype은 내부 구성 요소를 갖고 있고 PL/SQL 에서 사용할 수 있는 Composite Datatype은 RECORD, TABLE, 중첩 TABLE, VARRAY 입니다. RECORD 데이터형은 관련은 있으나 서로 다른 데이터형들을 논리적인 하나의 단위로 묶기 위해 사용하고 TABLE 데이터 형은 전체 객체로써 데이터형이 같은 데이터의 모음을 참조하고 조작하기 위해 사용한다. 한번 정의되면 테이블과 레코드는 재이용할 수 있다.

 

1.8.1 PL/SQL TABLE TYPE

 테이블형의 객체는 PL/SQL 테이블이라 불립니다. PL/SQL 테이블은 행에 대해 배열처럼 액세스하기 위해 기본키를 사용합니다. 배열과 유사하고 PL/SQL 테이블을 액세스하기 위해 BINARY_INTEGAR 데이터형의 기본키와 PL/SQL 테이블 요소를 저장하는 스칼라 또는 레코드 데이터형의 열을 포함하여야 한다. 또한 이들은 동적으로 자유롭게 증가할 수 있습니다.

가) Syntax

 table_type_name         테이블형의 이름

 column_type              VARCHAR2, DATE, NUMBER과 같은 스칼라 데이터 형

 identifier                   전체 PL/SQL 테이블을 나타내는 식별자의 이름

 

문제 2) TABLE 변수를 사용하여 EMP 테이블에서 이름과 업무를 출력하여라.

 

1.8.2 PL/SQL RECORD TYPE

 PL/SQL RECORD TYPE은 데이터베이스의 테이블 ROW와 다르고 3GL 에서의 RECORD 나 STRUCTURE와 유사하다. PL/SQL RECORD는 Scalar, PL/SQL RECORD, PL/SQL TABLE 데이터 타입 중 하나 이상의 요소를 갖고 있어야 하며, 다른 데이터 타입을 가질 수도 있다. 또한 FIELD(ITEM)들의 집합을 하나의 논리적 단위로 처리할 수 있게 해 주므로 테이블의 ROW를 읽어올 때 편리하다.

 

가)Syntax

 type_name        RECODE형의 이름, 이 식별자는 RECODE 를 선언하기 위해 사용ㅎ나다.

 field_name        RECODE내의 필드명

 

나) RECORD 참조

 RECORD에서 필드는 이름으로 액세스 됩니다. 개별 필드를 참조하거나 초기화 하기 위해 ","을 사용합니다.

 

다) RECORD 에 대한 값 할당

 SELECT 또는 FETCH 문장을 사용함으로써 RECORD에 값을 지정할 수 있다. 열이름의 RECORD의 필드와 동일한 순서로 1대1 대응을 하여야 합니다. 두 RECORD가 동일한 구조를 가지면 하나의 RECORD를 다른 RECORD에 지정할 수 있습니다.

 

문제 3) EMP 테이블에서 이름을 입력 받아 아래의 형태로 출력하는 SCRIPT를 작성하여라.

 

Guidelines

 1) 각 RECORD는 필요한 만큼 많은 필드를 가질 수 있다.

 2) RECORD는 초기값을 지정할 수 있고 NOT NULL 로 정의될 수 있다.

 3) 초기값이 없는 필드는 NULL로 초기화 됩니다.

 4) DEFAULT 키워드는 필드를 정의할 때 사용될 수 있습니다.

 5) 임의의 블록 서브 프로그램, 패키지의 선언 부분에 RECORD 형을 정의하고 사용자 정의 RECORD를 선언할 수 있다.

 6) 중첩 RECORD를 선언하고 사용할 수 있다. RECORD는 다른 RECORD의 구성 요소가 될 수 있다.

 

1.8.3 %ROWTYPE 의 속성

 데이터베이스의 테이블 또는 VIEW의 일련의 열을 RECORD로 선언하기 위하여 %ROWTYPE를 사용합니다. 데이터베이스 테이블 이름을 %ROWTYPE 앞에 접두어를 붙여 RECORD를 선언하고 FIELD는 테이블이나 VIEW의 COLUMN명과 데이터 타입과 LENGTH을 그대로 가져올 수 있다.

 

가) Syntax

 identifier          RECORD에 대해 지정된 이름

 reference          RECORD의 기초가 되는 테이블, VIEW, CURSOR, 변수 명을 기술

 

나) 개별 피드를 참조하는 방법

 

다) %ROWTYPE을 사용 시 장점

 1) 알지 못하는 데이터베이스 COLUMN의 개수와 데이터 형식을 모르게 지정할 수 있다.

 2) 실행 시 변경되는 데이터베이스 COLUMN의 개수와 데이터 형식을지정할 수 있다.

 3) SELECT 문장으로 행을 검색할 때 유리하다.

 

문제 4) EMP 테이블에서 이름을 입력 받아 아래의 형태로 출력하는 SCRIPT를 작성하여라.

 

1,9 LOB Datatype 변수

 LOB Datatype 변수는 Oracle8 데이터형으로 구조화 되지 않은 데이터(텍스트, 그래픽, 이미지, 비디오 클립, 소리 웨이브 폼 같은 ) 블록을 4 기가 바이트 크기까지 저장할 수 있습니다. LOB Datatype은 데이터에 대한 랜덤 액세스를 지원합니다.

 1) CLOB(character large object) 데이터형은 데이터베이스 내의 단일 바이트 문자 데이터의 대형 블록을 저장하기 위해 사용한다.

 2) BOB(binary large object) 데이터형은 행의 안팎에 데이터베이스 내의 대형 이진 객체를 저장하기 위해 사용됩니다.

 3) BFILE(binary file) 데이터형은 데이터베이스 외부의 운영 시스템 파일의 대형 이진 객체를 저장하기 위해 사용됩니다.

 4) NCLOB(national language character large object) 데이터형은 데이터베이스 내의 단일 바이트, 또는 고정 길이의 멀티바이트 NCHAR 데이터를 행의 안팎에 저장하기 위해 사용됩니다.

 

1.10 바인드 변수

 바인드 변수는 호스트 환경에서 선언된 변수이며, 실행 시간 값을, 그것이 숫자이든지 또는 문자이든지 임의의 다른 변수처럼 그것을 사용할 수 있는 하나 이상의 PL/SQL 프로그램의 내부나 외부에서 전달하기 위해 사용합니다. 문장이 프로시저, 함수, 패키지 안에 있지 않는다면, 호출 환경 또는 호스트에서 선언된 변수를 PL/SQL 문장에서 참조할 수 있습니다. 이것은 선행 컴파일러 프로그램에서 선언된 호스트 언어 변수, Develover/2000Forms 어플리케이션의 화면 필드, SQL*Plus 바인드 변수를 포함합니다.

 

1.10.1 바인드 변수 생성

 SQL*Plus 환경에서, 바인드 변수를 선언하기 위해 VARIABLE 명령을 사용합니다. SQL 과 SQL*Plus는 바인드 변수를 참조할 수 있고 SQL*Plus는 그 값을 출력할 수 있습니다.

 

가) Syntax

 

1.10.2 바인드 변수 출력

 SQL*Plus 환경에서 바인드 변수의 현재 값을 출력하기 위해 PRINT 명령을 사용합니다.

 

1.11 Non-PL/SQL 변수 참조

 호스트 변수를 참조하기 위해 선언된 PL/SQL 변수와 호스트 변수를 구별하기 위해 콜론(;)으로 참조 접두어를 기술하여야 한다.

 

2. PL/SQL 블록

 PL/SQL 은 프로그램을 논리적인 블록으로 나누게 하는 구조화된 블록 언어이다. PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있다. 변수들과 그 외의 식별자를 참조하고 선언함으로써 PL/SQL 블록 내에서 값을 저장하고 변경할 수 있는 논리적인 단위이다.

 

2.1 PL/SQL 블록 구문과 지침

 PL/SQL은 SQL의 확장이기 때문에 SQL에 적용하는 일반적인 구문은 PL/SQL 언어에 대해서도 적용 가능하다. 문장은 몇 라인 이상 계속될 수 있습니다. 문법적인 요소는 공백으로 분리될 수 있습니다.

 

2.1.1 식별자

 식별자는 상수, 변수, 예외, 커서, 커서 변수, SUBPROGRAM, 패키지를 포함하는 PL/SQL 프로그램 항목과 요소를 명명하기 위해 사용됩니다.

 1) 식별자는 30문자까지 포함할 수 있지만 알파벳 문자로 시작해야 합니다.

 2) 블록에서 사용된 테이블의 열 이름과 동일한 이름으로 식별자를 사용할 수 없습니다.

 3) PL/SQL 식별자가 동일 SQL 명령에 있고 열로 동일 이름을 가지고 있다면, 이때 ORACLE은 참조 중인 열로 간주합니다.

 4) 예약어는 더블 인용 부호에 둘러싸여 있지 않으면 식별자로서 사용될 수 없습니다.

 5) 에약어는 읽기 쉽도록 대문자로 사용합니다.

 

2.1.2 구분 문자

 구분 문자는 PL/SQL에 대한 특수한 의미를 가지는 단순 상징이거나 혼합 상징입니다.

 단순 상징

혼합 상징 

 기호

 의미

기호 

의미 

덧셈 연산자 

<> 

관계형 연산자 

뺄셈 연산자 

!= 

관계형 연산자 

곱셈 연산자 

|| 

접속 연산자 

나눗셈 연산자 

-- 

단일 라인 주석 지시자 

관계형 연산자 

/* 

주석 구분 문자 시작 

원격 액세스 지시자 

*/ 

주석 구분 문자 종료 

문자 종결자 

:= 

지정 연산자(치환 연산자) 

 

2.1.3 Literal

 Literal은 식별자(identifier)로 표현되지 않은 숫자, 문자, 문자열, BOOLEAN 값입니다.

 1) 문자 Literal은 PL/SQL 문자 집합 내에서 인쇄 가능한 모든 문자를 포함합니다.

 2) 숫자 Literal은 단순 값(예:-32.5) 또는 과학적인 표기법

 

2.1.4 주석 코드

 주석 코드 각 단계를 문서화하고 디버깅을 돕기 위해 코드에 주석을 기술합니다. 주석이 단일 라인에 있으면 두 개의 대쉬(--)을 기술하면 -뒤에 기술된 것은 주석으로 인식 하고, 주석 범위가 여러 줄이라면 기호 /*와 */ 사이에 주석을 기술 한다. 주석은 철저하게 정보를 제공해야 하고 기능적인 논리 또는 데이터에 대한 어떤 조건 또는 기능을 강요해서는 안됩니다. 좋은 주석은 읽기 쉽게 하고 코드 유지를 위해 매우 중요합니다.

 

2.1.5 PL/SQL 에서 SQL 함수

 1) SQL 에서 이용 가능한 대부분의 함수는 PL/SQL 표현식에서도 유효합니다.

  ① 단일 행 숫자 함수

  ② 단일 행 문자 함수

  ③ 데이터형 변환 함수

  ④ 데이트 함수 그 밖의 함수

 2) 아래 함수는 절차적인 문장에서는 사용 불가능합니다.

  ① GRATEST, LEAST, DECODE.

  ② 그룹 함수(AVG, MIN, MAX, COUNT, SUM, STDDEVE, VARIANCE)는 테이블에서 행 그룹에 적용되므로 PL/SQL 블록에 있는 SQL 문장에서만 이용 가능합니다.

 

2.2 데이터형 변환

 PL/SQL은 데이터형이 문장에서 혼합되었다면 동적으로 데이터형 변환을 시도합니다. 예를 들면 NUMBER값을 CHAR 변수가 지정되었다면 그것이 CHAR 변수에 저장될 수 있도록 하기 위해 PL/SQL은 동적으로 숫자를 문자로 변환 합니다. 문자 표현을 숫자 값으로 나타내는 역의 상황도 적용됩니다. DATE 변수에 대해 문자 값을 지정할 수 있고 역의 상황도 적용됩니다. 혼합된 데이터형이 표현식에서 생성되면 데이터를 전환하기 위해 해당 변환 함수를 사용하여야 합니다.

 

2.2.1 데이터형 변환 함수의 종류

 1) TO_CHAR(value,fmt) : value 를 문자로 전환

 2) TO_DATE(value,fmt) : value를 날짜 형식으로 전환

 3) TO_NUMBER(value,fmt) : value를 숫자로 전환

 

Guidelines

 PL/SQL은 가능한 한 데이터형 변환을 시도하지만 성공은 수행 중인 작업에 달려있다. 명시적으로 데이터의 형 변환을 시도하는 것은 상당히 성능에 영향을 미치고 소프트웨어 버전이 변경되더라도 유효하게 유지될 수 있기 때문에 좋은 프로그램이 될 수 있다.

 

2.3 중첩 블록과 변수 범위

 1) 문장은 실행 명령이 허용하는 곳 어디에서든지 중첩될 수 있습니다.

 2) 중첩 블록은 하나의 문장이 됩니다.

 3) 예외 섹션에서도 중첩 블록을 사용할 수 있습니다.

 4) 객체 범위는 객체를 참조할 수 있는 프로그램 영역 입니다.

 5) 선언된 변수를 실행 섹션에서 참조할 수 있습니다.

 6) 한정시키지 않은 변수는 참조할 수 있는 영역에서 변수를 참조 가능합니다.

  ① 블록은 둘러싸는 블록을 참조할 수 있습니다.

  ② 블록은 둘러싸인 블록을 참조할 수 없습니다.

 

 

2.4 PL/SQL 에서 연산자

 연산자는 논리, 산술, 연결, 연산 제어 명령인 괄호, 지수 연산자가 있다.

 

2.4.1 연산 명령

 표현식에서의 연산은 그것들의 우선 순위에 따라 특별한 순서로 행해 집니다.

우선순위 

연산자 

설명 

 1

 **, MOT

지수 승, 논리 부정 연산자 

 2

+, - 

식별, 부정 연산자 

 3

*, / 

곱셈, 나눗셈 연산자

 4

+, -, || 

덧셈, 뺄셈, 연결 연산자 

 5

=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN  

비교 연산자 

 6

AND 

논리곱 

 7

OR 

논리합 

 

2.4.2 사용 예

 

Guidelines

 NULL 로 작업할 때 아래 규칙을 명심함으로써 몇 가지 일반적인 실수를 피할 수 있습니다.

 1) 관계 연산자로 NULL을 비교하면 항상 NULL이 됩니다.

 2) NULL에 논리 연산자 NOT을 적용하면 항상 NULL이 됩니다.

 3) 조건 제어 문장에서 조건이 NULL이 되면 관련된 문장은 실행되지 않습니다.

 

2.5 프로그래밍 지침 사항

 PL/SQL 블록을 개발할 때 명확한 코드 생성과 유지를 경감하기 위하여 프로그래밍 지침을 수행 합니다.

 

2.5.1 코드 규약

범주 

대소문자 규약 

사용 예 

SQL명령어 

대문자 

SELECT, INSERT, UPDATE 

PL/SQL 키워드 

대문자  

DECLARE, BEGIN, END 

데이터형 

대문자 

NUMBER, VARCHAR2, CHAR 

식별자와 매개변수 

소문자 

v_sal, v_ename, v_job 

데이터베이스 테이블과 열명 

소문자 

emp, dept, salgrade 

 

2.5.2 코드명지정 규약

식별자 

명명 규약 

사용 예 

변수 

v_name 

v_sal 

상수 

c_name 

c_company_name 

커서 

name_cursur 

emp_cursor 

예외 

e_name 

e_too_many 

테이블 형 

name_table_type 

amount_table_type 

테이블 

name_table 

order_total_table 

레코드 형 

name_record_type 

emp_record_type 

레코드 

name_record 

customer_record 

SQL*Plus 치환 매개변수 

p_name 

p_sal 

SQL*plus 전역변수 

g_name 

g_year_sal 

 

2.5.3 코드 들여쓰기

 명확성을 위해 또는 읽기 쉽도록 하기 위해 코드를 각 단계별로 들여씁니다. 구조를 보여주기 위해 Carriage return을 사용합니다.

Posted by 전설의아이
|

1.PL/SQL 개요

 PL/SQL(Procedural Language/SQL)은 최근의 프로그래밍 언어의 특성을 수용한, SQL의 확장이라 할 수 있다. SQL의 데이터 조작(DML)과 질의문(QUERY)을 블록 구조에 절차적 단위(IF,LOOP,FOR 등)로 된 코드를 포함할 수 있으며 절차적 프로그래밍을 가능하게 한 강력한 TRANSACTION 처리 언어이다.

 

1.1 PL/SQL의 장점

 PL/SQL 은 SQL 로는 얻을 수 없는 절차적 언어의 기능을 가지고 있다.

 

1.1.1 프로그램 개발의 모듈화

 1) 블록 내에서 논리적으로 관련된 문장들의 그룹화할 수 있다.

 2) 강력한 프로그램을 작성하기 위해 서브 블록들을 큰 블록에 포함할 수 있다.

 3) 복잡한 문제에 대한 프로그래밍이 적절히 나뉘어진 모듈들의 집합으로 구성된다.

 

1.1.2 식별자 선언

 1) 변수, 상수 등을 선언하고 SQL 과 절차적인 프로그램에서 사용한다.

 2) 데이터베이스의 테이블과 Record를 기반으로 하는 dynamic 한 변수 선언이 가능하다.

 3) 단일형 데이터 타입과 복합형 데이터 타입을 선언할 수 있다.

 

1.1.3 절차적 언어 구조로 된 프로그램 작성

 1) IF문은 조건에 따라 일련의 문장을 실행한다.

 2) LOOP문을 사용하여 일련의 문장을 반복적으로 실행한다.

 3) Explicit Cursor를 이용한 Milti-row 질의 처리한다.

 

1.1.4 ERROR 처리

 1) Exception 처리 루틴을 이용하여 Oracle8 Server 에러를 처리한다.

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

 

1.1.5 성능 향상

 1) PL/SQL은 응용 프로그램의 성능을 향상 시킬 수 있다.

 2) PL/SQL은 여러 SQL 문장을 BLOCK 으로 묶고 한번에 BLOCK 전부를 서버로 전송하기 때문에 통신량을 줄일 수 있다.

 

1.1.6 PL/SQL의 처리

 PL/SQL 로 작성된 Block을 Oracle Server로 보내면 그 안에 있는 PL/SQL Engine 이 SQL문과 Non SQL 문을 구분하여 Non SQL 문은 PL/SQL Engine 내의 Procedurral statement executor가 수행하고 SQL 문은 SQL statement executor가 처리하게 된다. 즉 Non SQL 문은 Client 환경에서 처리되고 SQL 문은 서버에서 실행하게 된다. 따라서 PL/SQL 을 사용하게 되면 서버쪽으로 작업의 양을 줄이게 되므로 Network traffic를 감소시켜 performance를 증가시키는 이점이 있다.

 

1.2 PL/SQL Block 구조

 PL/SQL 은 프로그램을 논리적인 블록으로 나누게 하는 구조화된 블록 언어이다. PL/SQL 블록은 선언부(선택적), 실행부(필수적), 예외 처리부(선택적)로 구성되고 BEGIN과 END는 키워드로 반드시 기술하여야 한다. PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있다. 변수들과 그 외의 식별자를 참조하고 선언함으로써 PL/SQL 블록 내에서 값을 저장하고 변경할 수 있다.

 

기본적인 PL/SQL Block은 세 부분으로 구성된다.

섹션 

설명 

포함 

선언부 

실행부에서 참조할 모든 변수, 상수, CURSOR, EXCEPTION을 선언 

선택 

실행부 

데이터베이스의 데이터를 처리할 SQL문과 PL/SQL 블록을 기술 

필수 

에러 처리부  

실행부에서 에러가 발생했을 때 수행될 문장을 기술 

선택 

 

Guidelines

 1) PL/SQL Block 내에서는 한 문장이 종료할 때마다 세미콜론(;)을 기술한다.

 2) END뒤에 세미콜론(;)을 사용하여 하나의 Block이 끝났다는 것을 명시한다.

 3) PL/SQL Block의 작성은 편집기를 통해 파일로 작성할 수 있고 SQL*Plus에서 바로 작성할 수 있다.

 4) SQL Buffer 에서 PL/SQL을 실행하기 위해 "/"을 사용하며 성공적으로 실행 된다면 PL/SQL procedure successfully completed라는 Message가 출력된다.

 

1.2.1 PL/SQL 블록의 유형

 PL/SQL의 모든 단위는 하나 또는 그 이상의 블록을 포함합니다. 이 블록은 다른 것으로부터 하나로 완전히 분리되어 중첩될 수 있습니다. 기본 단위 (프로시저, 함수, 서브 프로그램, 익명의 블록)는 임의의 수의 중첩된 서브 블록을 포함할 수 있는 논리적인 블록으로 구성된다. 그러므로 하나의 블록은 다른 블록의 작은 부분이 되기도 하고 또는 코드 단위의 전체중 일부가 될 수도 있습니다.

 

가) Anonymous Block(익명 블록)

 이름이 없는 블록을 의미한다. 그것은 실행하기 위해 프로그램 안에서 선언되고 실행 시에 실행을 위해 PL/SQL 엔진으로 전달됩니다. 선행 컴파일러 프로그램과 SQL*Plus 또는 서버 관리자에서 익명의 블록을 내장할 수 있습니다.

 

나) Subprogram(procedure, function)

 Subprogram은 매개변수를 사용할 수 있고 호출할 수 있는 PL/SQL BLOCK이다. Procedure 또는 Function 로 선언될 수 있습니다. 일반적으로 어떤 작업을 수행하기 위해 Procedure을 사용하고 값을 계산하기 위해 Function을 사용합니다. 서버 또는 Application 수준에서 Subprogram을 저장할 수 이습니다. Developer/2000을 사용하여 Application의 일부로써 Procedure와 Function을 선언할 수 있고 필요할 때마다 Trigger를 이용하여 사용할 수 있다.

 

1.2.2 프로그램의 구성

프로그램 구성 

설명 

사용 환경 

익명 블록 

Application에 내장되거나 대화식으로 호출 

모든 PL/SQL 환경 

내장된 Procedure or Function 

매개변수를 받아들일 수 있고 이름을 이용하여 반복적으로 호출할 수 이는 이름이 있는 PL/SQL 블록은 Oracle 서버에 저장된다. 

Oracle Server 

Application Procedure or Function 

매개변수를 받아들일 수 있고 이름을 이용하여 반복적으로 호출할 수 있는 이름이 있는 PL/SQL 블록은 Developer/2000 어플리케이션에 저장되거나 Shared Libraray에 저장된다.

Devleoper/2000 

Package 

관련된 Procedure or Function을 묶어 이름을 붙인 PL/SQL 모듈입니다. 

Oracle Server와 Devleoper/2000 

Database Trigger 

Database Table와 관련된 DML 명령문에 의해 Trigger 될 때 자동적으로 실행됩니다. 

Oracle Server 

Application Trigger 

PL/SQL 블록은 Application Event와 관련되고 자동적으로 실행됩니다. 

Devleoper/200 

 

1.2.3 PL/SQL 환경

 PL/SQL 은 별개의 Oracle 제품이 아니라 Oracle8 서버와 다른 Oracle TOOL에 이용되고 있는 프로그래밍 언어이다. PL/SQL 의 블록은 Oracle8 서버나 툴에 내장되는 PL/SQL 엔진에 전달되어 처리된다. 사용하는 엔진은 PL/SQL 이 수행되는 곳에 따라 다르다.

 

가) Oracle8 서버에서의 PL/SQL 엔진

 Pro*프로그램, ISER-EXIT, SQL*Plus, 또는 Server Manager 에서 PL/SQL 블록을 사용하면 Oracle8 서버의 PL/SQL 엔진이 처리한다. 그리고 블록에 있는 SQL 을 별도의 문장으로 분리하여 SQL 문 실행기로 보낸다. 이는 응용 프로그램의 블록을 한 번에 Oracle8 서버에게 보낸다는 뜻이며 따라서 client/server 환경하에서 많은 성능 향상을 기대할 수 있다.

 

나) Oracle 툴에서의 PL/SQL

 Developer/2000을 포함한 많은 Oracle 툴은 Oracle7 서버에 있는 엔진과는 별도로 자체 PL/SQL 엔진을 갖고 있다. 이 엔진이 SQL 분장을 찾아서 Oracle7 서버의 SQL 문 실행기로 보내고, PL/SQL engine 은(데이터베이스라기보다는 이미 클라이언트 환경에 있는) 응용 프로그램에 대해 지역적인 데이터를 처리한다. 이로써 Oracle7 서버의 대한 작업량과 요구되는 메모리 커서의 수를 줄인다.

 

참고

  Developer/2000 응용 프로그램의 부분으로 선언된 프로시저와 함수의 일반적인 구조는 동일하더라도 데이터베이스에 저장된 것과는 다르다. Stored Sibprogram은 데이터 베이스 객체이고 데이터 사전에 저장되며 여러 응용 프로그램이 사용할 수 있다. Application subprogram 그 응용 프로그램의 지역적인 PL/SQL 엔진에 블록을 전달한다. 작업은 서버 쪽이 아닌 응용 프로그램 쪽에서 수행된다.

 

1.3 SQL*Plus로 하는 일

 1) SQL 명령과 PL/SQL 블록의 입력, 편집, 저장, 검색 및 실행을 해준다.

 2) 데이터 베이스의 데이터 access를 가능하게 한다.

 3) 계산수행, query 결과를 보고서 양식으로 출력한다.

 4) SQL 데이터베이스 언어와 절차적 언어의 확장인 PL/SQL 을 SQL*Plus 프로그램을 이용하여 사용할 수 있다.

 5) SQL*Plus 는 SQL 명령과 PL/SQL 블럭을 조작하는 등 많은 부가적인 작업을 수행할 수 있게 해 준다.

'Legend 개발자 > Oracle' 카테고리의 다른 글

No.017 PL/SQL 쿼리 [2017-06-14]  (0) 2017.06.19
No.016 PL/SQL 변수 [2017-06-14]  (0) 2017.06.16
No.0?? Entity Relationship Diagram [2017-06-14]  (0) 2017.06.15
No.014 사용자 [2017-06-14]  (0) 2017.06.14
No.013 인덱스 [2017-06-14]  (0) 2017.06.14
Posted by 전설의아이
|

ERD?

- 1976년 Chen에 의해 제안된 E-R 모델은 개념적 모델에서 가장 일반적으로 사용되고 있는 모델로서 그 모델이 지니고 있는 단순성 때문에 현재 광범위한 응용 분야에서 사용

- 데이터에 대해 관리자, 사용자, 프로그래머들이 서로 다르게 인식되고 있는 뷰들을 하나로 통합할 수 있는 단일화된 설계안

- 서로 다른 뷰들을 충족시킬 수 있는 데이터 처리와 제약조건 등의 요구사항 들을 정의

- 최종 사용자의 관점에서 데이터베이스를 그림형태로 묘사한 것으로서, 세 개의 기본요소인 개체, 관계, 그리고 속성으로 구성

 

구성요소

Entity

- 단순히 우리가 데이터 수집의 대상이 되는 정보 세계에 존재하는 사물(thing)

- 개념적 개체 : 장소, 사건 등과 같은 눈에 보이지 않는 것

- 물리적 개체 : 물건 등과 같은 눈에 보이는 것, 현실 세계에 존재하는 사물

- 직사각형으로 나타내고 이름을 붙임

 

Weak Entity

- 그 개체의 키가 자체적으로 존재하지 않음

- Weak entity는 관계를 맺는 다른 개체에 있는 키를 계승 받음

 

Attribute

- 객체의 구조를 나타내는 특성들을 의미

 ①simple attribute   ②Composite attribute

- 직사각형에 실선으로 연결된 타원형으로 표현

 

Relationship

- 개체들 사이에 존재하는 연관성을 의미

 ①Unary relationship  ②Binary relationship  ③Ternary relationship

- 두 개체들을 연결하는 실선들이 있고 그 사이에 마름모 모양의 표시

 

Connectivity

- 한 개체가 관계를 통하여 다른 개체와 관련되는 개체들의 수

 ①One to one  ②One to many  ③Many to many

 

Cardinality

- 관계에 참여하는 하나의 개체에 대해 다른 개체형에서 몇개의 개체가 참여하는지를 나타냄

 

설계과정

- ERD 설계 과정은 모델링의 대상이 되는 조직체의 담당자(고객)와 인터뷰를 하여 데이터를 수집 및 분석한 결과인 데이터베이스 요구사항을 가지고 시작

- 기본이 되는 개체, 관계, 속성들을 규명

- 설계를 해나가는 과정에서 새로운 개체, 관계, 속성 등의 요소들이 발견되었다면 이를 ERD에 추가해야 하며, 또한 불필요한 요소들이 발견되었다면 이를 ERD 에서 삭제해야 하는 반복적인 작업

- 설계자나 고객의 요구사항이 완전히 표현되었다고 볼 때까지 반복

 

1. 데이터베이스 설계의 단계

 아래 질문에 대한 해결방안을 찾아가는 과정이 DB 설계 단계이다.

- 중요한 데이터는 무엇인가?

- 데이터를 어떻게 표현할 것인가?

- 데이터를 어디에 저장할 것인가?

 

2. ERD 작성(1)

- 데이터 요구사항 수집과 분석

 ①업무 기술서 검토

 ②현업 장표 검표

 ③현업 업무 전문가와의 면담

 ④기 구축된 시스템 산출물 검토

- 요구사항 정리(예)

 ①여러 학과가 있다.

 ②각 학과에 대해서 번호와 이름이 있다.

 ③각 학과는 여러 명의 교수들이 소속되며, 각 교수에 대하여 번호와 이름이 있다.

 ④각 교수는 여러 과목을 강의하며, 각 과목에 대해서 번호, 이름, 학점이 있다.

 ⑤각 학과는 여러 명의 학생들이 소속된다.

 ⑥각 학생에 대하여 번호, 이름, 주소, 학년, 전화번호가 있다.

 ⑦각 학생은 여러 번 등록을 할 수 있으며 등록 시 번호와 등록 일이 있다.

 ⑧각 학생은 등록 후 여러 과목을 수강하며 중간, 기말 성적이 기록된다.

 

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

 

테이블 설계서

1. 정의

 논리 설계 단계에서는 대략의 데이터 크기를 산정하여 소요 디스크량을 추정하고 지역 분산시의 기초 자료로 사용하기 위하여, 지역별 Raw 데이터 크기, 월증가량, 디스크 보관 주기 등을 산출해낸다.

 물리 설계 단계에서는 이러한 내용을 토대로 하여 운영 환경에 필요한 실제 디스크 소요량을 산정하고 디스크 상의 I/O(Input/Output) 부하 분산을 위한 기초 자료로 이용할 수 있도록 테이블 크기, 테이블스페이스 크기 등을 파악하며, 이를 근거로 실제로 디스크에 할당하는 작업을 수행한다.

 

2. 절차

 절차

내용 

참조 

테이블스페이스 설계 

1) 테이블별 테이블스페이스 결정

2) DB파일 구성 및 디스크 할당 

테이블스페이스 설계서 

테이블 설계 

1) 데이터 건수와 길이 산정

2) 테이블 총크기 산정

3) 테이블의 파라미터 값 결정 

테이블 용량 산정서

테이블 설계서 

인덱스 설계 

1) 인덱스 총크기 산정

2) 인덱스 파라미터 값 결정 

인덱스 용량 산정서

인덱스 설계서 

파티션 설계 

1) 테이블 선정

2) 파티션 키 선정

3) 파티션 개수 결정

4) 인덱스 유형 선택 

파티션 설계서 

DDL 생성 및 관리 

1) 테이블/인덱스 DDL

2) 테이블스페이스 DDL 

DDL script 

 

3. 테이블 설계

3.1 데이터 건수 및 용량 산정

 1) 데이터 건수와 길이 산정

 - 테이블 크기를 산정하기 위한 양식을 업무 담당자에게 배포하여 데이터 건수와 산정근거를 조사한다.

업무명 

테이블명 

초기건수 

월발생건수 

보관기간 

 

 

 

 

 

 - 데이터 없이 빈 테이블을 구성하여 SQL문을 통하여 정확한 테이블별 row의 길이를 구할 수 있다.

 

 2) 테이블 총크기 산정

 - 조사된 데이터 건수와 길이를 바탕으로, 계산 공식이 반영된 Excel 양식을 이용하여 자동으로 산정한다.

 - Row 길이에 헤더 사이즈를 감안하여 평균 길이를 구한다.

 - 30% 정도의 여유공간을 감안하여 테이블의 총크기를 구한다.

테이블명 

최종길이 

초기건수 

월발생건수 

보관기간 

총데이터건수 

총크기 

 

 

 

 

 

 

 

 

3.2 테이블의 파라미터 값 결정

 - 파라미터 값 결정

  <INITIAL 결정>

 INITIAL

INITIAL 파라미터는 테이블/ 인덱스 모두 동일하게 1M를 지정한다. 

 

  <PCTFREE 결정>

Scenario 

Setting 

Insert, Update, Delete의 발생이 비슷하며, update시 길이의 변화 적음 

PCTFREE = 10 

Update가 많으며, Row의 length가 증가하는 Update 대부분 포함 

PCTFREE = 20 

Insert, Delete 많고, Update시 row length의 변화 거의 없음 

PCTFREE = 5 

채번테이블 

PCTFREE = 90 

 

  <기타 파라미터>

 파라미터

설정 기준 

MINEXTENT 

INITIAL 파라미터 값을 Data의 Extent가 일어나지 않을 크기로 설정하였으므로 1로 설정한다. 

MAXEXTENT 

Unix의 O/S에 따른 최대 MAXEXTENT 파라미터 값을 지정한다.

Default로 설정하면 무난하다. 

INITRANS 

- 다중 트랜잭션이 동시에 동일한 Data block에 있는 행을 액세스 할 때 block의 각 트랜잭션 입력 항목에 대해 영역을 미리 할당해 놓는 것으로 동시 트랜잭션 수를 고려하여 적절한 값을 설정한다.

- Default : 테이블은 1, 클러스터와 인덱스는 2

- 마스터성 테이블이나 트랜잭션이 다량으로 발생하는 테이블은 3. (향후 조정)

BUFFER_POOL

- default (시스템의 기본값)

- keep(자주 사용하는 코드성 테이블의 경우) 

MAXTRANS 

- 동시에 Data block의 데이터를 사용할 수 있는 트랜잭션의 입력 항목 수를 제한하는 것으로 너무 낮게 값을 설정하면 동시 트랜잭션이 이 값을 초과 할 경우 영역 할당을 못 받은 트랜잭션은 다른 트랜잭션의 처리가 끝날 때까지 기다려야 한다.

- Default 값(255)으로 설정. 

 

 

 

 

 

 

 

 

'Legend 개발자 > Oracle' 카테고리의 다른 글

No.016 PL/SQL 변수 [2017-06-14]  (0) 2017.06.16
No.015 PL/SQL 개요 [2017-06-14]  (0) 2017.06.15
No.014 사용자 [2017-06-14]  (0) 2017.06.14
No.013 인덱스 [2017-06-14]  (0) 2017.06.14
No.012 VIEW [2017-06-07]  (0) 2017.06.12
Posted by 전설의아이
|

1. 사용자 접근 제어

 다중 사용자 환경에서는 데이터베이스 액세스와 사용의 보안 유지가 요구 됩니다.

 1) 데이터베이스 액세스 제어

 2) 데이터베이스에서 특정 객체에 대한 액세스 제공

 3) 오라클 데이터 사전으로 주어지고 받는 Privilege 확인

 4) 데이터베이스 객체에 대한 동의어 생성

 

1.1 데이터베이스 보안의 두 범주

1.1.1 시스템 보안

 사용자에 의해 허용된 시스템 작업 같은 시스템 수준에서의 데이터베이스의 액세스와 사용을 규정합니다.

 1) 사용자 명

 2) 사용자의 비밀 번호

 3) 사용자에게 할당된 디스크 공간

 

1.1.2 데이터 보안

 객체에 대해 사용자가 할 수 있는 작업을 규정합니다.

 

1.2 사용자 생성

 DBA는 CREATE USER 문장을 사용하여 사용자를 생성 합니다. 사용자는 생성성 후 어떠한 권한도 가지지 않습니다. DBA는 이때 그 사용자에게 여러 권한을 부여 합니다. 이 권한은 데이터베이스 수준에서 사용자가 할 수 있는 것이 무엇인가를 결정 합니다.

 

1.2.1 Syntax

 

문제 1) 사용자 명은 COm, 패스워드는 COM인 사용자를 생성하고 CONNECT, RESOURCE 권한을 부여하여라.

 

1.3 권한

 권한은 특정 SQL 문장을 실행하기 위한 권한입니다. 데이터베이스 관리자는 데이터베이스와 그 객체에 대한 액세스를 사용자에게 부여하는 능력을 가진 상급 사용자 입니다. 사용자는 데이터베이스에 액세스하기 위해 system privilege 가 필요하고 데이터베이스에서 객체의 내용을 조작하기 위해 object privilege가 필요합니다. 사용자는 관련 권한들의 이름있는 그룹인 role 이나 다른 사용자에게 추가적으로 권한을 부여하기 위해 권한을 가질 수 있습니다.

 

참고

 스키마는 테이블, 뷰, 시퀀스 같은 객체의 모음입니다. 스키마는 데이터베이스 사용자에 의해 소유되고 사용자와 동일 이름을 가집니다.

 

1.3.1 시스템 권한

 1) 사용자와 ROLE에 대해 부여할 수 있는 시스템 권한의 종류는 80개 이상이 있다.

 2) 시스템 권한은 주로 DBA가 부여한다.

 3) DBA는 상급의 시스템 권한을 가집니다.

  ① 새로운 사용자 생성(CREATE USER)

  ② 사용자 제거(DROP USER)

  ③ 테이블 제거(DROP ANY TABLE)

  ④ 테이블 백업(BACKUP ANY TABLE)

 

가) Syntax

 system_privilege    시스템 권한

 user_name           사용자 명

 WITH ADMIN OPTION 받은 시스템 권한을 다른 사용자에게 부여할 수 있는 권한

 

나) 시스템 권한의 종류

 

시스템 권한  

허가된 내용(Grantee: 권한을 받은 사용자) 

 ALTER ANY TABLE

Grantee가 Schema에 있는 Index를 Alter 할 수 있다. 

 ALTER ANY PROCEDURE

Grantee가 Schema에 내장 프로시저, 함수, 또는 패키지 바꾸기를 할 수 있다.

 ALTER ANY ROLE

Grantee가 데이터베이스에서 역할 바꾸기를 할 수 있다.

 ALTER ANY TABLE

Grantee가 Schema에서 TABLE이나 VIEW를 바꾸도록 할 수 있다.

 ALTER ANY TRIGGER

Grantee가 Schema에서 데이터베이스 TRIGGER를 활성화, 비활성화 또는 Compile하게 할 수 있다.

 ALTER DATABASE

Grantee가 데이터베이스 바꾸기를 허용한다.

 ALTER USER

Grantee가 사용자 바꾸기를 할 수 있다. 이 권한은 Grantee가 다른 사용자의 Password나 확인 방법을 바꾸도록 권한을 주고 DEFAULT TABLESPACE, TEMPORARY TABLESPACE, PROFILE, QUITA의 양을 바꿀 수 있도록 한다.

 CREATE ANY INDEX

Grantee가 어떤 Schema에서나 테이블에 인덱스 만들기를 허용한다.

 CREATE ANY PROCEDURE

Grantee가 어떤 Schema에서 내장 프로시저, 함수, 패키지를 만들 수 있도록허용한다.

 CREATE ANY TABLE

Grantee가 어떤 Schema 에서나 테이블을 만들 수 있도록 허용한다.

 CREATE ANY TRIGGER

Grantee가 어떤 Schema 에서나 테이블과 연관된 Schema에서 데이터베이스 트리거를 만들 수 있도록 허용한다.

 CREATE ANY VIEW

Grantee가 어떤 Schema에서나 VIEW를 만들 수 있도록 허용한다.

 CREATE PROCEDURE

Grantee가 자체 Schema에서 내장 프로시저, 함수, 패키지를 만들 수 있도록 허용한다.

 CREATE PROFILE

Grantee가 PROFILE을 만들 수 있도록 허용한다.

 CREATE ROLE

Grantee가 ROLE을 만들 수 있도록 허용한다.

 CREATE SYNONTM

Grantee가 자체 Schema에서 시너임을 만들 수 있도록 허용한다.

 CREATE TABLE

Grantee가 자체 Schema에서 테이블을 만들 수 있도록 허용한다.

 CREATE TRIGGER

Grantee가 자체 Schema에서 트리거를 만들 수 있도록 허용한다.

 CREATE USER

Grantee가 사용자를 만들 수 있도록 허용한다.

 CREATE VIEW

Grantee가 자체 Schema에서 VIEW을 만들 수있도록 허용한다.

 DELETE ANY TABLE

Grantee가 어떤 Schema에서 테이블의 자료를 삭제할 수 있도록 허용한다.

 DROP ANY INDEX

Grantee가 어떤 Schema에서나 인덱스를 삭제할 수 있다.

 DROP ANY PROCEDURE

Grantee가 어떤 Schema에서나 내장 프로시저, 함수, 패키지를 삭제할 수 있도록 허용한다.

 DROP ANY ROLE

Grantee가 ROLE을 삭제하도록 허용한다.

 DROP ANY SYNONYM

Grantee가 어떤 Schema에서나 시너임을 샂게할 수 있도록 허용한다.

 DROP ANY TABLE

Grantee가 어떤 Schema에서나 테이블을 삭제할 수 있도록 허용한다.

 DROP ANY TRIGGER

Grantee가 어떤 Schema에서나 데이터베이스 트리거를 삭제할 수 있도록 허용한다.

 DROP ANY VIEW

Grantee가 어떤 Schema에서나 VIEW를 삭제할 수 있도록 허용한다.

 DROP USER

Grantee가 사용자를 삭제할 수 있도록 허용한다.

 EXECUTE ANY PROCEDURE

Grantee가 어떤 Schema에서나 프로시저, 함수, 패키지르 실행할 수 있도록 허용한다.

 TRANSACTION

Local Database에서 자체의 불안정한 분산 Transaction 의 BACK을 허용한다.

 GRANT ANY PRIVILEGE

Grantee가 시스템 권한을 주는 것을 허용한다.

 GRANT ANY ROLE

Grantee가 데이터베이스에서 어떠한 ROLE이라도 GRANT 할 수 있는 권한을 허용한다.

 INSERT ANY TABLE

Grantee가 어떠한 Schema에서나 테이블과 VIEW에 자료를 삽입할 수 있도록 허용한다.

 LOCK ANY TABLE

Grantee가 어떤 Schema에서나 테이블과 VIEW에 LOCK을 걸도록 허용한다.

 SELECT ANY SEQUENCE 

Grantee가 어떤 Schema에서나 시쿼스를 참조할 수 있도록 허용한다.

 SELECT ANY TABLE

Grantee가 어떤 Schema에서나 테이블, VIEW, Snapshot을 참조할 수 있도록 허용한다.

 UPDATE ANY

Grantee가 테이블에서 행을 수정하도록 허용한다.

 

Grantee Schema에 내장 프로시저,함수,또는 패키지 바꾸기를 할 수 있다.

ALTER ANY ROLE

Grantee가 데이터베이스에서 역할 바꾸기를 할 수 있다.

ALTER ANY TABLE

Grantee Schema에서 TABLE이나 VIEW를 바꾸도록 할 수 있다.

ALTER ANY TRIGGER

Grantee Schema에서 데이터베이스 TRIGGER를 활성화,비활성화 또는 Compile 하게할 수 있다.

ALTER DATABASE

Grantee가 데이터베이스 바꾸기를 허용한다.

ALTER USER

Grantee가 사용자 바꾸기를 할 수 있다. 이 권한은 Grantee가 다른 사용자의 Password나 확인 방법을 바꾸도록 권한을 주고 DEFAULT TABLESPACE, TEMPORARY TABLESPACE, PROFILE, QUOTA의 양을 바꿀 수 있도록 한다.

CREATE ANY INDEX

Grantee가 어떤 Schema에서나 테이블에 인덱스 만들기를 허용한다.

CREATE ANY PROCEDURE

Grantee가 어떤 Schema에서 내장 프로시저,함수,패키지를 만들 수 있도록 허용한다.

CREATE ANY TABLE

Grantee가 어떤 Schema에서나 테이블을 만들 수 있도록 허용한다.

CREATE ANY TRIGGER

Grantee가 어떤 Schema에서나 테이블과 연관된 Schema에서 데이터베이스 트리거를 만들 수 있도록 허용한다.

CREATE ANY VIEW

Grantee가 어떤 Schema에서나 VIEW를 만들 수 있도록 허용한다.

CREATE PROCEDURE

Grantee가 자체 Schema에서 내장 프로시저,함수,패키지를 만들 수 있도록 허용한다.

CREATE PROFILE

Grantee PROFILE을 만들 수 있도록 허용한다.

CREATE ROLE

Grantee ROLE을 만들 수 있도록 허용한다.

CREATE SYNONYM

Grantee가 자체 Schema에서 시너임을 만들 수 있도록 허용한다.

CREATE TABLE

Grantee가 자체 Schema에서 테이블을 만들 수 있도록 허용한다.

CREATE TRIGGER

Grantee가 자체 Schema에서 트리거를 만들 수 있도록 허용한다.

CREATE USER

Grantee가 사용자를 만들 수 있도록 허용한다.

CREATE VIEW

Grantee가 자체 Schema에서 VIEW을 만들 수 있도록 허용한다.

DELETE ANY TABLE

Grantee가 어떤 Schema에서 테이블의 자료를 삭제할 수 있도록 허용한다.

DROP ANY INDEX

Grantee가 어떤 Schema에서나 인덱스를 삭제할 수 있다.

DROP ANY PROCEDURE

Grantee가 어떤 Schema에서나 내장 프로시저,함수,패키지를 삭제할 수 있도록 허용한다.

DROP ANY ROLE

Grantee ROLE을 삭제하도록 허용한다.

DROP ANY SYNONYM

Grantee가 어떤 Schema에서나 시너임을 삭제할 수 있도록 허용한다.

DROP ANY TABLE

Grantee가 어떤 Schema에서나 테이블을 식제할 수 있도록 허용한다.

DROP ANY TRIGGER

Grantee가 어떤 Schema에서나 데이터베이스 트리거를 삭제할 수 있도록 허용한다.

DROP ANY VIEW

Grantee가 어떤 Schema에서나 VIEW를 삭제할 수 있도록 허용한다.

DROP USER

Grantee가 사용자를 삭제할 수 있도록 허용한다.

EXECUTE ANY PROCEDURE

Grantee가 어떤 Schema에서나 프로시저,함수,패키지를 실행할 수 있도록 허용한다.

TRANSACTION

Local Database에서 자체의 불안정한 분산 Transaction BACK을 허용한다.

GRANT ANY PRIVILEGE

Grantee가 시스템 권한을 주는 것을 허용한다.

GRANT ANY ROLE

Grantee가 데이터베이스에서 어떠한 ROLE이라도 GRANT할 수 있는 권한을 허용한다.

INSERT ANY TABLE

Grantee가 어떠한 Schema에서나 테이블과 VIEW에 자룔를 삽입할 수 있도록 허용한다.

LOCK ANY TABLE

Grantee가 어떤 Schema에서나 테이블과 VIEW LOCK을 걸도록 허용한다.

SELECT ANY SEQUENCE

Grantee가 어떤 Schema에서나 시퀀스를 참조할 수 있도록 허용한다.

SELECT ANY TABLE

Grantee가 어떤 Schema에서나 테이블,VIEW, Snapshot을 참조할 수 있도록 허용한다.

UPDATE ANY

Grantee가 테이블에서 행을 수정하도록 허용한다.



출처: http://rahxephon.tistory.com/396 [[RahXePhon] 하쿠나 마타타~]

문제 2) SCOTT에게 CREATE ROLE 권한을 부여하여라.

 

1.3.2 시스템 권한 최소

 REVOKE 명령으로 시스템 권한을 취소할 수 있다. WITH ADMIN OPTION을 통해 부여된 권한은 취소되지 않는다.

 

가) Syntax

 

문제 3) SCOTT에게 부여된 CREATE ROLE권한을 취소하여라.

 

Guidelines

 사용자가 WITH ADMIN OPTION으로 권한을 부여 받았다면 그 사용자는 WITH ADMIN OPTION으로 권한을 부여해줄 수 있어 수여자 간의 긴 체인이 가능하지만 소유자가 다른 사용자에게 부여한 권한을 취소하면 모든 권한을 연이어 취소되지 않는다.

 

1.3.3 객체 권한

 1) 객체 권한은 객체마다 다양하다.

 2) 객체 소유자는 객체에 대한 모든 권한을 가지고 있다.

 3) 소유자는 사용자 객체에 대한 특정 권한을 제공할 수 있습니다.

 

주의

 DBA는 일반적으로 시스템 권한을 할당합니다. 객체를 소유한 모든 사용자는 객체 권한을 부여할 수 있습니다. WITH GRANT OPTION으로 부여 받은 권한은부여자에 의해 다른 사용자와 ROLE에게 다시 부여될 수 있습니다. WITH GRANT OPTION으로 테이블을 질의할 수 있고 테이블에 행을 추가할 수 있도록 해 줍니다. 테이블의 소유자는 PUBLIC 키워드를 사용하여 모든 사용자에게 액세스 권한을 부여할 수 있습니다.

객체 권한  

TABLE 

VIEW 

SEQUENCE 

PROCEDURE 

SANPSHOT 

ALTER 

♣ 

 

 

 

DELETE

♣ 

 

 

 

EXECUTE

 

 

 

 

INDEX

 

 

 

 

INSERT

 

 

 

REFERENCES

 

 

 

 

SELECT

 

UPDATE

 

 

 

 

나) OBJECT 권한의 종류

 

OBJECT 권한 

허가된 내용(Grantee:권한을 받은 사용자) 

ALTER

Grantee가 OBJECT에 대해 ALTER할 수 있도록 허용한다. 

AUDIT 

Grantee가 OBJECT에 대해 감사할 수 있도록 허용한다. 

COMMENT 

Grantee가 OBJECT에 대해 COMMENT할 수 있도록 허용한다. 

DELETE 

Grantee가 OBJECT에 대해 자료를 삭제할 수 있도록 허용한다. 

GRANT 

Grantee가 OBJECT에 대해 GRANT할 수 있도록 허용한다. 

INDEX 

Grantee가 OBJECT에 대해 인덱스를 생성할 수 있도록 허용한다. 

INSERT 

Grantee가 OBJECT에 대해 자료를 삽입할 수 있도록 허용한다. 

LOCK 

Grantee가 OBJECT에 대해 Locking할 수 있도록 허용한다. 

RENAME 

Grantee가 OBJECT에 대해 이름을 변경할 수 있도록 허용한다. 

SELECT 

Grantee가 OBJECT에 대해 자료를 조회할 수 있도록 허용한다. 

UPDATE 

Grantee가 OBJECT에 대해 자료를 갱신할 수 있도록 허용한다. 

REFERENCES 

Grantee가 OBJECT에 대해 자료를 참조할 수 있도록 허용한다. 

EXECUTE

Grantee가 프로시저, 함수, 패키지에 대해 실행할 수 있도록 허용한다. 

 

문제 4) 앞에서 생성한 COM 사용자에게 SCOTT이 소유하고 있는 EMP 테이블을 조회하고 삽입할 수 있는 권한을 부여하여라.

 

1.3.4 객체 권한 철회

 다른 사용자에게 부여된 권한을 철회하기 위하여 REVOKE 문장을 사용합니다. WITH GRANT OPTION을 통해 다른 사용자에게 부여된 권한도 같이 취소된다.

 

가) Syntax

 CASCADE CONSTRAINTS REFERENCES    권한을 사용하여 만들어진 객체에 대한 참조 무결성 제약 조건을

                                                       제거하기 위해 사용한다.

 

문제 5) 앞에서 EMP 테이블에 부여한 SELECT 권한을 COM에게서 취소하여라.

 

Guidelines

 사용자가 WITH GRANT OPTION 으로 권한을 부여 받았다면 그 사용자는 WITH GRANT OPTION으로 권한을 부여해줄 수 있어 수여자 간의 긴 체인이 가능하지만 원형 부여는 허용되지 않는다. 소유자가 다른 사용자에게 부여한 권한을 취소하면 모든 권한을 연이어 취소된다.

 

1.3.5 부여된 권한 확인

 데이터 사전 테이블

설 명 

ROLE_SYS_PRIVS 

ROLE에게 부여된 시스템 권한 

ROLE_TAB_PRIVS

ROLE에게 부여된 테이블 권한

USER_ROLE_PRIVS 

사용자에 의해 액세스 가능한 ROLE 

USER_TAB_PRIVS_MADE 

사용자가 부여된 객체 권한 

USER_TAB_PRIVS_RECO 

사용자에게 부여된 객체 권한

USER_COL_PRIVS_MADE

사용자가 객체의 열에 대해 부여한 객체 권한

USER_COL_PRIVS_RECO 

특정 열에 대해 사용자에게 부여된 객체 권한

 

문제 6) SCOTT에게 할당되어 있는 SYSTEM ROLE를 확인 하여라.

 

1.4 ROLE의 개념

 ROLE은 사용자에게 허가할 수 있는 관련된 권한들의 그룹이다. 이러한 ROLE을 이용하면 권한 부여와 회수를 쉽게 할 수 있다. 한 사용자가 여러 ROLE을 엑세스할 수 있고 다른 여러 사용자에게 같은 ROLE을 지정할 수있다. ROLE을 생성하기 위해서는 CREATE ROLE 권한 또는 DBA 권한이 필요하다.

 

1.4.1 ROLE의 작성과 지정 순서

 1) 먼저 DBA가 ROLE을 생성한다.

 2) ROLE에 권한을 지정한다.

 3) 사용자에게 ROLE을 부여한다.

 

1.4.2 Syntax

 role_name        생성되는 ROLE의 이름

 

문제 7) LEVEL 1이라는 ROLE을 생성하여라.

 

문제 8) LEVEL 1 이라는 ROLE 에 CREATE SESSION, CREATE TABLE, CREATE VIEW의 권한을 부여하여라. 

 

문제 9) TEST1/TIGER1 과 TEST2/TIGER2 라는 사용자를 생성하여라

 

문제 10) TEST1, TEST2에 LEVEL1이라는 ROLE를 부여하여라.

 

'Legend 개발자 > Oracle' 카테고리의 다른 글

No.015 PL/SQL 개요 [2017-06-14]  (0) 2017.06.15
No.0?? Entity Relationship Diagram [2017-06-14]  (0) 2017.06.15
No.013 인덱스 [2017-06-14]  (0) 2017.06.14
No.012 VIEW [2017-06-07]  (0) 2017.06.12
No.011 SEQUENCE [2017-06-07]  (0) 2017.06.12
Posted by 전설의아이
|

1. 인덱스(INDEX)의 개요

 Oracle8 Server의 인덱스는 포인터를 사용하여 행의 검색을 촉진시킬 수 있는 스키마 객체입니다. 인덱스는 명시적 또는 자동적으로 생성 할 수 있으며 Column에 대한 인덱스가 없으면 한 테이블 전체를 검색하게 될 것입니다. 인덱스는 QUERY 이나 COumn의 집합에 값이 유일하도록 하기 위해 인덱스를 사용할 수 있다.

 

1.1 인덱스의 특징

 1) 인덱스는 테이블의 값을 빠르게 액세스 하도록 하는 데이터베이스 객체이다.

 2) 데이터를 빠르게 찾기 위한 B*TREE을 써서 디스크 입출력 횟수를 줄인다.

 3) Oracle8 Server가 인덱스를 자동적으로 사용하고 유지 보수 한다.

 4) 인덱스를 만들면 사용자가 직접 조작할 필요가 없게 된다.

 5) 인덱스는 논리적으로도 물리적으로도 테이블과는 독립적이다.

 6) 언제든지 생성하거나 삭제할 수 있으며 이는 테이블이나 다른 인덱스에 영향을 주지 않는다는 의미이다.

 

참고

 B*INDEX에 대하여

 1) 어떤 행에 대한 액세스 횟수도 동일하게 하는 이진의 균형 탐색 TREE이다.

 2) 행이 테이블 시작이나 중간, 또는 끝에 있어도 거의 같은 홋수 내에 지정된 값을 액세스 하는 효율적인 방법이다.

 3) Oracle8 Server가 만드는 인덱스는 TREE에 정렬된여러 개의 저장소 PAGE로 구성된다.

 4) 각 페이지는 키 값이 데이터 자체를 가리킬 때까지 구조의 아래 쪽으로 향하는 페이지에 대한 포인터와 일련의 키을 갖고있다.

 

1.2 인덱스 생성 방법

1.2.1 자동 생성

 테이블 정의에 PRIMARY KEY 나 UNIQUE 제약 조건을 정의할 때 unique 인덱스가 자동적으로 생성된다.

 

1.2.2 사용자가 생성

 행에 대한 액세스 속도를 빠르게 하기 위해 column에 non_unique 인덱스 또는 unique 인덱스를 생성한다.

 

1.3 인덱스의 종류

 종류

설명 

Unique index 

지정된 열의 값이 고유함을 보장 

Non-unique index 

데이터를 검색할 때 가장 빠른 결과를 보장 

Single column index 

하나의 열만 인덱스에 존재 

Composite index 

여러 열을 결합하여 하나의 인덱스를 생성(16개의 열까지) 

 

1.4 사용자가 인덱스 생성

 CREATE INDEX 문장을 이용함으로써 하나 이상의 열의 인덱스를 생성합니다.

 

1.4.1 Syntax

 

1.4.2 인덱스 생성을 위한 지침

가) 많은 것이 항상 더 좋은 것은 아니다.

 테이블의 많은 인덱스가 질의의 스피드 향상을 꼭 의미하는 것은 아닙니다. 인덱스를 가지고 있는 테이블에 대한 각 DML 작업은 인덱스도 갱신되어야 함을 의미합니다. 많은 인덱스가 테이블과 관련되어 있으며, ORACLE SERVER은 DML 후에 모든 인덱스를 갱신하기 위해 더 많은 노력이 필요하게 됩니다.

 

나) 언제 인덱스를 생성하는가?

 1) 열은 WHERE 절 또는 조인 조건에서 자주 사용됩니다.

 2) 열은 광범위한 값을 포함합니다.

 3) 열은 많은 수의 null 값을 포함합니다.

 4) 둘 또는 이상의 열은 WHERE 절 또는 조인 조건에서 자주 함께 사용됩니다.

 5) 테이블은 대형이고 대부분의 질의들은 행의 2~4%보다 적게 읽어 들일 것으로 예상됩니다.

 

다) 언제 인덱스를 생성해서는 안되는가

 1) 테이블이 작다.

 2) 열의 질의의 조건으로 자주 사용되지 않는다.

 3) 대부분의 질의들은 행의 2~4%이상을 읽어 들일 것으로 예상된다.

 4) 테이블은 자주 갱신됩니다. 테이블에 하나 이상 인덱스를 가지고 있다면 테이블을 엑세스하는 DML 문장은 인덱스의 유지 때문에 상대적으로 더 많은 시간이 걸리게 됩니다.

 

참고

 유일성을 강행하기를 원한다면, 테이블 정의에 유일한 제약 조건을 정의해야 함을 명심하십시오. 이때 유일한 인덱스는 자동으로 생성됩니다.

 

문제 1) EMP 테이블에서 ename 열에 인덱스를 생성하여라

 

1.5 인덱스 생성 확인

 1) USER_INDEXES는 인덱스 이름과 고유성 정보를 가지고 있다.

 2) USER_IND_COLUMNS는 인덱스 명, 테이블 명, 열명을 가지고 있다.

 

문제 2) EMP 테이블에 이미 생성되어 있는 인덱스, 관련된 열명, 고유성 여부를 출력하여라.

 

참고

 Oracle에서의 최적화 방법

 가) 규칙 기준(Rule-base) 최적화

   SQL 문장을 싱행하기 위한 계획(Execution plan)을 선택할 때 내부적인 규칙에 근거하여 적절한 INDEX를 선정하여 사용하는 방식

 나) 비용 기준(Cost-base) 최적화

   SQL 문장을 실행하기 위한 계획(Execution plan)을 선택할 때 인덱스가 있는 테이블의 통계치를 분석하여 가장 비용이 적게 드는 방식으로 액세스 경로를 결정한다.

 

1.6 인덱스 제거

 인덱스를 수정할 수 없습니다. 인덱스를 변경하기 위해서는, 그것을 제거하고 다시 작성해야 합니다. DROP INDEX 문장을 생성하여 데이터 사전에서 인덱스 정의를 제거합니다. 인덱스를 제거하기 위해서는 인덱스의 소유자이거나 DROP ANY INDEX 권한을 가지고 있어야 합니다.

 

1.6.1 Syntax

 

문제 3) emp_ename_idx 인덱스를 삭제하여라

 

Guidelines

 1) 인덱스를 수정할 수는 없다.

 2) 인덱스를 변경하려면 삭제한 다음 다시 만들어야 한다.

 3) DROP INDEX 명령을 사용하여 인덱스를 삭제하라.

 4) 인덱스를 삭제하려면 그 인덱스의 소유자이거나 DROP ANY INDEX 권한을 가지고 있어야 한다.

 

2. 동의어

 다른 사용자가 소유한 테이블을 참조하기 위해서는 동의어를 생성한 이름 뒤에 점을 찍고 테이블 이름을 써야 합니다. 동의어 생성은 스키마 이름까지 명시할 필요를 제거시키고 테이블, 뷰, 시쿼스, 프로시저, 또는 다른 객체에 대한 또 다른 이름을 제공 합니다. 이 방법은 뷰처럼 긴 이름을 가진 객체한테 유용하게 사용될 수 있습니다.

 

2.1 Syntax

 PUBLIC             모든 사용자에 대해 액세스 가능한 동의어를 생성

 synonym_name  생성 되어야 할 동의어 이름

 object_name      생성된 동의어에 대한 객체를 식별합니다.

 

Guidelines

 1) 객체는 패키지에 포함될 수 없습니다.

 2) 개별 동의어 이름은 동일 사용자가 소유한 모든 다른 객체의 이름과 달라야 합니다.

 

문제 4) SALGRADE 동의어로 GUBUN를 생성하고 동의어로 조회하여라.

 

2.2 동의어 삭제

 동의어를 제거하기 위해 DROP SYNONYM 문장을 사용합니다. DBA만 공용(Public) 동의어를 제거할 수 있습니다.

 

2.2.1 Syntax

 

문제 5) 앞에서 생성한 동의어를 삭제하여라.

 

'Legend 개발자 > Oracle' 카테고리의 다른 글

No.0?? Entity Relationship Diagram [2017-06-14]  (0) 2017.06.15
No.014 사용자 [2017-06-14]  (0) 2017.06.14
No.012 VIEW [2017-06-07]  (0) 2017.06.12
No.011 SEQUENCE [2017-06-07]  (0) 2017.06.12
No.010 테이블 조작 [2017-06-07]  (0) 2017.06.12
Posted by 전설의아이
|