Pro toshiteno Oracle PL/SQL Nyumon, The Third Edition Copyright 2014 K.K. Ashisuto Korean translation copyright 2015 J-PUB. Original Japanese language edition published by SB Creative Corp. Korean translation rights arranged with SB Creative Corp., through Danny Hong Agency. 이책의한국어판저작권은대니홍에이전시를통한저작권사와의독점계약으로제이펍에있습니다. 저작권법에의해한국내에서보호를받는저작물이므로무단전재와복제를금합니다. 전문가를위한 제 3 판 3판 1쇄발행 2015년 12월 30일지은이어시스트교육부옮긴이안성민펴낸이장성두펴낸곳제이펍 출판신고 2009년 11월 10일제406-2009-000087호주소경기도파주시문발로 141 뮤즈빌딩 403호전화 070 8201 9010 / 팩스 02 6280 0405 홈페이지 www.jpub.kr / 이메일 jeipub@gmail.com 편집부이민숙, 이슬, 이주원 / 소통 기획팀민지환, 현지환표지디자인미디어픽스 / 본문디자인북아이용지에스에이치코리아 / 인쇄해외정판사 / 제본광우제책사 ISBN 979-11-85890-36-4 (93000) 값 27,000원 이책은저작권법에따라보호를받는저작물이므로무단전재와무단복제를금지하며, 이책내용의전부또는일부를이용하려면반드시저작권자와제이펍의서면동의를받아야합니다. 잘못된책은구입하신서점에서바꾸어드립니다. 제이펍은독자여러분의책에관한아이디어와원고투고를기다리고있습니다. 책으로펴내고자하는아이디어나원고가있으신분께서는책에대한간단한개요와차례, 구성과저 ( 역 ) 자약력등을메일로보내주세요. jeipub@gmail.com
드리는말씀 이책에기재된내용을기반으로한운용결과에대해저자, 역자, 소프트웨어개발자및제공자, 제이펍출판사는일체의책임을지지않으므로양해바랍니다. 이책에등장하는각회사명, 제품명은일반적으로각회사의등록상표또는상표입니다. 본문중에는 TM, C, R 마크등이표시되어있지않습니다. 이책에서사용하고있는제품버전은독자의학습시점이나환경에따라책의내용과다를수있습니다. 본문중일본내의실정에만국한되어있는내용이나그림은일부를삭제하거나국내실정에맞도록변경하였으니참고바랍니다. 본문중코드리스트내용상의한국어문장은본문의맞춤법이나띄어쓰기와다를수있습니다. 이는한국 Oracle에서지원하는코드를그대로전달하기위함이니양해바랍니다. 책내용과관련된문의사항은옮긴이나출판사로연락해주시기바랍니다. - 옮긴이 : twoanss@korea.com - 출판사 : jeipub@gmail.com
{ 차례 } 옮긴이머리말... xi 머리말... xiii 이책에대하여... xv 베타리더후기... xviii I N T R O D U C T I O N 처음만나는 PL/SQL... 1 우선실행해보자!... 1 에디터의사용... 3 PLS 오류발생... 6 코드작성의원리... 7 기초편 PL/SQL 블록의기초문법 9 CHAPTER 01 PL/SQL 블록의개요... 11 PL/SQL의장점... 11 PL/SQL 프로그램의종류와구조... 14 CHAPTER 02 변수와상수.... 17 변수란?... 17 변수정의방법... 18 대입연산자를사용한값대입... 19 변수에사용가능한데이터타입... 20 %TYPE과 %ROWTYPE 속성... 23 변수정의시의주의점... 27 상수란?... 29 상수정의방법... 29 식별자... 30 정리... 33 차례 v
CHAPTER 03 제어구조... 35 조건제어 IF문... 35 조건제어 CASE문... 39 반복제어 LOOP 문... 43 순차제어 GOTO문... 51 순차제어 NULL문... 53 정리... 54 CHAPTER 04 SELECT INTO 문과커서... 57 SELECT INTO문... 58 커서... 60 커서 FOR LOOP... 65 파라미터사용커서... 68 FOR UPDATE 사용커서... 70 WHERE CURRENT OF절... 71 커서의종류... 75 커서의속성... 76 정리... 79 CHAPTER 05 예외처리... 83 예외발생... 83 예외발생시의동작... 84 예외처리부의작성방법... 86 예외의종류... 88 내부예외... 88 사용자정의예외... 92 OTHERS 핸들러... 94 예외처리와블록의중첩... 97 정리... 99 실전편 Stored 프로그램실전활용 101 CHAPTER 06 Stored 서브프로그램의개요.... 103 Stored 서브프로그램의장점... 103 Stored 서브프로그램을작성해보자... 105 vi 차례
Stored 서브프로그램공유화... 107 Stored 서브프로그램등록및조회... 109 Stored 서브프로그램의디버그... 110 정리... 117 CHAPTER 07 프로시저와함수... 119 프로시저작성... 119 프로시저실행... 121 파라미터의개념... 122 파라미터지정방법... 124 파라미터정보확인... 133 함수작성... 134 함수실행... 138 SQL문에서함수를사용할경우의제한... 141 프로시저와함수의용도... 142 의존성이란?... 142 의존오브젝트확인... 145 의존성의문제점과재컴파일... 146 Stored 서브프로그램삭제... 155 정리... 157 CHAPTER 08 패키지... 159 패키지란?... 159 패키지의장점... 161 패키지작성 정의부... 165 패키지작성 본체... 166 패키지오브젝트의사용방법... 168 오브젝트의지속성... 171 오버로드... 172 패키지재컴파일... 175 패키지삭제... 177 유틸리티패키지... 179 UTL_FILE 패키지... 180 정리... 190 CHAPTER 09 트리거.... 193 트리거란?... 193 트리거의사용목적... 194 차례 vii
트리거종류... 195 트리거타입... 196 트리거작성... 199 상관관계명 old와 new... 201 트리거와트랜잭션... 204 WHEN절사용... 206 트리거의상태변경... 207 트리거의관리... 208 트리거의종속... 209 트리거의실행권한... 210 정리... 211 응용편심화응용테크닉 213 CHAPTER 10 레코드와컬렉션.... 215 레코드란?... 215 사용자정의레코드정의... 216 컬렉션이란?... 222 연관배열... 223 컬렉션메소드... 226 레코드의연관배열... 228 정리... 235 CHAPTER 11 커서변수... 237 커서변수란?... 237 커서변수를사용한복수행처리... 238 여러프로그램사이에서커서변수공유하기... 242 정리... 247 CHAPTER 12 동적 SQL.... 249 정적 SQL과동적 SQL... 249 동적 SQL 실행방법... 251 EXECUTE IMMEDIATE 문을통한동적 SQL 실행... 252 커서변수를사용한동적조회문실행... 256 정리... 259 viii 차례
CHAPTER 13 성능향상을위해... 261 DBMS_SHARED_POOL.KEEP... 262 네이티브컴파일... 265 플레이스홀더... 271 벌크처리... 278 DBMS_PROFILER 패키지를사용한병목구간조사... 290 정리... 297 APPENDIX 299 APPENDIX 01 환경설정과샘플오브젝트... 301 샘플오브젝트의작성... 301 샘플오브젝트상세설명... 303 APPENDIX 02 PL/SQL 에서사용가능한데이터타입... 306 스칼라타입... 307 콤포지트타입... 308 참조타입... 309 LOB 타입... 309 APPENDIX 03 예약어목록.... 310 APPENDIX 04 시스템권한과오브젝트권한... 312 시스템권한... 312 오브젝트권한... 313 APPENDIX 05 실행자권한지정방법.... 314 실행자권한으로실행한사용자보호... 316 APPENDIX 06 의존성확인.... 320 APPENDIX 07 자율형트랜잭션.... 324 자율형트랜잭션의설정... 324 자율형트랜잭션의사용예... 326 차례 ix
APPENDIX 08 트리거의종류... 328 INSTEAD OF 트리거... 328 이벤트트리거... 331 DDL 트리거... 335 이벤트명, 이벤트속성함수목록... 337 APPENDIX 09 중첩테이블과 VARRAY... 345 컬렉션의비교... 345 중첩테이블... 347 VARRAY... 351 오브젝트타입... 352 테이블함수... 356 파이프라인테이블함수... 357 APPENDIX 10 WRAP 유틸리티... 360 WRAP 유틸리티개요... 360 WRAP 유틸리티사용예... 361 APPENDIX 11 유틸리티패키지.... 363 DBMS_SQL 패키지... 363 DBMS_ALERT 패키지... 368 DBMS_PIPE 패키지... 373 DBMS_SCHEDULER 패키지... 378 DBMS_LOCK 패키지... 384 UTL_MAIL 패키지... 389 찾아보기... 393 x 차례
{ 옮긴이머리말 } 책내용중에도나오지만, PL/SQL은 Oracle 데이터베이스시스템에서 SQL을확장한절차적언어 (Procedural Language) 를뜻합니다. 그리고 OS 플랫폼에관계없이 Oracle 데이터베이스를사용하는환경이라면어디서든지사용할수있습니다. 국내 / 외의관계형데이터베이스제품중에서 Oracle이차지하고있는시장점유율과위상을생각해보면, 애플리케이션 SQL 개발자나데이터베이스관리자들에게 PL/ SQL이라는도구가얼마나유용한것인지짐작하실수있을것입니다. 그간데이터베이스관련업무를보며여러권의 PL/SQL 기술서적을접해보았지만, 초급 SQL 개발자에게가장필요한책을꼽아보라는요청이온다면저는주저없이이책을꼽을것입니다. 그이유는이책이 Oracle이라는방대한범주안에서 PL/SQL이라는언어에접근하기위한길을대단히쉽게풀어내고있는데다가, 개발자에게필요한실전예제나고급테크닉, Oracle 아키텍처등의정보들까지도빠짐없이소개하고있기때문입니다. 그리고독자에대한다양한조언과배려는저술에참여하신일본어시스트교육부의집필진들이 Oracle에관해얼마나높은수준의이해도를가졌는지알수있는부분입니다. 특히 SQL 언어에대한기본적인지식을가지고 Oracle 개발자혹은관리자를꿈꾸고있거나, 이미일선에서업무를보고있지만 PL/SQL 오브젝트 ( 프로시저 / 함수 ( 펑션 )/ 패키지등 ) 에대한깊은이해와 PL/SQL 코딩의체계를확실히구축하고자하는분들이라면이책을꼭권하고싶습니다. 옮긴이머리말 xi
이책이나오기까지는많은분의수고와노력이있었습니다. 우선좋은책의번역기회를주시고많은시간을기다려주신제이펍의장성두대표님께감사의말씀을드립니다. 또한, 번역서의품질향상을위해교정에힘써주신이주원님께도깊은감사를드립니다. 그리고퇴근후나주말의번역작업으로많은시간을함께해주지못했음에도언제나물심양면으로지원을아끼지않은아내와사랑하는딸예진이에게언제나고맙다는말을전하고싶습니다. 역자안성민 xii 옮긴이머리말
{ 머리말 } 평소 Oracle 교육강사로활동하는우리저자들은 어떻게알기쉽게전달할수있는가? 를항상고민하며교육하고있습니다. 이것은우리강사들에게영원한숙제라고도할수있습니다. 그래서무척난해한것으로알려진 Oracle 기술을쉽게이해시킬최고의방법을항상추구하고있습니다. 또한, 단지구문이나조작법을가르치는것뿐만아니라 왜그런조작을하는것인가?, 내부적으로어떠한일을처리하고있는가? 와같은배경을전달하는것도중요하다고생각합니다. 그이유는 Oracle의기능과구문을단순암기하는것만으로는그것을제대로응용하기어렵기때문입니다. 이것은단지 PL/SQL에국한된것만은아닐것입니다. 이책을쓰는데있어서도위와같은콘셉트로집필했습니다. 책내용중하나의표현을고를때도 PL/SQL을처음공부하는사람들에게잘 전달될 수있을지없을지에대해저자들끼리논의를거듭해왔습니다. 독자들이이책을완독했을때우리들의 알기쉽게전달하자 는목적을느낄수있었다면, 더할나위없이기쁠것입니다. 이책은다음과같이네개의편으로구성되어있습니다. INTRODUCTION, 처음만나는 PL/SQL 에서는 PL/SQL 프로그램의샘플을실제로작성 머리말 xiii
해보고 PL/SQL은무엇인지, 무엇을할수있는지에대한개요를소개합니다. 기초편, PL/SQL 블록의기초문법 에서는 PL/SQL의장점과기본구문을소개합니다. PL/SQL을처음접하는분들은먼저이기초편의내용을파악해주시기바랍니다. 실전편, Stored 프로그램실전활용 에서는프로시저와트리거등운영업무에없어서는안될기능을소개합니다. PL/SQL에대한경험이있는분들은실전편부터학습하셔도좋습니다. 응용편, PL/SQL 심화응용테크닉 에서는 PL/SQL을보다효율적으로사용하는많은테크닉들을소개합니다. 이미 PL/SQL에대한기초지식이있는분들께도분명도움이될정보들을제공할것입니다. 또한, Oracle 교육을전문으로하는강사로서의장점을살려서교육중질문을자주받는내용이나실수하기쉬운항목들을중점적으로설명했습니다. 게다가단순한기능설명으로끝내지않고, 칼럼에서추가로조금매니악한내용과 Oracle의아키텍처에대한설명을포함하는등기술적으로도깊이를가질수있도록노력했습니다. 또한, 책전반에걸쳐다수의사용예제를게재하였습니다. 샘플스크립트도준비되어있으므로반드시따라하면서학습을진행하시기바랍니다. 실제로직접프로그램을작성해보아야이해도도올라가고새로운발견도할수있을것입니다. 이책의목표는 Oracle 애플리케이션개발업무에종사하는독자여러분의원활한첫걸음을돕는것입니다. 이책을읽은뒤독자여러분의업무에서 Oracle을적극활용할수있기를몹시설레는마음으로기대하고있겠습니다. 그리고다른 Oracle 스킬을배우고싶다고생각하시는분은반드시어시스트교육장으로방문해주시기바랍니다. 이번집필에참여한저자들이여러분과의만남을즐겁게기다리고있겠습니다. 마지막으로이번집필의기회를주신 SB크리에이티브주식회사의오카모토신고님과, 집필하면서수고를끼쳐드린관계자분들께이자리를빌려진심으로감사의말씀을드립니다. 어시스트교육부 xiv 머리말
{ 이책에대하여 } 이책을읽을때의주의사항및전제조건을여기에기재합니다. 본문에들어가기전에한번읽어주시기바랍니다. 대상독자 이제부터 PL/SQL을사용하려는초보자에서 PL/SQL을기초부터다시확실히공부하고싶은경험자까지다양한분들이학습할수있는내용입니다. 단, SQL에관한기본적인지식을가지고계신것을전제로합니다. 이책에대응하는 Oracle 버전 이책의내용은 Oracle 10g R10.1부터 Oracle 12c R12.1까지의버전에대응하고있습니다. 각버전에서의신기능에대해서는대상버전의마크를표시하였습니다. 또한, 하위버전에서의대안도가능한게재하였습니다. 이책에대하여 xv
예제코드다운로드방법 이책에게시된모든예제는독자여러분의환경에서테스트할수있도록예제코드를준비했습니다. 다음웹페이지에서다운로드할수있습니다. 예제코드다운로드페이지 URL https://github.com/jpub/oracleplsql 또한, 예제를실행에는실행환경의설정이필요합니다 ( 샘플오브젝트의작성등 ). 자세한내용은 301쪽의 APPENDIX 01 환경설정과샘플오브젝트 를참조해주십시오. 예제실행시의주의점 DML문이나 DDL문을포함한프로그램을실행한상태로예제를실행하면에러가발생할수있습니다. DML문의경우에는롤백처리를실행하도록하십시오. 서식표기에대해서 서식표현은다음과같은기호를사용합니다. < 문자열 > : 임의의값을대입 [ A ] :A 는생략가능 { A B } :A 또는 B 둘중한쪽을선택 n _ : 수치지정 : 디폴트값 12.1 : 지정버전부터의신기능 ( 좌측표시의경우, Oracle 12c R12.1부터의신기능 ) 입니다. 본문중에서는 Oracle 12c R12.1 과같이버전릴리즈를표시합니다. xvi 이책에대하여
: 데이터딕셔너리뷰를표시합니다. COLUMN : 보충설명. 알아두면편리한지식을소개합니다. 매뉴얼다운로드 이책에서소개한각매뉴얼은 Oracle 테크놀로지네트워크 (OTN) 사이트에서무료로다운로드할수있습니다. PL/SQL에대해서는아래의매뉴얼들을참조하기바랍니다. PL/SQL Packages and Types Reference PL/SQL Language Reference Reference Developer s Guide 위매뉴얼명칭은 Oracle 12c R12.1 버전기준입니다. Oracle 버전에따라명칭은달라질수있습니다. Oracle 테크놀로지네트워크 URL http://www.oracle.com/technetwork/kr/index.html 이책에대하여 xvii
{ 베타리더후기 } 김종욱 (KAIST) 이책은실습을바탕으로하여 Oracle PL/SQL에입문할수있게해주는서적으로써, Oracle PL/SQL에처음입문하는분들이공부하기에진입장벽이낮고어려움이없는훌륭한책입니다. 무엇보다 PL/SQL의기본문법을시작으로다양한고급어휘까지친절히설명하고있으며, 책내용하나하나가매우매끄럽고부드러운문체로초심자의눈높이에맞춰최대한자세히, 그리고이해하기쉽게저술되어있습니다. 초급자, 중급자는물론이고 Oracle PL/SQL을다루려는모든사람이이해하는데에큰어려움이없도록책을쓰기위한저자와번역가, 그리고편집자의노력이묻어나는아름다운책이었습니다. 예제역시각장의흐름에맞게잘구성되었습니다. 나아가독자스스로 PL/SQL문을실습하며실력을향상해나갈수있는학습환경을제공하고있어, 향후필드에서활용하는데큰도움이될것같습니다. 고승광 ( 플랜티넷 ) PL/SQL이라고하면왠지어렵고낯선단어일수도있지만, Stored 프로시저, 함수, 패키지는많이들어봤을듯합니다. 막연하게만알던 Oracle PL/SQL에대해서무척쉽고친절하게설명해주어, DBA가만든패키지나함수를이해하기가한결쉬워질것같습니다. xviii 베타리더후기
김지헌 ( 이노트리 ) 정말꼼꼼하다싶을만큼과정을차근히진행하면서 PL/SQL에대한이야기와함께주의해야할점들을조목조목짚어줍니다. 책구성에서인상깊었던것은 Appendix( 부록 ) 였는데, 본문에서다룬내용을압축해서정리해두어 PL/SQL을이해하는데한층더도움이되었습니다. 특히, 본문에서다룬내용을깔끔히요약정리한부분에서는그야말로감탄이절로나오네요. 이상현 (SI 개발자 ) PL/SQL 프로그래밍을차근차근공부하고싶다고생각하던중에마침이책을베타리딩할기회가생겼네요. 전반적으로 SQL 쿼리를제외한많은내용이담겨있습니다. 예제코드와부록이잘정리되어있어서초, 중급자를모두아우를수있는책이라고생각합니다. 이재빈 ( 연세대학교 ) PL/SQL이처음이신분들에게그야말로적격인책입니다! SQL에대해서잘모르더라도책내용을충실히따른다면 PL/SQL의매력에빠질것입니다. 그만큼전반적으로독자들이이해하기쉽도록잘쓰인책입니다. PL/SQL 실무자도다시읽어보신다면기초를다지는좋은기회가될것이라생각합니다. 제이펍은책에대한애정과기술에대한열정이뜨거운베타리더들로하여금출간되는모든서적에사전검증을시행하고있습니다. 베타리더후기 xix
I N T R O D U C T I O N 처음만나는 PL/SQL 이제 PL/SQL의학습을시작합니다만, 이장에서는아직 PL/SQL의구문등에대해상세히설명하지는않습니다. 여기서는우선 PL/SQL을실제로실행해보고그분위기를느껴주시기바랍니다. 또한, PL/SQL을실행하기위한환경준비및프로그램작성에관한원칙등 PL/SQL의실행에필요한기초지식도설명하므로 PL/SQL 을처음사용하시는분들은여기서프로그램실행까지의기초를확실히습득하도록합시다. 우선 PL/SQL을실행해보고싶다! 는분들을위해, SQL*Plus를사용하여 Oracle 데이터베이스 ( 이하 Oracle) 에접속할수있는환경을제공합니다. 이책의샘플프로그램 도대부분 SQL*Plus에서실행한것들로구성되어있습니다. 다른프로그래밍언어 ( 비주얼베이직등 ) 에서도 SQL을처리하는것이가능하지만, 직접 SQL을실행할수있는환경이있으면 PL/SQL도실행할수있습니다. Oracle이설치된환경을구축할수없는분은반드시이번기회에 Oracle 평가판을다운로드하여실습이가능한환경을준비해주세요. 반드시실제로 PL/SQL을실행해보고결과를확인해가면서내용을익혀나가시기바랍니다. 샘플프로그램에대해서는 301 쪽의 APPENDIX 01 환경설정과샘플오브젝트 를참조해주십시오. 우선실행해보자! PL/SQL 이란, Oracle의독자적인프로그래밍언어입니다. PL/SQL을사용하면기존의 SQL만으로는불가능한복잡한처리 ( 절차적처리 ) 를실행할수있습니다. 이부분은 PL/SQL을처음배우는사람으로써는아직감이오지않을지도모릅니다. Introduction 처음만나는 PL/SQL 1
하지만안심하십시오. 앞으로많은샘플프로그램을사용하면서천천히설명해나갈것입니다. 책을다읽을때쯤에는확실히알수있을것이므로지금은우선 PL/SQL 을실행해보도록하겠습니다. PL/SQL 은 Procedural Language Extensions to SQL 의약어입니다. Oracle 에 SQL*Plus 로로그인했다면바로리스트 00-01 을실행해봅니다. 리스트 00-01 처음만나는 PL/SQL SQL> set serveroutput on ➊ SQL> SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('OK'); ➋ 3 END; 4 / OK PL/SQL 처리가정상적으로완료되었습니다. 리스트 00-01의마지막에 PL/SQL 처리가정상적으로완료되었습니다. 라는메시지가출력되어있습니다. 이프로그램은 OK 라는문자열만을표시하는매우간단한내용이지만, PL/SQL의정상적인실행결과를확인할수있습니다. 또한, DBMS_OUTPUT.PUT_LINE(➋) 은 PL/SQL을디버깅 (Debugging) 할때 SQL*Plus 화면에문자열을표시하기위해자주사용됩니다. DBMS_OUTPUT에대한자세한내용은 179쪽에서설명하겠지만, 앞으로도샘플스크립트에서자주언급할내용이므로여기서사용법을확실히기억해둡시다. 아울러문자열을출력하기위해서는사전에 SQL*Plus 환경변수 SERVEROUTPUT을 ON 으로해두어야한다는것을유념하기바랍니다 ( 로그아웃할때까지 ON 상태는유지됩니다 )(➊). 서식 DBMS_OUTPUT.PUT_LINE DBMS_OUTPUT.PUT_LINE(< 출력대상 >); 2 Introduction 처음만나는 PL/SQL
프로그램을작성할때가장주의해야할점은각처리마다문장의끝을나타내는 ;( 세미콜론 ) 을넣어야한다는것입니다. 예를들어, 리스트 00-01에서는 DBMS_ OUTPUT 기술내용마지막에 ; 를넣어서문장의종료를선언하고있습니다. 개중에는예외인경우도있지만, 가급적잊지말고문장의마지막에 ; 을넣을수있도록합시다. 또한, SQL*Plus에서 PL/SQL을수행할때는소스코드의마지막라인의다음라인에 /( 슬래시 ) 를넣습니다. 이것도함께기억해두도록합니다. 에디터의사용 SQL*Plus에서 PL/SQL 프로그램을직접작성하는방법은리스트 00-01과같이프로그램이매우간단하고짧을경우에는바람직하지만, 소스코드가복잡해지면쉽게편집할수없기때문에무척불편합니다. 따라서 SQL*Plus에서 PL/SQL 프로그램을작성할때는에디터기능을사용합니다. 윈도우즈 (Windows) 의메모장과같은텍스트에디터를사용하면프로그램의편집이무척편리해지며, 프로그램을파일에저장한후에여러번수행할수도있습니다. 에디터를사용하려면다음순서대로실행합니다. 1. 에디터를시작한다 SQL*Plus에서 EDIT 커맨드 를수행하여다음과같이지정하면에디터가시작됩니다. 서식에디터를시작한다 EDIT < 파일명 > EDIT 는 ED 로줄여서쓸수도있습니다. 다음페이지의그림 00-01은윈도우즈환경에서의실행예입니다. 파일명은 sample1 으로합시다. ED 명령을실행하면메모장이시작되는것을볼수있습니다. Introduction 처음만나는 PL/SQL 3
그림 00-01 에디터의시작 2. 프로그램을작성한다에디터가시작되면 PL/SQL 프로그램을작성합니다. 작성이끝나면파일명을정해서저장합니다. 여기서는리스트 00-01와같은내용의프로그램을작성한뒤, 파일이름을 sample1으로저장합니다. 3. 파일을실행한다 저장된파일을다음과같이지정하여실행합니다. 서식파일의실행 @< 파일명 > 리스트 00-02 파일을실행한다 SQL> @sample1 OK PL/SQL 처리가정상적으로완료되었습니다. 4 Introduction 처음만나는 PL/SQL
이것으로에디터를사용한프로그래밍을해낼수있게되었습니다. 이책의후반부에는비교적긴프로그램들도있으므로실제로프로그램을작성할때는에디터를사용할것을권합니다. 파일내용을 SQL*Plus 화면에표시할때 COLUMN SQL*Plus의환경변수 ECHO를 ON 으로설정하여 (➊), SQL*Plus 화면에 @< 파일명 > 에서실행되는소스코드의내용을표시할수있습니다. 리스트 00-03 SQL*Plus 의화면에파일의내용을표시할때 SQL> set echo on SQL> SQL> SQL> @sample1 SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('OK'); 3 END; 4 / ➊ PL/SQL 처리가정상적으로완료되었습니다. 기본에디터를변경할때 COLUMN 기본에디터를변경할때는 SQL*Plus의사용하려는에디터를환경변수 DEFINE_EDITOR에설정합니다. 설정은다음과같이에디터이름또는에디터의경로를지정합니다. 리스트 00-04 기본에디터를변경할때 ( 메모장 (notepad) 의경우 ) SQL> DEFINE_EDITOR = notepad Introduction 처음만나는 PL/SQL 5
PLS 오류발생 PL/SQL 프로그램은우선구문분석이이루어진후, 그결과에따라올바르게작성되었다고판단된프로그램만실행할수있습니다. 따라서 PL/SQL 구문이잘못된경우는실행되기전에분석이실패했다는 PLS - 오류가리턴됩니다. PL/SQL 에익숙해질때까지는이오류로고생하는경우가많기때문에이에대한해결방법에대해서간단히설명해두도록하겠습니다. 리스트 00-01의프로그램을에디터로열어서, DBMS_OUTPUT.PUT_LINE('OK') 행맨뒤에있는 ; 을제거해보십시오. 리스트 00-05와같이 PLS - 00103 오류가발생합니다. 리스트 00-05 PLS-00103 오류의발생 SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('OK') 3 END; 4 / END; * 3행에오류 : ORA-06550: 줄 3, 열1:PLS-00103: 심볼 "END" 를만났습니다다음중하나가기대될때 : :=. ( % ; 심볼이 ";" 계속하기위하여 "END" 로치환되었습니다 여기에서발생한 PLS - 00103 오류는대체로세미콜론의지정을잊는등의단순한실수로인해발생하는오류입니다. 리턴되는오류메시지는매우이해하기어려운데, 이번예와같이오류가발생한장소는 ; 의지정을잊은두번째행임에도불구하고 3행에오류 라는잘못된메시지가출력되는경우도많습니다. 이렇게출력되는오류메시지는반드시오류가발생한위치를정확히알려주는것은아니지만, 그래도대략적인기준으로써참조할수있습니다. 실제로디버깅을할때는가급적행번호를표시할수있는에디터를사용하도록하십시오. Oracle 오류에대한상세내역은 Oracle 공식 Reference 매뉴얼을참조하십시오. 6 Introduction 처음만나는 PL/SQL
코드작성의원리 작성자본인만이해할수있어서는좋은 PL/SQL 프로그램소스라고할수없습니다. 향후프로그램의수정이필요할경우, 다른사람들이보았을때도그프로그램의처리내용을이해할수있도록알기쉽게작성하는것이중요합니다. 다음세가지원칙을바탕으로프로그램을작성할수있도록유의합시다. 주석을남기자주석 (Comment) 이란, 소스코드의부연설명입니다. PL/SQL 처리자체에는아무런영향도주지않지만, 주석에적절한설명이남아있으면프로그램의내용을소스코드에서확인하지않아도이해할수있습니다. 조금번거로울수도있으나가능한많은주석을남겨둘것을추천합니다. 이는향후소스유지보수시에큰효과를발휘하게됩니다. 주석작성방법으로는다음의두가지가있습니다. 단일행주석 - - 이후의그한줄을주석으로간주합니다. 복수행주석 /* 부터 */ 까지주석을여러줄로남길수있습니다. 리스트 00-06 주석작성방법 SQL> BEGIN 2 -- 1행의주석입니다. 3 /* 복수행의 4 주석입니다. */ 5 DBMS_OUTPUT.PUT_LINE('OK'); 6 END; 7 / OK Introduction 처음만나는 PL/SQL 7
PL/SQL 처리가정상적으로완료되었습니다. 소스코드들여쓰기와줄바꿈적절한위치에줄바꿈을넣어서소스코드를읽기쉽도록합니다. 또한, 처리단위마다공백 (Space) 이나탭 (Tab) 을삽입해서행의시작위치를가지런히만듭니다 ( 들여쓰기 ). 들여쓰기를하면논리적인처리단위를좀더명확히할수있습니다. 대문자 소문자를구분하여작성 PL/SQL은원칙적으로대문자와소문자를구별하지않습니다. 그러나소스코드의가독성측면에서사전에작성규칙을정해놓고대소문자를구분하여쓰는것을추천합니다. 대소문자를구별하지않는규칙은변수의이름등에도적용됩니다. 자세한내용은 31~32쪽을참조하십시오. 자, 이제 PL/SQL을학습하기위한최소한의준비를마쳤습니다. 그럼이제다음장부터기초편인 PL/SQL 블록의기초문법 에서구체적인코딩방법을배워봅시다. 8 Introduction 처음만나는 PL/SQL
기초편 PL/SQL 블록의기초문법 기초편에서는우선 PL/SQL의장점을소개한후, 이어서 PL/SQL의기본조작에대해설명합니다. 각조작의구체적인작성방법은 PL/SQL 프로그램작성의기초가되는부분이므로확실히짚고넘어갑시다. CHAPTER 01 CHAPTER 02 CHAPTER 03 CHAPTER 04 CHAPTER 05 PL/SQL 블록의개요변수와상수제어구조 SELECT INTO문과커서예외처리
기초편 PL/SQL 블록의기초문법
CHAPTER 01 PL/SQL 블록의개요 이장에서는 PL/SQL의장점과프로그램의내부구조에대해설명합니다. 우선 PL/ SQL은 SQL과비교하여도대체무엇이다른지어떤특징을가진프로그래밍언어인지를확인한뒤, PL/SQL이네개의키워드로구성된블록구조의언어임을설명하고있습니다. 이네가지키워드는 PL/SQL을작성하는데있어서매우중요한포인트가되므로확실히습득할수있도록합시다. PL/SQL 의장점 우선은 PL/SQL의장점에대해서간단히설명하겠습니다. 어째서 PL/SQL을사용하는지그이유를깨닫는것은무척중요한일입니다. 절차처리실행이가능하다 PL/SQL은 SQL 단문으로는간단히해낼수없는복잡한처리를실행할수있습니다. 예를들면 어떤데이터를검색해서그데이터를조건으로레코드를업데이트할지, 하지않을지의여부를판단한다 와같은일련의처리 ( 절차처리 ) 를실행할수있습니다. 또한, PL/SQL에서직접 SQL을작성할수있으므로절차처리조작과 SQL 데이터조작기능양쪽모두를간단히실행할수있습니다. Oracle과의친화력이좋다 PL/SQL은 Oracle이개발한언어이기때문에 Oracle에서사용하는모든 SQL 데이터유형을지원합니다. 따라서 SQL과 PL/SQL 사이에데이터타입변환이불필요합니다. Chapter 01 PL/SQL 블록의개요 11
이식성이뛰어나다윈도우즈나리눅스 (Linux) 등 OS가다른경우라도 Oracle이동작하는환경이라면 PL/SQL 프로그램의수정없이실행이가능합니다. 즉, 한번작성한 PL/SQL 프로그램은 Oracle이동작하는모든환경에서그대로사용할수있습니다. 성능이우수하다비주얼베이직 (Visual Basic) 등의다른언어로 SQL을실행하는경우, 미들웨어 (Middleware) 를통해 Oracle에 SQL을문장단위로전송합니다. 따라서많은 SQL을발행하는프로그램은프로세스간통신을여러번수행하므로성능에미치는영향이커집니다 ( 그림 01-01). Oracle 서버 SQL1:UPDATE SQL2:DELETE SQL3:INSERT 1 2 3 SQL 문단위로전송이이루어지므로, 많은 SQL 문을발행하는프로그램을실행하면프로세스간통신과네트워크에걸리는부하가크다 그림 01-01 SQL 을문장단위로전송하는경우 그에비해 PL/SQL은 PL/SQL 블록내에작성된 SQL을포함한프로그램단위로 Oracle에일괄전송하여처리합니다 ( 그림 01-02). 따라서프로세스간통신오버헤드및네트워크트래픽이비약적으로감소합니다. 12 기초편 PL/SQL 블록의기초문법
Oracle 서버 PL/SQL 프로그램 BEGIN IF..THEN UPDATE; END IF; DELETE; INSERT; END; 1 12 쪽의 SQL 1~3 을포함한프로그램 PL/SQL 블록내에기술된 SQL 을포함한단일블록으로일괄전송한다. 따라서송수신에걸리는부하를줄일수있다 그림 01-02 PL/SQL 블록단위로전송하는경우 또한, PL/SQL은명명된 PL/SQL 블록을분석 (Compile) 된상태로 Oracle 에저장할수있습니다. 이분석 / 저장된프로그램을 Stored 서브프로그램 (Stored Subprogram, 103쪽참조 ) 이라고합니다. Stored 서브프로그램의실행은프로그램을송신할필요없이그이름을지정하는것만으로도가능합니다. 그덕에네트워크의부하를더욱더줄일수있습니다. 또한, 분석이끝난상태로저장되어있기때문에실행할때마다분석해야하는부하도없습니다 ( 그림 01-03). 일반 PL/SQL 프로그램 PL/SQL 프로그램 2 분석 / 실행 1 프로그램송신 3 결과회신 PL/SQL 프로그램 Stored 서브프로그램 프로그램 A 분석된프로그램 2 프로그램 A 실행 1 프로그램 A 호출 3 결과회신 분석부하및네트워크부하를줄일수있다 그림 01-03 Stored 서브프로그램의개념 Chapter 01 PL/SQL 블록의개요 13
그리고 Stored 서브프로그램을이용하면여러사용자간에동일한프로그램을공유 하여사용할수있습니다 ( 그림 01-04). Oracle 서버 Stored 서브프로그램 A 분석된프로그램 그림 01-04 프로그램의공유 Stored 서브프로그램 A 를여러사용자들간에공유할수있음 PL/SQL 프로그램의종류와구조 PL/SQL은블록구조화언어입니다. 그러므로우선 PL/SQL의구조에대해설명하겠습니다. PL/SQL로작성한프로그램을 PL/SQL 블록이라고부릅니다. PL/SQL 블록은이름없는 PL/SQL 블록과 Stored 서브프로그램 ( 명명된 PL/SQL 블록 ) 으로나뉩니다. 이름이없는 PL/SQL 블록은리스트 00-01(2쪽참조 ) 처럼프로그램이름을붙이지않고, 애플리케이션응용프로그램쪽에서 PL/SQL 블록을송신하여실행합니다. 그에비해 Stored 서브프로그램 (103쪽참조 ) 은위에서얘기한것처럼명명된 PL/ SQL 블록을분석된상태에서 Oracle에저장하여실행합니다. 14 기초편 PL/SQL 블록의기초문법
PL/SQL 블록의구조 그럼이제 PL/SQL 블록의구조를확인해보겠습니다. 다음세가지는중요한포인 트입니다. 그림 01-05 를참조하면서확인하십시오. 1. PL/SQL 블록은네개의키워드 (DECLARE, BEGIN, EXCEPTION, END;) 로구성됨 2. DECLARE부터 BEGIN까지를선언부, BEGIN부터 EXCEPTION까지를실행부, EXCEP TION부터 END; 까지를예외처리부라고부름 3. END; 는 PL/SQL 블록종료를의미함 PL/SQL 블록 DECLARE BEGIN EXCEPTION END; 선언부프로그램에서사용하는객체 (Object) 를정의 실행부프로그램의구체적인실행내용을작성 ( 필수 ) 예외처리부예외처리방법을작성 그림 01-05 PL/SQL 블록의구조 PL/SQL 블록은선언부, 실행부, 예외처리부로구성되어있으며, 각부분은네개의키워드로구분되어있습니다 ( 그림 01-05). 각부분에대한자세한작성방법은나중에설명할것이므로여기에서는각부분의요점만이해해주십시오. 선언부에는 PL/SQL 블록에서사용할객체 ( 변수등 ) 를정의 ( 선언 ) 실행부에서는실제로수행할처리내용을작성 예외처리부에서는 PL/SQL 블록에서발생하는예외 대처방법을작성 PL/SQL은실행시의오류 (Error) 나경고 (Warning) 를예외라고부릅니다. Chapter 01 PL/SQL 블록의개요 15
굳이객체를정의하거나예외처리를지정할필요가없는경우 ( 그런경우는드물지만 ) 는선언부와예외처리부를생략할수있습니다. PL/SQL 블록의중첩그림 01-06처럼 PL/SQL 블록에 PL/SQL 블록을포함 ( 중첩 ) 할수있습니다. PL/ SQL 블록내에몇개의블록이중첩되어있어도논리적으로는한개의 PL/SQL 블록으로처리됩니다. 중첩가능한블록의상한개수는 255개입니다. 그러나코드가복잡해지므로무의미한블록중첩은피하는것이좋습니다. DECLARE BEGIN DECLARE BEGIN 블록의중첩 중첩되어있어도논리적으로는하나의블록으로처리된다 END; END; 그림 01-06 PL/SQL 블록의중첩 16 기초편 PL/SQL 블록의기초문법