Altibase Stored Procedure Manual

Size: px
Start display at page:

Download "Altibase Stored Procedure Manual"

Transcription

1 ALTIBASE HDB Application Development Stored Procedures Manual Release (January 16, 2013)

2 ALTIBASE Application Development Stored Procedures Manual Release Copyright c 2001~2011 ALTIBASE Corp. All Rights Reserved. 본문서의저작권은 알티베이스에있습니다. 이문서에대하여당사의동의없이무단으로복제또는전용할수없습니다. 알티베이스 서울시구로구구로동 대륭포스트타워 Ⅱ 10 층전화 : 팩스 : 고객서비스포털 : homepage:

3 목차 서문 i 이매뉴얼에대하여 ii 1. 저장프로시저 1 저장프로시저의개요 2 저장프로시저의구조 5 저장프로시저사용시주의사항 7 2. 저장프로시저 SQL문 9 개요 10 CREATE PROCEDURE 12 ALTER PROCEDURE 20 DROP PROCEDURE 22 EXECUTE 23 CREATE FUNCTION 25 ALTER FUNCTION 29 DROP FUNCTION 저장프로시저블록 31 저장프로시저블록 32 지역변수선언 35 SELECT INTO 43 할당문 49 LABEL 52 PRINT 55 RETURN 흐름제어 61 개요 62 목차 I

4 IF 63 CASE 69 LOOP 73 WHILE LOOP 75 FOR LOOP 77 EXIT 83 CONTINUE 87 GOTO 89 NULL 커서 95 커서의개요 96 CURSOR 98 OPEN 101 FETCH 104 CLOSE 107 Cursor FOR LOOP 108 커서속성 사용자정의타입 117 개요 118 사용자정의타입의정의 120 Associative Array 관련함수 123 RECORD 타입변수및 Associative Array변수의사용 128 REF CURSOR 타입세트 139 개요 140 CREATE TYPESET 143 DROP TYPESET 동적 SQL 149 동적 SQL의개요 150 EXECUTE IMMEDIATE 153 OPEN FOR 156 II Stored Procedures Manual

5 9. 예외처리 159 개요 160 EXCEPTION 163 RAISE 164 RAISE_APPLICATION_ERROR 166 사용자정의예외 168 SQLCODE와 SQLERRM 171 Exception Handler 내장함수와저장프로시저 179 파일제어 180 DataPort 205 그외함수들 224 A. 예제 227 저장프로시저예제 228 파일제어예제 238 찾아보기 241 목차 III

6

7 서문 서문 i

8 이매뉴얼에대하여 이매뉴얼은저장프로시저의개념및사용방법에대해설명한다. 대상사용자 이매뉴얼은다음과같은알티베이스사용자를대상으로작성되었다. 데이터베이스관리자 성능관리자 데이터베이스사용자 응용프로그램개발자 기술지원부 다음과같은배경지식을가지고이매뉴얼을읽는것이좋다. 컴퓨터, 운영체제및운영체제유틸리티운용에필요한기본지식 관계형데이터베이스사용경험또는데이터베이스개념에대한이해 컴퓨터프로그래밍경험 데이터베이스서버관리, 운영체제관리또는네트워크관리경험 소프트웨어환경 이매뉴얼은데이터베이스서버로알티베이스버전 을사용한다는가정하에작성되었다. 이매뉴얼의구성 이매뉴얼은다음과같이구성되어있다. 제 1 장저장프로시저이장은저장프로시저의개념및구조, 사용시주의사항에대해설명한다. 제 2 장저장프로시저 SQL 문이장은저장프로시저 SQL 문에대한사용방법에대해설명한다. ii Stored Procedures Manual

9 제 3 장저장프로시저블록이장은저장프로시저블록의개념, 저장프로시저바디내에서선언하는지역변수및사용가능한문장에대해설명한다. 제 4 장흐름제어이장은저장프로시저바디내에서절차적프로그램작성이가능하도록프로그램흐름을제어할수있는흐름제어문에대해설명한다. 제 5 장커서이장은저장프로시저내에서조회레코드건수가여러개인 SELECT 문을처리할수있도록커서를정의하고레코드를제어할수있는커서관련문들에대해설명한다. 제 6 장사용자정의타입이장은저장프로시저내에서사용자정의타입인 record 및 associative array 의정의및사용방법에대해설명한다. 제 7 장타입세트이장은사용자정의타입의집합인타입세트의정의및사용방법에대해설명한다. 제 8 장동적 SQL 이장은실행시간에사용자가원하는질의를만들어서실행하기위한동적 SQL 에대해설명한다. 제 9 장예외처리이장은저장프로시저실행중오류발생시저장프로시저내에서오류에대한예외처리가가능하도록하는예외처리관련문에대해설명한다. 제 10 장파일제어이장은저장프로시저의운영체제텍스트파일에대한읽기및쓰기기능에대하여설명한다. A. 부록이장은이매뉴얼의예제에서사용한스키마에대한설명과저장프로시저를이용한예제프로그램을설명한다. 문서화규칙 이절에서는이매뉴얼에서사용하는규칙에대해설명한다. 이규칙을이해하면이매뉴얼과설명서세트의다른매뉴얼에서정보를쉽게찾을수있다. 여기서설명하는규칙은다음과같다. 구문다이어그램 샘플코드규칙 서문 iii

10 구문다이어그램 이매뉴얼에서는다음구성요소로구축된다이어그램을사용하여, 명령문의구문을설명한다. 구성요소 예약어 의미 명령문이시작한다. 완전한명령문이아닌구문요소는화살표로시작한다. 명령문이다음라인에계속된다. 완전한명령문이아닌구문요소는이기호로종료한다. 명령문이이전라인으로부터계속된다. 완전한명령문이아닌구문요소는이기호로시작한다. ; 명령문이종료한다. SELECT 필수항목 선택적항목 NOT ADD 선택사항이있는필수항목. 한항목만제공해야한다. DROP 선택사항이있는선택적항목. ASC DESC ASC 선택적항목. 여러항목이허용된다. 각반복앞부분에콤마가와야한다. DESC, 샘플코드규칙 코드예제는 SQL, Stored Procedure, isql, 또는다른명령라인구문들을예를들어설명한다. 아래테이블은코드예제에서사용된인쇄규칙에대해설명한다. 규칙의미예제 [ ] 선택항목을표시 VARCHAR [(size)] [[FIXED ] VARIABLE] iv Stored Procedures Manual

11 { } 필수항목표시. 반드시하나이상을선택해야되는표시 선택또는필수항목표시의인자구분표시... 그밖에기호 기울임꼴 소문자 대문자 그이전인자의반복표시 예제코드들의생략되는것을표시 위에서보여진기호이외에기호들 구문요소에서사용자가지정해야하는변수, 특수한값을제공해야만하는위치지정자 사용자가제공하는프로그램의요소들, 예를들어테이블이름, 칼럼이름, 파일이름등 시스템에서제공하는요소들또는구문에나타나는키워드 { ENABLE DISABLE COMPILE } { ENABLE DISABLE COMPILE } [ ENABLE DISABLE COMPILE ] SQL> SELECT ename FROM employee; ENAME SWNO HJNO HSCHOI rows selected. EXEC :p1 := 1; acc NUMBER(11,2); SELECT * FROM table_name; CONNECT userid/password; SELECT ename FROM employee; DESC SYSTEM_.SYS_INDICES_; 샘플스키마 이매뉴얼내의예제중의일부는 employees, departments 및 orders 테이블같은샘플테이블에기반하여작성되었다. 이들테이블은 $ALTIBASE_HOME/sample/APRE/schema 디렉터리의 schema.sql 을사용하여생성할수있다. 샘플스키마에대한온전한정보는 General Reference 를참고하기바란다. 관련자료 자세한정보를위하여다음문서목록을참조하기바란다. 서문 v

12 Installation Guide Getting Started Guide SQL Reference isql User s Manual Error Message Reference 온라인매뉴얼 알티베이스고객서비스포털 ( 에서국문및영문매뉴얼 (PDF, HTML) 을받을수있다. 알티베이스는여러분의의견을환영합니다. 이매뉴얼에대한여러분의의견을보내주시기바랍니다. 사용자의의견은다음버전의매뉴얼을작성하는데많은도움이됩니다. 보내실때에는아래내용과함께고객서비스포털 ( 로보내주시기바랍니다. 사용중인매뉴얼의이름과버전 매뉴얼에대한의견 사용자의성함, 주소, 전화번호 이외에도알티베이스기술지원설명서의오류와누락된부분및기타기술적인문제들에대해서이주소로보내주시면정성껏처리하겠습니다. 기술적인부분과관련하여즉각적인도움이필요한경우에는기술지원센터로연락하시기바랍니다. 여러분의의견에항상감사드립니다. vi Stored Procedures Manual

13 1. 저장프로시저 저장프로시저 1

14 저장프로시저의개요 저장프로시저 (Stored Prodedure) 란 SQL 문들과흐름제어문, 할당문, 오류처리루틴등으로구성된데이터베이스객체 (object) 중의하나이다. 저장프로시저는생성될때컴파일되어바로실행가능한상태로데이터베이스에저장되며여러세션에서동시에하나의저장프로시저를실행하는것도가능하다 저장프로시저 (Stored Prodedure) 라는용어는때때로저장프로시저와저장함수 (Stored Function) 을모두지칭하기도한다. 저장프로시저와저장함수는저장함수가실행시값을반환하는것외에는차이가없다. 저장프로시저와저장함수는각각 CREATE PROCEDURE 와 CREATE FUNCTION 구문을사용해서생성할수있다. 이구문에대한자세한설명은 2 장 저장프로시저 SQL 문 을참고하기바란다. 저장프로시저의종류 저장프로시저 저장함수 타입세트 저장프로시저는 SQL 구문이나다른저장프로시저내에서입력인자, 출력인자, 입출력인자를가지고실행할수있다. 저장프로시저호출시, 프로시저의바디부분에정의된절차에따라서 SQL 문을수행하게된다. 저장프로시저는반환값을가지지않지만, 출력인자와입출력인자들을통해프로시저를호출한클라이언트에게값을전달할수도있다. 이는반환값을갖지않기때문에 SQL 문의연산식 (expression) 내에서피연산자로사용될수없다. 값을반환하는것만제외하면저장프로시저와동일하다. 저장프로시저와달리하나의반환값을가지므로 SQL 문의연산식 (expression) 내에서피연산자로사용할수있다. 저장프로시저의사용자정의타입들을정의한집합이다. 이는주로저장프로시저끼리인자또는리턴값으로사용자정의타입을주고받을때사용한다. 자세한내용은 7 장 타입세트 에서다룬다. 2 Stored Procedures Manual

15 저장프로시저의특징 SQL 구문을이용한절차적프로그램 성능 모듈화 소스코드관리의용이성 알티베이스 PSM (Persistent Stored Module) 은흐름제어문과예외처리문을제공하므로 SQL 문을사용해서절차적프로그래밍이가능하다. 여러 SQL 문을순차적으로수행하는클라이언트프로그램의경우에는각 SQL 문수행시마다데이터베이스서버와통신을해야하므로통신비용이많이발생한다. 반면, 저장프로시저로작성된프로그램은프로시저호출시한번의통신만으로여러 SQL 문을수행할수있다. 따라서, 저장프로시저를사용하면통신부하의감소와함께데이터베이스서버와클라이언트응용프로그램간의데이터타입의차이로인해발생하는내부적인데이터타입변환의부하도줄일수있다. 업무절차를구현하는데필요한모든 SQL 작업을하나의저장프로시저로묶어모듈화하여관리할수있다. 저장프로시저는데이터베이스서버에저장되는모듈이기때문에, 업무로직의변경시여러클라이언트에설치된프로그램들을모두수정할필요없이저장프로시저만변경하면되므로프로그램관리가용이하다. 공유와생산성 SQL 과의통합성 한사용자가생성한저장프로시저는데이터베이스에저장되므로접근권한이부여된다른사용자도해당저장프로시저를실행할수있어서로공유할수있을뿐만아니라, 한저장프로시저내에서다른저장프로시저의호출이가능하므로같은업무절차의재프로그래밍이필요없으므로생산성을높일수있다. 저장프로시저내의흐름제어문의조건절은 SELECT 문의조건절을 저장프로시저 3

16 그대로사용할수있다. 즉, C/C++ 등의주언어의흐름제어문의조건절에서는사용할수없는 SQL 문스타일의기능을사용할수있다. 또한, 연산식에부질의 (subquery) 를사용하거나 SQL 문이지원하는시스템제공함수들을그대로사용할수있다는점등 SQL 문과밀착된프로그래밍이가능하다. 에러및예외처리 저장프로시저내에서 Exception Handler 를제공하므로 SQL 문수행도중오류가발생했을때적절한대응조치를서버내에서바로처리할수있다. 저장성 저장프로시저또한데이터베이스객체이기때문에사용자가삭제하기전까지데이터베이스내에저장된다. 따라서업무절차또한데이터베이스에저장하여보존시킬수있다. 4 Stored Procedures Manual

17 저장프로시저의구조 저장프로시저는블록으로구조화된언어로, 저장프로시저의바디는여러개의논리적인블록들로구성된다. 저장프로시저는크게헤더와바디로나뉘어진다. 저장프로시저의바디는하나의큰블록으로서선언부, 프로시저의실제바디, 예외처리부로구성된다. 바디는다시여러개의하위블록들을가질수있다. 저장프로시저구조를예를들어설명하면다음과같다. 저장프로시저 헤더 CREATE FUNCTION mycheck (id IN INTEGER,... ) RETURN INTEGER AS v_name CHAR(20); v_salary INTEGER; comm_missing EXCEPTION; 블록 1 선언부 CURSOR IF id > THEN... DECLARE... 저장프로시저바디 ( 블록 1) 블록 2 블록 1 바디 END IF; RAISE comm_missing;... RETURN v_salary;... EXCEPTION... WHEN comm_missing THEN... 블록 1 예외처리부... 블록 2 는블록 1 의하위블록으로블록 1 의구조와같이선언부, 바디, 예외처리부로구성될수도있다. 흐름제어문도명시적인시작과끝을알수있는하나의블록이다. 저장프로시저 5

18 6 Stored Procedures Manual

19 저장프로시저사용시주의사항 트랜잭션관리 저장프로시저내에서사용가능한트랜잭션제어문은 COMMIT, ROLLBACK 문이다. 저장프로시저내에서사용한트랜잭션제어문은저장프로시저밖의작업에도영향을미칠수있다. 예를들어서 NON-AUTOCOMMIT 모드에서다음과같은작업을수행했다고가정하자. isql> INSERT INTO t1 values (1); isql> INSERT INTO t1 values (2); isql> EXECUTE proc1; proc1 이 INSERT INTO t1 values (3) 구문과 ROLLBACK 문을수행한다면프로시저내에서입력한 3 뿐만아니라프로시저외부의 isql 에서입력한 1 과 2 도 ROLLBACK 된다. 즉, 위의두 INSERT 문과 EXECUTE 문은하나의트랜잭션으로처리된다. 제약사항 커서가 OPEN 된상태에서는 COMMIT 또는 ROLLBACK 을실행할수없다. 즉, 커서를사용하는트랜잭션은커서의 OPEN, FETCH, CLOSE 로구성된전체커서블록을모두포함하고있어야한다. SELECT 문내에서호출되는저장함수의경우저장함수내에 INSERT, UPDATE, DELETE 문은사용할수없으며, 트랜잭션제어문도수행할수없다. INSERT, UPDATE, DELETE 문내에서호출되는저장함수내에서도트랜잭션제어문을수행할수없다. LOB 타입의변수는저장프로시저선언부에서선언할수없으며, LOB 타입칼럼또는다른변수와함께 %TYPE, %ROWTYPE 을이용해서도변수를선언할수없다. LOB 타입의변수는선언을할수없으므로커서에서값을받아올수없다. 따라서, LOB 타입의칼럼은커서문에서참조할수없다. 저장프로시저 7

20 관련메타테이블 저장프로시저관련메타테이블에대한자세한내용은 General Reference 의데이터딕셔너리부분을참조한다. 8 Stored Procedures Manual

21 2. 저장프로시저 SQL 문 저장프로시저 SQL 문 9

22 개요 저장프로시저 SQL 문 아래표는저장프로시저, 함수와타입세트를생성하고관리하는데사용하는 DDL 문을보여준다. CREATE TYPESET 과 DROP TYPESET 구문에대한설명은 7 장타입세트를참고하기바란다. 종류관련문장설명 생성 변경 삭제 CREATE [OR REPLACE] PROCEDURE 문 CREATE [OR REPLACE] FUNCTION 문 CREATE [OR REPLACE] TYPESET 문 ALTER PROCEDURE 문 ALTER FUNCTION 문 DROP PROCEDURE 문 DROP FUNCTION 문 DROP TYPESET 문 새로운저장프로시저를생성하거나이미생성된저장프로시저의정의를변경하는문장이다. 새로운저장함수를생성하거나이미생성된저장함수의정의를변경하는문장이다. 타입세트를생성또는변경하는문장이다. 이구문은저장프로시저를재컴파일하여프로시저의실행계획을최적화할때사용한다. 저장프로시저생성후에저장프로시저가참조하는객체의정의가변경되었다면, 그상황에서의저장프로시저의실행계획은최적화상태가아닐수있다. ALTER PROCEDURE 문과동일하다. 생성된저장프로시저를삭제하는문장이다. 생성된저장함수를삭제하는문장이다. 생성된타입세트를삭제하는문장이다. 실행 EXECUTE 문 저장프로시저또는저장 함수를실행하는문장이다. 10 Stored Procedures Manual

23 function_name SQL 문내에서호출할때이름으로참조할수있다. 데이터타입 저장프로시저에서는다음과같은데이터타입을지원한다. Primitive 타입 - 일반데이터타입 : SQL 구문에서사용가능한데이터타입으로자세한사항은 SQL Reference 에있는데이터타입부분을참조한다. - BOOLEAN 타입 : 저장프로시저내에서만사용가능하며, TRUE, FALSE 의값을가진다. FILE_TYPE 저장프로시저내에서만사용가능하며, 파일제어를위한 타입이다. 자세한내용은 9 장 파일제어 를참조한다. 사용자정의타입저장프로시저내에서만사용가능하며, RECORD 및 ASSOCIATIVE ARRAY 를지원한다. 자세한내용은 6 장 사용자정의타입 을참조한다. 저장프로시저 SQL 문 11

24 CREATE PROCEDURE 구문 create_procedure::= CREATE OR PROCEDURE REPLACE user_name. procedure_name AS ( parameter_declaration ) IS, declaration_section statement END EXCEPTION exception_handler procedure_name parameter_declaration ::= parameter_name IN OUT data_type IN OUT DEFAULT := expression 기능 저장프로시저를새로생성하거나이미생성되어있는저장프로시저를새로운저장프로시저로변경하는기능을수행한다. 12 Stored Procedures Manual

25 parameter_declaration declaration_section 인자는생략할수있으며, 인자를명시할경우엔인자의명칭, 데이터타입및입출력구분을명시해야한다. 사용가능한입출력구분값은다음세가지중의하나이고생략시에 IN 이기본값이된다. IN: 프로시저호출시입력값으로주어지는입력인자 OUT: 프로시저실행후출력값을반환하는인자 INOUT: 입출력공용인자로프로시저호출시입력값을줄수있고, 실행후에출력값을반환할수있다 저장프로시저가실행될때, IN 인자를사용해서프로시저에값을전달하고, 프로시저는 OUT 인자를사용해서호출한루틴에값을반환한다. IN 인자는저장프로시저내에서상수처럼동작하므로, 프로시저내에서할당문을사용해인자에값을대입할수없으며 SELECT 문의 INTO 절에도사용할수없다. 인자는기본값을가질수있다. 저장프로시저가호출될때기본값이정의된인자에값을넘겨주지않을경우, 기본값이사용된다. 3 장의 지역변수선언 절참고 data_type 3 장의 지역변수선언 절참고 Exception Handler 9 장 Exception Handler 참고 CREATE PROCEDURE 문의실행 저장프로시저생성구문은텍스트편집기에서작성해서 isql 에붙여넣거나, isql 에서직접한라인씩입력할수도있다. 각 SQL 문, 저장프로시저제어문, 그리고블록 (END) 의끝에세미콜론 ( ; ) 을입력한다. isql 에서 CREATE PROCEDURE 문을실행할때는마지막 문의다음라인에반드시슬래시 ( / ) 를입력해야프로시저생성문이 저장프로시저 SQL 문 13

26 실행된다. CREATE PROCEDURE 문실행시컴파일오류가발생하지않고블록이성공적으로컴파일되면 Create Success 메시지가출력된다. 저장프로시저바디부분에대해서는다음장에서부터각각블록, 흐름제어문, 커서, Exception Handler 부분으로구분해서설명한다. 예제 예제 1 (IN 인자사용 ) CREATE TABLE t1 (i1 INTEGER UNIQUE, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES (1,1,1); INSERT INTO t1 VALUES (2,2,2); INSERT INTO t1 VALUES (3,3,3); INSERT INTO t1 VALUES (4,4,4); INSERT INTO t1 VALUES (5,5,5); SELECT * FROM t1; CREATE OR REPLACE PROCEDURE proc1 (p1 IN INTEGER, p2 IN INTEGER, p3 IN INTEGER) AS v1 INTEGER; v2 t1.i2%type; v3 INTEGER; SELECT * INTO v1, v2, v3 FROM t1 WHERE i1 = p1 AND i2 = p2 AND i3 = p3; IF v1 = 1 AND v2 = 1 AND v3 = 1 THEN UPDATE t1 SET i2 = 7 WHERE i1 = v1; ELSIF v1 = 2 AND v2 = 2 AND v3 = 2 THEN UPDATE t1 SET i2 = 7 WHERE i1 = v1; ELSIF v1 = 3 AND v2 = 3 AND v3 = 3 THEN UPDATE t1 SET i2 = 7 WHERE i1 = v1; ELSIF v1 = 4 AND v2 = 4 AND v3 = 4 THEN UPDATE t1 SET i2 = 7 WHERE i1 = v1; ELSE DELETE FROM t1; END IF; INSERT INTO t1 VALUES (p1+10, p2+10, p3+10); 14 Stored Procedures Manual

27 / isql> EXEC proc1 (2,2,2); Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. 예제 2 ( 기본값이있는인자사용 ) CREATE TABLE t1 (i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE OR REPLACE PROCEDURE proc1 (p1 IN INTEGER DEFAULT 1, p2 IN INTEGER DEFAULT 1, p3 IN INTEGER DEFAULT 1) AS INSERT INTO t1 VALUES (p1, p2, p3); / EXEC proc1; SELECT * FROM t1; EXEC proc1(2); SELECT * FROM t1; EXEC proc1(3,3); SELECT * FROM t1; EXEC proc1(4,4,4); isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I 저장프로시저 SQL 문 15

28 4 rows selected. 예제 3 CREATE OR REPLACE PROCEDURE proc1 (emp_id INTEGER, amount NUMBER(10,2)) AS UPDATE employee SET salary = salary + amount WHERE eno = emp_id; / isql> EXEC proc1(15, '250000'); Execute success. isql> SELECT * FROM employee WHERE eno=15; ENO ENAME EMP_JOB EMP_TEL DNO SALARY SEX BIRTH JOIN_DATE STATUS JHSEOUNG WEBMASTER M 1212 H 1 row selected. 예제 4 ( 출력, 입출력인자사용 ) CREATE TABLE t4(i1 INTEGER, i2 INTEGER); INSERT INTO t4 VALUES(1,1); INSERT INTO t4 VALUES(1,1); INSERT INTO t4 VALUES(1,1); INSERT INTO t4 VALUES(1,1); INSERT INTO t4 VALUES(1,1); CREATE OR REPLACE PROCEDURE proc1(a1 OUT INTEGER, a2 IN OUT INTEGER) AS SELECT COUNT(*) INTO a1 FROM t4 WHERE i2 = a2; / isql> VAR t3 INTEGER; isql> VAR t4 INTEGER; isql> EXEC :t4 := 1; 16 Stored Procedures Manual

29 Execute success. isql> EXEC proc1(:t3, :t4); Execute success. isql> PRINT t3; NAME TYPE VALUE T3 INTEGER 5 예제 5 CREATE OR REPLACE PROCEDURE proc1(p1 INTEGER, p2 IN OUT INTEGER, p3 OUT INTEGER) AS p2 := p1; p3 := p ; / isql> VAR v1 INTEGER; isql> VAR v2 INTEGER; isql> VAR v3 INTEGER; isql> EXEC :v1 := 3; Execute success. isql> EXEC proc1(:v1, :v2, :v3); Execute success. isql> PRINT VAR; [ HOST VARIABLE ] NAME TYPE VALUE V1 INTEGER 3 V2 INTEGER 3 V3 INTEGER 103 예제 6 ( 입출력인자사용 ) CREATE TABLE t3(i1 INTEGER); INSERT INTO t3 VALUES(1); INSERT INTO t3 VALUES(1); INSERT INTO t3 VALUES(1); CREATE OR REPLACE PROCEDURE proc1(a1 IN OUT INTEGER) AS 저장프로시저 SQL 문 17

30 SELECT COUNT(*) INTO a1 FROM t3 WHERE i1 = a1; / isql> VAR p1 INTEGER; isql> EXEC :p1 := 1; Execute success. isql> EXEC proc1(:p1); Execute success. isql> PRINT p1; NAME TYPE VALUE P1 INTEGER 3 예제 7 CREATE OR REPLACE PROCEDURE proc1(p1 INTEGER, p2 IN OUT INTEGER, p3 OUT INTEGER) AS p2 := p1 + p2; p3 := p ; / isql> VAR v1 INTEGER; isql> VAR v3 INTEGER; isql> EXEC :v1 := 3; Execute success. isql> EXEC :v2 := 5; Execute success. isql> EXEC proc1(:v1, :v2, :v3); Execute success. isql> PRINT VAR; [ HOST VARIABLE ] NAME TYPE VALUE V1 INTEGER 3 V2 INTEGER 8 V3 INTEGER Stored Procedures Manual

31 주의사항 CREATE PROCEDURE 구문에서는인자로 LOB 타입을사용할수없다. 저장프로시저 SQL 문 19

32 ALTER PROCEDURE 구문 alter_procedure_statement ::= ALTER PROCEDURE procedure_name user_name. COMPILE ; 기능 저장프로시저생성이후에이프로시저내에서참조하는테이블, 시퀀스등의데이터베이스오브젝트혹은이저장프로시저가호출하는다른저장프로시저, 저장함수등의정의가변경되어서, 현재이저장프로시저의실행계획으로는이를실행할수없는경우에이저장프로시저는무효한 (invalid) 상태라고한다. 이는프로시저내의 SQL 문을위한실행계획은프로시저생성시점에만들어졌고, 더이상최적화된상태도아니고실행할수도없기때문이다. 예를들면처음저장프로시저생성시존재하던인덱스가삭제된경우이전실행계획은인덱스를통해테이블에접근하도록계획되어있으므로이전의실행계획을이용해서테이블에접근할수없게된다. 무효한상태의프로시저가호출되면, 알티베이스서버는바로자동으로이를재컴파일한다. 그러나런타임시에컴파일하는것은심각한성능이슈를불러올수있으므로, 프로시저가무효한상태가되었을때수동으로컴파일하는것이좋다. ALTER PROCEDURE 문은사용자가명시적으로저장프로시저를컴파일때사용된다. 예제 예제 1 20 Stored Procedures Manual

33 CREATE TABLE t1 (i1 NUMBER, i2 VARCHAR(10), i3 DATE); CREATE OR REPLACE PROCEDURE proc1 (p1 IN NUMBER, p2 IN VARCHAR(10), p3 IN DATE) AS IF p1 > 0 then INSERT INTO t1 VALUES (p1, p2, p3); END IF; / isql> EXECUTE proc1 (1, 'seoul', '20-JUN-2002'); Execute success. isql> EXECUTE proc1 (-3, 'daegu', '21-APR-2002'); Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I seoul 20-JUN row selected. 예제 2 CREATE TABLE t1 (i1 NUMBER, i2 VARCHAR(10), i3 DATE DEFAULT SYSDATE); ALTER PROCEDURE proc1 COMPILE; isql> EXECUTE proc1 (2, 'incheon', SYSDATE); Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I incheon 28-DEC row selected. 저장프로시저 SQL 문 21

34 DROP PROCEDURE 구문 drop_procedure_statement ::= DROP PROCEDURE procedure_name user_name. ; 기능 데이터베이스에서저장프로시저를삭제하는구문이다. 삭제하고자하는프로시저를다른저장프로시저에서참조하고있다하더라도, 그프로시저는삭제된다. 삭제되고없는저장프로시저나함수가호출될때알티베이스는오류코드를반환한다. 예제 DROP PROCEDURE proc1; 22 Stored Procedures Manual

35 EXECUTE 구문 execute_procedure_statement ::= EXEC(UTE) procedure_name ; user_name. execute_function_statement ::= ( ) expression, EXEC(UTE) variable := function_name ; user_name. ( ) expression, 기능 저장프로시저또는저장함수를실행한다. 예제 CREATE OR REPLACE PROCEDURE proc1(eid INTEGER, amount NUMBER(10,2)) AS current_salary NUMBER(10,2); SELECT salary INTO current_salary FROM employee WHERE eno = eid; UPDATE employee SET salary = salary + amount 저장프로시저 SQL 문 23

36 WHERE eno = eid; / isql> SELECT * FROM employee WHERE eno = 15; ENO ENAME EMP_JOB EMP_TEL DNO SALARY SEX BIRTH JOIN_DATE STATUS JHSEOUNG WEBMASTER M 1212 H 1 row selected. isql> EXEC proc1(15, ); Execute success. isql> SELECT * FROM employee WHERE eno = 15; ENO ENAME EMP_JOB EMP_TEL DNO SALARY SEX BIRTH JOIN_DATE STATUS JHSEOUNG WEBMASTER M 1212 H 1 row selected. 24 Stored Procedures Manual

37 CREATE FUNCTION 구문 create_function::= CREATE FUNCTION function_name OR REPLACE user_name. ( parameter_declaration ) RETURN data_type AS IS, statement declaration_section END EXCEPTION exception_handler function_name parameter_declaration ::= parameter_name IN OUT data_type IN OUT DEFAULT := expression 기능 저장함수를새로생성하거나이미생성되어있는저장함수를대체한다. 저장프로시저 SQL 문 25

38 parameter_declaration 저장프로시저와마찬가지로, 저장함수의인자도 IN, IN/OUT, OUT 인자로정의할수있다. 인자타입과주의사항에대한설명은 CREATE PROCEDURE 구문설명의 parameter_declaration 을참고하기바란다. RETURN data_type 저장함수는저장프로시저와달리실행후하나의값을반환한다. 그러므로반드시반환데이터타입을명시해야한다. Declaration Section 3 장의 지역변수선언 절참고 Data Types Exception Handler CREATE FUNCTION 문의실행 3 장의 지역변수선언 절참고 9 장 Exception Handler 참고 저장함수생성구문의실행은저장프로시저구문과동일하다. CREATE PROCEDURE 절의 CREATE PROCEDURE 문의실행 을참고하기바란다. 예제 CREATE TABLE t1( seq_no INTEGER, user_id VARCHAR(9), rate NUMBER, start_date DATE, end_date DATE); INSERT INTO t1 VALUES(0, ' ', , '23-May-2002', '23-Apr-2002'); INSERT INTO t1 VALUES(0, ' ', 190, '23-Nov-2002', '23-Dec-2002'); INSERT INTO t1 VALUES(0, ' ', 100, '12-Dec-2001', '12-Jan-2001'); INSERT INTO t1 VALUES(0, ' ', 100, '11-Dec-2001', '11-Jan-2002'); 26 Stored Procedures Manual

39 INSERT INTO t1(seq_no, user_id, start_date, end_date) VALUES(0, ' ', '30-Oct-2001', '30-Nov-2001'); INSERT INTO t1 VALUES(0, ' ', , '30-Apr-2002', '30-May-2002'); INSERT INTO t1 VALUES(0, ' ', , '30-Apr-2002', '30-May-2002'); INSERT INTO t1 VALUES(1, ' ', 100, '30-Apr-2002', '30-May-2002'); INSERT INTO t1 VALUES(1, ' ', 115.0, '19-Jan-2002', '19-Mar-2002'); INSERT INTO t1 VALUES(0, ' ', 120.0, '27-Jan-2002', '27-Feb-2002'); INSERT INTO t1 VALUES(1, ' ', 150.0, '26-Nov-2001', '26-Dec-2001'); isql> SELECT * FROM t1; T1.SEQ_NO T1.USER_ID T1.RATE T1.START_DATE T1.END_DATE /05/23 00:00: /04/23 00:00: /11/23 00:00: /12/23 00:00: /12/12 00:00: /01/12 00:00: /12/11 00:00: /01/11 00:00: /10/30 00:00: /11/30 00:00: /04/30 00:00: /05/30 00:00: /04/30 00:00: /05/30 00:00: /04/30 00:00: /05/30 00:00: /01/19 00:00: /03/19 00:00: /01/27 00:00: /02/27 00:00: /11/26 00:00: /12/26 00:00:00 11 rows selected. CREATE OR REPLACE FUNCTION get_rate (p1 IN CHAR(30), p2 IN CHAR(30), p3 IN VARCHAR(9)) RETURN NUMBER AS v_rate NUMBER; 저장프로시저 SQL 문 27

40 SELECT NVL(SUM(rate), 0) INTO v_rate FROM (SELECT rate FROM t1 WHERE start_date = TO_DATE(p1) AND end_date = TO_DATE(p2) AND user_id = '000000' p3 AND seq_no = 0); RETURN v_rate; / isql> VAR res NUMBER; isql> EXECUTE :res := get_rate('30-apr-2002', '30-May-2002', '524'); Execute success. isql> PRINT res; NAME TYPE VALUE RES NUMBER 401 주의사항 CREATE PROCDURE 구문처럼, CREATE FUNCTION 구문에서도인자로 LOB 타입을사용할수없다. 또한반환값으로 LOB 타입을사용할수도없다. 28 Stored Procedures Manual

41 ALTER FUNCTION 구문 alter_function_statement ::= ALTER FUNCTION funtion_name user_name. COMPILE ; 기능 저장프로시저와마찬가지로, 저장함수생성후에함수내에서참조하는데이터베이스객체의정의가변경되어현재이저장함수의실행계획으로는더이상실행할수없는경우에이저장함수는무효한상태라고한다. ALTER FUNCTION 문은저장함수를명시적으로재컴파일하여유효한상태의실행계획을다시생성하기위해사용된다. 더자세한설명은 ALTER PROCECURE 절을참고한다. 예제 ALTER FUNCTION get_dept_name COMPILE; 저장프로시저 SQL 문 29

42 DROP FUNCTION 구문 drop_function_statement ::= DROP FUNCTION function_name user_name. ; 기능 저장함수를삭제하는구문이다. 삭제하고자하는저장함수를다른저장프로시저또는저자함수에서참조하고있다하더라도, 그저장함수는삭제된다. 이미삭제된저장함수를참조하고있던임의의저장프로시저또는저장함수가실행될때알티베이스는오류를출력한다. 예제 DROP FUNCTION get_dept_name; 30 Stored Procedures Manual

43 3. 저장프로시저블록 저장프로시저와저장함수는한개이상의블록으로구성된다. 이장에서는블록을사용해서저장프로시저내에절차화된프로그램을작성하는방법을설명한다. 저장프로시저블록 31

44 저장프로시저블록 구문 block ::= << label_name >> DECLARE declaration_section statement EXCEPTION exception_handler END label_name ; statement ::= << label_name >> print_statement sql_statement control_flow_statement open_cursor_statement open_for_statement fetch_statement close_cursor_statement assignment_statement raise_statement return_statement block 32 Stored Procedures Manual

45 sql_statement ::= select_into_statement insert_statement delete_statement update_statement commit_statement rollback_statement enqueue_statement execute_imme_statement 블록은크게선언부 (Declare Section), 블록바디 (Block Body), 예외처리부 (Exception Handler Section) 의세부분으로나뉘어진다. DECLARE,, EXCEPTION 등의키워드뒤에는세미콜론을사용하지않지만 END 및기타모든프로시저내의명령문뒤에는세미콜론이있어야한다. 저장프로시저의코드에주석처리를할수있다. 단일행주석에는 -- 를문장앞에붙이고, 여러행을주석처리할경우는 /* 와 */ 사이에주석처리할문장이놓이도록작성한다. 이장에서는선언부와블록바디에사용할수있는구문중 SELECT INTO 문, 변수할당문, LABEL 문, PRINT 문, RETURN 문에대해서설명한다. 저장프로시저내에서사용가능한흐름제어문, 커서관련문, 예외처리에관련된내용은다음장에서순서대로설명하고있다. 그외 SQL 문들에대한자세한내용은 SQL Reference 을참조한다. 선언부 선언부는메인블록에서는 AS 와 키워드사이에위치하며, 하위블록에서는 DECLARE 와 키워드사이에위치한다. 해당블록내에서사용하는지역변수, 커서와사용자정의예외등을선언한다. 저장프로시저블록 33

46 이장에서는지역변수만을설명한다. 커서와예외처리는 5 장커서와 9 장예외처리에서각각설명한다. 블록바디 과 END 사이의부분으로 SQL 문과흐름제어문을포함한다. 블록바디내에기술가능한 SQL 문과흐름제어문은다음과같다. DML 문 : SELECT/INSERT/DELETE/UPDATE 트랜잭션처리문 : COMMIT/ROLLBACK 흐름제어문 : IF, CASE, FOR, LOOP, WHILE, EXIT, CONTINUE, NULL 할당문 출력문 : PRINT, RETURN 커서관련문 : OPEN, FETCH, CLOSE, Cursor FOR LOOP 동적 SQL 문 : EXECUTE IMMEDIATE 예외처리구문 : RAISE, RAISE_APPLICATION_ERROR 저장프로시저의장점중하나는 SQL 문과달리블록을사용하여명령문을중첩할수있다는점이다. 명령문을사용할수있는위치에는블록을중첩할수있으므로, 명령문을블록으로만들어서중첩시키면된다. 예외처리부 EXCEPTION 과 END 사이의부분으로저장프로시저또는함수실행중에오류가발생했을때처리할루틴을기술한다. 34 Stored Procedures Manual

47 지역변수선언 구문 declaration_section ::= variable_declaration constant_declaration cursor_declaration exception_declaration variable_declaration ::= variable_name data_type DEFAULT := expression constant_declaration ::= DEFAULT constant_name CONSTANT data_type expression := data_type ::= sql_data_type type_attribute rowtype_attribute 저장프로시저블록 35

48 type_attreibute ::= table_name. column_name record_name % TYPE variable_name rowtype_attribute ::= cursor_name table_name % ROWTYPE 기능 variable_name 변수의이름을명시할때사용된다. 변수의이름은하나의블록범위내에서유일해야한다. 칼럼과같은이름을가지는변수를 SQL 문장내에서사용할경우, 이것은칼럼명으로인식된다. 다음의예에서 eno 는칼럼명으로인식되어 employee 테이블의모든레코드가삭제된다. DECLARE eno INTEGER := 100; DELETE FROM employee WHERE eno = eno; 다음과같은방법으로모호성을없앨수있다. 36 Stored Procedures Manual

49 <<del_block>> DECLARE eno INTEGER := 100; DELETE FROM employee WHERE eno = del_block.eno; 블록이름에관한설명은이장의 LABEL 절을참고한다. data_type 변수의데이터타입을명시한다. 저장프로시저내에서사용가능한데이터타입은아래와같다 : SQL 문에서사용할수데이터타입 BOOLEAN 타입 %TYPE 속성을사용해서이미데이터타입이지정된칼럼이나변수와같은타입사용 %ROWTYPE 속성을사용해서여러개의칼럼이모인레코드타입을정의 사용자정의타입 %TYPE 과 %ROWTYPE 속성은테이블정의가변경될때마다저장프로시저내에서코드를변경해야하는번거로움을예방한다. 즉, 칼럼의데이터타입이변경될때, %TYPE 속성을사용해서정의된변수는자동으로변경된타입에맞추어진다. 이는데이터의독립성을실현하고유지보수비용을낮추는데기여한다. CONSTANT 이옵션은특정변수를값을할당할수없는상수로사용하고자하는경우에사용할수있다. 이렇게정의된변수는읽기전용변수로만사용할수있다. 다음과같이 max_val 을선언하면 max_val 에는임의의값을할당할수없고선언시할당한 100 의값을가지는상수처럼취급된다. max_val CONSTANT integer := 100; DEFAULT 다음과같이변수선언시초기값을설정할때사용된다. curr_val INTEGER DEFAULT 100; count_val INTEGER := 0; Cursor Declaration 저장프로시저블록 37

50 5 장의 CURSOR 절참고 Exception Declaration 9 장의 EXCEPTION 절참고 중첩블록및변수의범위 선언부에명시한변수들의영향력은자신이선언된 BLOCK 문의 에서시작되고 END 에서종료된다. 만약 block2 가 block1 내에정의되어있고각각의블록내에같은이름을가지는 v_result 변수를선언하였다면, block2 의밖에서사용되는 v_result 는 block1 에정의된변수를참조하고 block2 내에서사용된 v_result 는 block2 에서선언한변수이다. 아래에 block2 ( 중첩블록 ) 에있는변수 y 는 block1 ( 외부블록 ) 에있는변수 x 를참조할수있지만, 변수 x 는변수 y 를참조할수없다. 중첩블록내에외부블록에있는변수 x 와동일한이름이주어지면그값은중첩블록내에서만유효하다. /* start of block1 */ DECLARE v_result¹ integer; x integer; Scope of x... v_result¹ := 1;... /* start of sub-block (block2) */ DECLARE v_result² integer; y number; Area can refer to v_result¹ Scope of y... v_result² := 2;... /* end of block2 */... v_result¹ := 3;... /* end of block1 */ Area can refer to v_result² Area can refer to v_result¹ 38 Stored Procedures Manual

51 제약조건 다음과같은기능은변수선언부에서지원하지않는기능들이다. 변수에 NOT NULL 속성을지정할수없다. 여러개의변수들을한꺼번에선언할수없다. 즉다음과같이선언할수없다. i, j, k INTEGER; 예제 %TYPE 사용 DECLARE my_title books.title%type; %ROWTYPE 사용 my_title 은 books 테이블의 title 칼럼과같은데이터타입을가지는변수로정의된다. DECLARE dept_rec department%rowtype dept_rec 은레코드타입의변수로서 department 테이블또는 department 라는이름의커서와동일한레코드타입을가지게된다. 예제 1 CONSTANT 와 %ROWTYPE 을사용해서변수를선언하는예제이다. CREATE TABLE t1(i1 INTEGER, i2 INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS v1 constant INTEGER := 1; v2 constant t1.i1%type := 1; INSERT INTO t1 VALUES (v1, v2); / EXEC proc1; isql> SELECT * FROM t1; T1.I1 T1.I2 저장프로시저블록 39

52 row selected. --DROP TABLE t1; CREATE TABLE t1 (i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES(1,1,1); CREATE OR REPLACE PROCEDURE proc1 AS r1 t1%rowtype; INSERT INTO t1 VALUES(3,3,3); <<s>> DECLARE r1 t1%rowtype; SELECT i1, i2, i3 INTO s.r1.i1, s.r1.i2, s.r1.i3 FROM t1 WHERE i1 = 1; INSERT INTO t1 VALUES (s.r1.i1, s.r1.i2, s.r1.i3); / isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. 예제 2 %ROWTYPE 속성을사용하는예제이다. CREATE TABLE emp( eno INTEGER, ename CHAR(10), emp_job CHAR(15), join_date DATE, salary NUMBER(10,2), 40 Stored Procedures Manual

53 dno BYTE(2)); CREATE TABLE emp401( eno INTEGER, ename CHAR(10), emp_job CHAR(15), join_date DATE, leave_date DATE, salary NUMBER(10,2), dno BYTE(2), fund NUMBER(10,2) DEFAULT 0); INSERT INTO emp VALUES (10, 'DKLEE', 'ENGINEER', '01-Jul-2000', , BYTE'D001'); INSERT INTO emp VALUES (20, 'SWMYUNG', 'MANAGER', '01-Nov-1999', , BYTE'C002'); CREATE OR REPLACE PROCEDURE proc1(p1 INTEGER) AS DECLARE emp_rec emp%rowtype; SELECT * INTO emp_rec FROM emp WHERE eno = p1; INSERT INTO emp401(eno, ename, emp_job, join_date, leave_date, salary, dno) VALUES(emp_rec.eno, emp_rec.ename, emp_rec.emp_job, emp_rec.join_date, sysdate, emp_rec.salary, emp_rec.dno); / isql> EXEC proc1(10); Execute success. isql> SELECT * FROM emp401; EMP401.ENO EMP401.ENAME EMP401.EMP_JOB EMP401.JOIN_DATE EMP401.LEAVE_DATE EMP401.SALARY EMP401.DNO EMP401.FUND DKLEE ENGINEER 2000/07/01 00:00: /01/27 16:26: D001 0 저장프로시저블록 41

54 42 Stored Procedures Manual 1 row selected.

55 SELECT INTO 구문 select_into_statement ::= select_list INTO record_name variable_name ; FROM rest_of_select_statement ; select_list 와 rest_of_select_statement 는 SELECT 구문의문법과동일하므로 SQL Reference 을참고한다. 기능 저장프로시저에서 SELECT 문을사용할경우, SELECT 문은 INTO 절을포함해야한다. 저장프로시저또는함수내에서 INTO 절을가지는 SELECT 문은하나의레코드만검색할수있다. INTO 절이사용된 SELECT 구문이여러행을반환하거나한행도반환하지않으면오류가발생한다. SELECT 절의 select_list 와 INTO 절의상응하는 variable_name 은개수가동일해야하며호환가능한데이터타입이어야한다. %ROWTYPE 속성으로정의한변수를 INTO 절에사용하는경우에도 %ROWTYPE 변수내의칼럼의개수와 select_list 의칼럼의개수가동일해야하며, 상응하는칼럼의데이터타입은호환가능해야한다. 저장프로시저는표준예외사항이발생하는경우오류를발생시킨다. NO_DATA_FOUND 및 TOO_MANY_ROWS 등의예외 저장프로시저블록 43

56 사항을사용하여블록의예외처리부에서오류를처리할수있다. 예외처리에대한상세한설명은 9 장예외처리를참조한다. 예제 예제 1 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES(1,1,1); CREATE OR REPLACE PROCEDURE proc1 AS v1 INTEGER; r1 t1%rowtype; INSERT INTO t1 VALUES (3,3,3); <<s>> DECLARE v1 proc1.r1.i1%type; r1 t1%rowtype; SELECT i1,i2,i3 INTO s.r1.i1, s.r1.i2, s.r1.i3 FROM t1 WHERE i1 = 1; INSERT INTO t1 VALUES(s.r1.i1, s.r1.i2, s.r1.i3); / isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. 예제 2 44 Stored Procedures Manual

57 CREATE TABLE t1 (i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES(100, 100, 100); CREATE SEQUENCE seq1; CREATE SEQUENCE seq2; CREATE SEQUENCE seq3; CREATE OR REPLACE PROCEDURE proc1 AS <<seq1>> DECLARE nextval INTEGER; nextval := 10; INSERT INTO t1 VALUES (seq1.nextval,0,0); / CREATE OR REPLACE PROCEDURE proc2 AS INSERT INTO t1 VALUES (seq1.nextval, seq2.nextval, seq3.nextval); INSERT INTO t1 VALUES (seq1.nextval, seq2.nextval, seq3.nextval); INSERT INTO t1 VALUES (seq1.nextval, seq2.nextval, seq3.nextval); / CREATE OR REPLACE PROCEDURE proc3 AS v1 INTEGER; v2 INTEGER; v3 INTEGER; SELECT seq1.currval, seq2.nextval, seq3.nextval INTO v1, v2, v3 FROM t1 WHERE i1 = 100; INSERT INTO t1 VALUES (v1, v2, v3); SELECT seq1.currval, seq1.nextval, seq1.currval INTO v1, v2, v3 FROM t1 WHERE i1 = 100; INSERT INTO t1 VALUES (v1, v2, v3); 저장프로시저블록 45

58 SELECT seq1.currval, seq2.nextval, seq3.nextval INTO v1, v2, v3 FROM t1 WHERE i1 = 100; INSERT INTO t1 VALUES (v1, v2, v3); / EXEC proc1; SELECT * FROM t1; EXEC proc2; SELECT * FROM t1; EXEC proc3; SELECT * FROM t1; EXEC proc2; SELECT * FROM t1; EXEC proc3; isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. 예제 3 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE TABLE t2(i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES (1,1,1); INSERT INTO t1 VALUES (2,2,2); 46 Stored Procedures Manual

59 CREATE OR REPLACE PROCEDURE proc1 AS v1 INTEGER; r1 t1%rowtype; SELECT i1 INTO v1 FROM t1 WHERE i1 = 1; SELECT * INTO r1 FROM t1 WHERE i1 = 1; INSERT INTO t2 VALUES (v1, r1.i2, r1.i3); <<s>> DECLARE r1 t1%rowtype; SELECT i1, i2, i3 INTO s.r1.i1, s.r1.i2, s.r1.i3 FROM t1 WHERE i1 = 2; INSERT INTO t2 VALUES (s.r1.i1, s.r1.i2, s.r1.i3); / isql> EXEC proc1; Execute success. isql> SELECT * FROM t2; T2.I1 T2.I2 T2.I rows selected. 예제 4 CREATE TABLE t3(i1 INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS max_qty orders.qty%type; SELECT MAX(qty) INTO max_qty FROM orders; INSERT INTO t3 VALUES(max_qty); / 저장프로시저블록 47

60 isql> exec proc1; Execute success isql> SELECT * FROM t3; T3.I row selected. 예제 5 CREATE TABLE delayed_processing( cno CHAR(14), order_date DATE); CREATE OR REPLACE PROCEDURE proc1 AS de_cno CHAR(14); de_order_date DATE; INSERT INTO delayed_processing SELECT cno, order_date INTO de_cno, de_order_date FROM orders WHERE processing = 'D'; / isql> EXEC proc1; Execute success. isql> SELECT * FROM delayed_processing; DELAYED_PROCESSING.CNO DELAYED_PROCESSING.ORDER_DATE /11/29 00:00: /11/29 00:00:00 2 rows selected. 48 Stored Procedures Manual

61 할당문 구문 assignment_statement ::= variable_name parameter_name := record_name variable_name. column_name expression ; SET parameter_name = record_name. column_name 기능 지역변수, OUT 또는 IN/OUT 형의인자에값을할당하고자할때사용하는할당문이다. 다음의두가지방법을사용해서변수또는인자에값을할당할수있다. := 연산자사용 variable_name := value; parameter_name := value; SET 키워드사용 SET variable_name = value; SET parameter_name := value; %ROWTYPE 속성을사용해서정의된 RECORD 타입변수의각칼럼값은 record_variable_name.field_name 으로참조할수있다. 저장프로시저블록 49

62 예제 예제 1 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS i INTEGER; i := 5; WHILE i <= 10 LOOP INSERT INTO t1 VALUES (i, i+1, i+2); i := i + 1; END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. 예제 2 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE OR REPLACE FUNCTION plus20(p1 IN INTEGER) RETURN INTEGER AS v1 INTEGER; v1 := p1 + 20; RETURN v1; 50 Stored Procedures Manual

63 / CREATE OR REPLACE PROCEDURE proc1 AS v1 INTEGER; in_arg INTEGER; in_arg := 80; v1 := plus20(in_arg); INSERT INTO t1 VALUES (v1, v1, v1); / isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I row selected. 저장프로시저블록 51

64 LABEL LABLE 문은저장프로시저내부의특정위치에명칭을지정하는데사용된다. LABEL 은블록내에다음과같이지정할수있다. << User_defined_label_name >> 기능 사용자가정의한 LABEL 명은다음 3 가지경우에사용된다. 같은이름의여러변수들의범위를제한하거나, 변수이름과칼럼이름이같아서발생하는모호성을없애기위한경우 중첩된 LOOP 에서빠져나오고싶은경우 GOTO 문장을사용하는경우 제약조건 1. 동일블록내에같은이름의 LABEL 이존재하면안된다. 아래예제의경우 LABEL1 이동일블록내에두번지정되어컴파일시에러가출력된다. CREATE OR REPLACE PROCEDURE PROC1 AS V1 INTEGER; << LABEL1>> V1 := 1; <<LABEL1>> V1 := V1 + 1; 2. 같은이름을가지는변수의범위를제한하기위하여사용하는경우, 반드시 DECLARE 문위에 LABEL 을선언해야한다. 단, LABEL 을여러개선언하는것은허용된다. 아래예제에서는 (1) 에서선언한변수 V1 이 2 번참조된다. CREATE OR REPLACE PROCEDURE PROC1 AS V1 INTEGER; <<LABEL1>> --- LABLE 지정 52 Stored Procedures Manual

65 / <<LABEL2>> DECLARE V1 INTEGER;...(1) <<LABEL3>> DECLARE V1 INTEGER;...(2) LABEL1.V1 := 1; LABEL2.V1 := 2; LABEL3.V1 := 3; -- (1) 의 V1 참조 -- (1) 의 V1 참조 -- (2) 의 V1 참조 아래예제의경우 DECLARE 문위에 LABEL 을지정하지않아서에러가나게된다. CREATE OR REPLACE PROCEDURE PROC1 AS V1 INTEGER; <<LABEL1>> V1 := 1; DECLARE V1 INTEGER; LABEL1.V1 := 1; --- ERROR 의경우와유사하게중첩된 LOOP 에서빠져나올때사용하는경우반드시 LOOP 시작직전에 LABEL 을선언해야한다. LOOP 전에 LABEL 을여러개선언하는것은허용된다. CREATE OR REPLACE PROCEDURE PROC1 AS V1 INTEGER; V1 := 0; <<LABEL1>> <<LABEL2>> FOR I IN LOOP V1 := V1 + 1; FOR I IN LOOP V1 := V1 + 1; EXIT LABEL1 WHEN V1 = 30; 저장프로시저블록 53

66 / END LOOP; END LOOP; 아래예제는한 LABEL 이 LOOP 시작직전에선언되지않은경우이다. 이 LABEL 을이용해서는중첩된 LOOP 를빠져나올수없으므로, 저장프로시저컴파일시에러가발생하게된다. CREATE OR REPLACE PROCEDURE PROC1 AS / V1 INTEGER; <<LABEL1>> V1 := 0; <<LABEL2>> FOR I IN LOOP V1 := V1 + 1; FOR I IN LOOP V1 := V1 + 1; EXIT LABEL1 WHEN V1 = 30; -- ERROR END LOOP; END LOOP; 54 Stored Procedures Manual

67 PRINT 구문 print_statement ::= PRINT PRINTLN ( string ) ; 기능 PRINT 구문은저장프로시저실행시에사용자가원하는텍스트를해당프로시저를호출한클라이언트에게출력한다. PRINT 구문은주로디버깅및테스트목적으로사용하도록알티베이스가제공하는시스템프로시저이다. PRINTLN 은 PRINT 와동일하나출력메시지의마지막에개행문자 ( 윈도우는 \r\n, 유닉스는 \n ) 를붙여서출력한다. PRINT, PRINTLN 의소유자는 SYSTEM_ 이므로사용시아래처럼이를명시해도된다 : SYSTEM_.PRINTLN( Hello World ); 그러나이들에대한 PUBLIC 시노님이기본적으로생성되어있기때문에 SYSTEM_ 을굳이명시하지않아도된다. String 클라이언트로출력할문자열을기술한다. 사용자메시지출력시문자열과함께변수값등을출력하고싶은경우에는예제 2 와같이문자열연결연산자인 를사용해서하나의문자열로만들어서출력하면된다. 저장프로시저블록 55

68 예제 예제 1 CREATE OR REPLACE PROCEDURE proc1 AS v1 BIGINT; v1 := BIGINT' '; system_.println ('1'); system_.println (v1); system_.println ('2'); / isql> EXEC proc1; Execute success. 예제 2 CREATE OR REPLACE PROCEDURE proc1 AS eno_count INTEGER; SELECT COUNT(eno) INTO eno_count FROM employee; println('the NUMBER of Employees: ' eno_count); / isql> EXEC proc1; The NUMBER of Employees: 20 Execute success. 예제 3 다음예제는쿼리결과를형식에맞춰출력하기위해 PRINT 와 PRINTLN 구문과함께 loop 를사용하는방법을보여준다. CREATE OR REPLACE PROCEDURE showprocedures AS CURSOR c1 IS 56 Stored Procedures Manual

69 SELECT SYSTEM_.sys_procedures_.proc_name, decode(system_.sys_procedures_.object_type, 0, 'Procedure',1,'Function') FROM system_.sys_procedures_ ; v1 CHAR(40); v2 CHAR(20); OPEN c1; SYSTEM_.PRINTLN(' '); SYSTEM_.PRINT('Proc_Name'); SYSTEM_.PRINTLN(' Procedure/Function'); SYSTEM_.PRINTLN(' '); LOOP FETCH C1 INTO v1, v2; EXIT WHEN C1%NOTFOUND; PRINT(' '); PRINT(v1); PRINTLN(v2); END LOOP; PRINTLN(' '); CLOSE c1; / isql> EXEC showprocedures; Proc_Name Procedure/Function PRINT PRINTLN.. Procedure Procedure SHOWPROCEDURES Execute success. Procedure 저장프로시저블록 57

70 RETURN 구문 return_statement ::= RETURN expression ( ) ; 기능 저장프로시저의수행을도중에중단하거나, 저장함수에서값을반환하고수행을중단하려하는경우에사용하는제어문이다. 저장프로시저는 RETURN 문에반환할값을지정하게되면에러가발생한다. 반면저장함수는항상값을반환해야하기때문에 RETURN 문에반환할값을명시하여야한다. expression 저장함수의경우에반환할값을기술한다. 반환값은연산식의형태로도기술할수있다. 예제 예제 1 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES(1,1,1); CREATE OR REPLACE FUNCTION times_half(p1 IN INTEGER) RETURN INTEGER AS 58 Stored Procedures Manual

71 RETURN p1 / 2; / isql> SELECT times_half(times_half(8)) FROM t1; TIMES_HALF(TIMES_HALF(8)) row selected. 예제 2 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES(1,1,1); INSERT INTO t1 VALUES(10,10,10); INSERT INTO t1 VALUES(100,100,100); CREATE OR REPLACE FUNCTION max_all_val RETURN INTEGER AS v1 INTEGER; SELECT MAX(i1) INTO v1 FROM t1; RETURN v1; / isql> SELECT max_all_val FROM t1; MAX_ALL_VAL rows selected. 예제 3 CREATE TABLE t4(i1 INTEGER, i2 INTEGER); INSERT INTO t4 VALUES(3, 0); INSERT INTO t4 VALUES(2, 0); INSERT INTO t4 VALUES(1, 0); INSERT INTO t4 VALUES(0, 0); 저장프로시저블록 59

72 CREATE OR REPLACE FUNCTION func_plus_10(p1 INTEGER) RETURN INTEGER AS RETURN p1+10; / isql> SELECT func_plus_10(i1) FROM t4; FUNC_PLUS_10(I1) rows selected. 60 Stored Procedures Manual

73 4. 흐름제어 흐름제어 61

74 개요 이장은저장프로시저바디내에서의흐름제어방법을설명한다. 구문 control_flow_statement ::= if_statement case_statement simple_loop_statement while_loop_statement for_loop_statement exit_statement continue_statement null_statement 저장프로시저에서사용할수있는흐름제어문은다음과같다. 조건분기문인 IF문과 CASE문 조건을만족할때반복수행하는 LOOP문, WHILE문과 FOR문 반복수행문의흐름을제어하는 EXIT문와 CONTINUE문 아무것도수행하지않음을명시적으로나타낼수있는 NULL문 특정위치로이동할수있는 GOTO문 제약사항 부질의 (subquery) 가포함된조건은 IF 문또는 CASE 문의조건으로사용될수없다. 62 Stored Procedures Manual

75 IF 구문 if_statement ::= IF condition THEN statement ELS(E)IF condition THEN statement ELSE statement END IF ; 기능 조건을만족하는경우와그렇지않은경우에따라처리흐름을분기하는조건분기문이다. IF 절은조건은검사해서 true 이면 THEN 절로제어를이동하고, false 이거나 NULL 이면 ELSE 절로제어를이동한다. condition 조건절에는 SQL 문의 WHERE 절에서사용가능한모든술어 (predicate) 들을사용할수있다. 지원하는술어들에대한상세내용은 SQL Reference 의 SELECT 구문을참조한다. ELS(E)IF ELS(E)IF 절의경우이전의 IF 문의조건과는다른조건을명시할수있다. 흐름제어 63

76 ELSIF 는한단어이며하나의 IF 문내에여러개의 ELS(E)IF 절을사용할수있다. ELSE 앞서 IF 와 ELS(E)IF 에서열거된모든조건을만족하지않는경우 ELSE 절의문장이수행된다. ELSE 절은명시하거나, 하나의 IF 문내에한번만기술가능하다. 중첩 IF 문 IF 문은다른 IF 문내에중첩되어기술할수있다. 즉, IF 문은다른 IF, ELS(E)IF 또는 ELSE 문의결과로수행되는일련의작업내에포함될수있다. 각 IF 문은 END IF 로종료해야한다. 예제 예제 1 CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1 IS SELECT eno, emp_job, salary FROM employee; emp_id employee.eno%type; e_job employee.emp_job%type; e_salary employee.salary%type; OPEN c1; LOOP FETCH c1 INTO emp_id, e_job, e_salary; EXIT WHEN c1%notfound; IF e_salary IS NULL THEN IF e_job = 'CEO' THEN e_salary := ; ELSIF e_job = 'MANAGER' THEN e_salary := ; ELSIF e_job = 'ENGINEER' THEN e_salary := ; ELSIF e_job = 'PROGRAMMER' THEN e_salary := ; ELSE e_salary := ; END IF; 64 Stored Procedures Manual

77 UPDATE employee SET salary = e_salary WHERE eno = emp_id; END IF; END LOOP; CLOSE c1; / isql> SELECT eno, emp_job FROM employee WHERE salary IS NULL; ENO EMP_JOB CEO 8 MANAGER 20 SALESMAN 3 rows selected. isql> EXEC proc1; Execute success. isql> SELECT eno, emp_job, salary FROM employee WHERE eno=1 OR eno=8 OR eno=20; ENO EMP_JOB SALARY CEO MANAGER SALESMAN rows selected. 예제 2 CREATE TABLE t1 (i1 VARCHAR(20), i2 NUMBER, i3 DATE); CREATE TABLE t2 (i1 VARCHAR(20), i2 NUMBER, i3 DATE); INSERT INTO t1 VALUES ('21-JUL-2001', 2, '01-JUL-2000'); INSERT INTO t2 VALUES (NULL,NULL,'01-FEB-1990'); INSERT INTO t2 VALUES (NULL,NULL,'02-FEB-1990'); CREATE OR REPLACE FUNCTION func2 (p1 IN DATE, p2 IN CHAR(30)) RETURN NUMBER AS RETURN (TO_NUMBER(TO_CHAR(p1, 'dd')) + TO_NUMBER(p2)); / 흐름제어 65

78 CREATE OR REPLACE FUNCTION func1 (p1 IN DATE, p2 IN DATE) RETURN DATE AS IF p1 >= p2 THEN RETURN add_months(p1, 3); ELSE RETURN add_months(p1, 4); END IF; / CREATE OR REPLACE PROCEDURE proc1 AS v1 VARCHAR(20); v2 NUMBER; v3 DATE; SELECT i1, func2(to_date(i1), TO_CHAR(i3, 'yyyy')), i3 INTO v1,v2,v3 FROM t1 WHERE i2 = 2; INSERT INTO t2 VALUES (v1,v2,v3); IF v2 not in (2001, 2002, 2003) AND v1 = '21-JUL-2001' THEN UPDATE t2 SET i1 = func1(v1, '17-JUL-2001'), i2 = nvl(i2, 10) WHERE i3 = '01-FEB-1990'; UPDATE t2 SET i1 = func1(v1, '27-JUL-2001'), i2 = nvl(i2, 10*2) WHERE i3 = '02-FEB-1990'; END IF; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t2; T2.I1 T2.I2 T2.I JUL /07/01 00:00:00 66 Stored Procedures Manual

79 21-OCT /02/01 00:00:00 21-NOV /02/02 00:00:00 3 rows selected. 예제 3 CREATE TABLE payroll( eno INTEGER, bonus NUMBER(10, 2)); CREATE OR REPLACE PROCEDURE proc1 AS DECLARe CURSOR c1 IS SELECT DISTINCT(eno), SUM(qty) FROM orders GROUP BY eno; emp_id orders.eno%type; sum_qty orders.qty%type; bonus NUMBER(10, 2); OPEN c1; IF c1%isopen THEN LOOP FETCH c1 INTO emp_id, sum_qty; EXIT WHEN c1%notfound; IF sum_qty > THEN bonus := 1000; ELSIF sum_qty > THEN bonus := 500; ELSE bonus := 200; END IF; INSERT INTO payroll VALUES(emp_id, bonus); END LOOP; END IF; / isql> EXEC proc1; Execute success. isql> SELECT DISTINCT(eno), SUM(qty) sum FROM orders GROUP BY eno; ENO SUM 흐름제어 67

80 rows selected. isql> SELECT * FROM payroll; PAYROLL.ENO PAYROLL.BONUS rows selected. 68 Stored Procedures Manual

81 CASE 구문 case_statement_1 ::= CASE WHEN condition THEN statement ELSE statement END CASE ; case_statement_2::= CASE case_variable WHEN when_value THEN statement ELSE statement END CASE ; 기능 특정변수의값에따라서처리경로를결정하는조건분기문이다. IF 문과동일한기능이지만 CASE 문을사용하면프로그램의가독성을높일수있다. CASE 문은위의다이어그램에서보여주듯이다음두가지가있다. case_statement_1: 조건식이참일때에특정한문장을수행하는방식 흐름제어 69

82 case_statemen_2: 하나의변수가특정한값이되었을때에특정한문장을수행하는방식 단, 하나의 CASE 문에서이두가지방식을혼용할수없다. CASE 절을모두만족하지못하면 ELSE 절의문장을수행하게되며, ELSE 절이없는경우에는어떠한문장도수행하지않는다. condition 검사할조건을기술한다. SELECT 구문의 WHERE 절과같이술어문으로명시한다. case_variable 저장프로지저의처리를분기시키는기준이되는변수명을기술한다. when_value case_variable 변수와비교할실제상수값을기술한다. ELSE CASE 조건식이모두거짓이되었을때수행해야할처리구문을 ELSE 절에기술한다. ELSE 절은없어도상관없으며하나의 CASE 문에한번사용가능하다. 조건식이모두거짓이되었음에도 ELSE 절이없을경우 CASE 문은어떠한문장도수행하지않고지나간다. 예제 예제 1 CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1 IS SELECT eno, emp_job, salary FROM employee; emp_id employee.eno%type; e_job employee.emp_job%type; e_salary employee.salary%type; OPEN c1; LOOP 70 Stored Procedures Manual

83 FETCH c1 INTO emp_id, e_job, e_salary; EXIT WHEN c1%notfound; IF e_salary IS NULL THEN CASE WHEN e_job = 'CEO' THEN e_salary := ; WHEN e_job = 'MANAGER' THEN e_salary := ; WHEN e_job = 'ENGINEER' THEN e_salary := ; WHEN e_job = 'PROGRAMMER' THEN e_salary := ; ELSE e_salary := ; END CASE; UPDATE employee SET salary = e_salary WHERE eno = emp_id; END IF; END LOOP; CLOSE c1; / isql> EXEC proc1; Execute success. isql> SELECT eno, emp_job, salary FROM employee WHERE eno=1 OR eno=8 OR eno=20; ENO EMP_JOB SALARY CEO MANAGER SALESMAN rows selected. 예제 CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1 IS SELECT eno, emp_job, salary FROM employee; emp_id employee.eno%type; e_job employee.emp_job%type; e_salary employee.salary%type; OPEN c1; 흐름제어 71

84 LOOP FETCH c1 INTO emp_id, e_job, e_salary; EXIT WHEN c1%notfound; IF e_salary IS NULL THEN CASE e_job WHEN 'CEO' THEN e_salary := ; WHEN 'MANAGER' THEN e_salary := ; WHEN 'ENGINEER' THEN e_salary := ; WHEN 'PROGRAMMER' THEN e_salary := ; ELSE e_salary := ; END CASE; UPDATE employee SET salary = e_salary WHERE eno = emp_id; END IF; END LOOP; CLOSE c1; / isql> SELECT eno, emp_job FROM employee WHERE salary IS NULL; ENO EMP_JOB CEO 8 MANAGER 20 SALESMAN 3 rows selected. isql> EXEC proc1; Execute success. isql> SELECT eno, emp_job, salary FROM employee WHERE eno=1 OR eno=8 OR eno=20; ENO EMP_JOB SALARY CEO MANAGER SALESMAN rows selected. 72 Stored Procedures Manual

85 LOOP 구문 loop_statement:= << label_name >> LOOP statement END LOOP label_name ; 기능 LOOP 구문은조건을따로지정하지않고반복적으로구문 ( 들 ) 을수행하고자하는경우에사용된다. 그러나 LOOP 구문에서 EXIT 문을사용하지않게되면무한 LOOP 에빠져서시스템에문제를일으킬수있으므로주의한다. 예제 CREATE TABLE item(id INTEGER, counter NUMBER(2)); CREATE OR REPLACE PROCEDURE proc1 AS DECLARE v_id item.id%type := 501; v_counter NUMBER(2) := 1; LOOP INSERT INTO item VALUES(v_id, v_counter); 흐름제어 73

86 v_counter := v_counter + 1; EXIT WHEN v_counter > 10; END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM item; ITEM.ID rows selected. ITEM.COUNTER 74 Stored Procedures Manual

87 WHILE LOOP 구문 while_loop_statement ::= << label_name >> WHILE condition LOOP statement END LOOP label_name ; 기능 조건이참인경우만 LOOP 을수행하고자할때사용하는반복문이다. 만약처음부터이조건이참이아니면, WHILE 문은한번도수행되지않는다. condition LOOP 을수행할지의여부를결정하는조건절을명시한다. 조건절에는 SQL 문의 WHERE 절에서사용가능한모든술어 (predicate) 들을사용할수있다. 예제 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS v1 INTEGER; v1 := 1; 흐름제어 75

88 WHILE v1 < 3 LOOP v1 := v1 + 1; INSERT INTO t1 VALUES (v1, v1, v1); IF v1 = 2 THEN CONTINUE; END IF; END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. 76 Stored Procedures Manual

89 FOR LOOP 구문 for_loop_statement ::= << label_name >> FOR counter_name IN REVERSE lower_bound.. upper_bound STEP step_size LOOP statement END LOOP label_name ; 기능 FOR LOOP 문은일정횟수만큼반복해서구문 ( 들 ) 을수행하고자할때사용된다. 두개의점 (.. ) 을사용해서범위를지정할수있는데이는 FOR loop 에진입하기전에한번만체크된다. 범위의작은값과큰값을같은값으로지정하면, loop 내부는한번만실행된다. counter_name 일정한값만큼증가, 혹은감소시킬정수형변수를하나기술한다. 이변수는블록의선언부에선언할필요가없다. 또한이변수의범위는 LOOP 과 END LOOP 으로둘러싸여있는문장들에만한정된다. FOR LOOP 내에서이변수에새로운값을할당할수없다. REVERSE 흐름제어 77

90 REVERSE 모드를지정하면 counter_name 변수의값을 upper_bound 에서 lower_bound 까지감소시키면서 FOR 문을수행한다. lower_bound counter_name 변수가가질수있는값중가장작은값이다. 정수형또는정수형과호환성이있는표현식을지정하여야한다. 여기에는지역변수를사용할수도있으나, 이값은 FOR 문이맨처음으로실행될때에딱한번그값을계산하여저장해두고사용하므로, 추후해당지역변수를변경하여도 FOR 문의동작에는영향을미치지않는다. 여기에실수형을명시하면반올림된정수값으로변환된다. upper_bound counter_name 변수가가질수있는값중가장큰값이다. lower_bound 와마찬가지로정수형또는정수형과호환성이있는표현식을지정하여야한다. 정수형이아닌수를명시하면반올림된정수값으로변환된다. 만약 FOR 문이맨처음으로수행될때 upper_bound 가 lower_bound 보다작으면어떠한에러도내지않고단지 FOR 문을건너뛰고다음문장을수행한다. lower_bound 처럼, 여기에는지역변수를사용할수도있으나, 이값은 FOR 문이맨처음으로실행될때에딱한번그값을계산하여저장해두고사용하므로, 추후해당지역변수를변경하여도 FOR 문의동작에는영향을미치지않는다. step_size 증가또는감소시킬값을지정한다. 생략하면기본적으로 FOR 문은 counter_name 변수를 1 씩증, 혹은감소시킨다. 단, step size 는 1 보다작을수없다. 정수형이아닌수를명시한경우에는반올림된정수값으로변환된다. 예제 --###################### -- FOR LOOP --###################### 78 Stored Procedures Manual

91 예제 1 CREATE TABLE t6(i1 INTEGER, sum INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS v1 INTEGER; sum INTEGER := 0; FOR i IN LOOP v1 := 2 * i - 1; sum := sum + v1; INSERT INTO t6 VALUES(v1, sum); END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t6; T6.I1 T6.SUM rows selected. 예제 2 CREATE OR REPLACE PROCEDURE proc1 AS eno_count INTEGER; SELECT COUNT(eno) INTO eno_count FROM employee; FOR i IN 1.. eno_count LOOP UPDATE employee SET salary = salary * 1.2 WHERE eno = i; END LOOP; / isql> SELECT eno, salary FROM employee WHERE eno in (11,12,13); ENO SALARY 흐름제어 79

92 rows selected. isql> EXEC proc1; Execute success. isql> SELECT eno, salary FROM employee WHERE eno IN (11,12,13); ENO SALARY rows selected. 예제 3 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS <<a>> INSERT INTO t1 VALUES (1,1,1); IF 1 = 1 THEN NULL; END IF; <<b>> FOR v1 IN LOOP <<c>> FOR v1 IN LOOP INSERT INTO t1 VALUES (b.v1, b.v1, c.v1); END LOOP; END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I Stored Procedures Manual

93 rows selected. --##################### -- reverse --##################### CREATE TABLE t6(i1 INTEGER, sum INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS sum INTEGER := 0; FOR i IN reverse LOOP sum := sum + i; INSERT INTO t6 VALUES(i, sum); END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t6; T6.I1 T6.SUM rows selected. --##################### -- step 흐름제어 81

94 --##################### CREATE TABLE t6(i1 INTEGER, sum INTEGER); CREATE OR REPLACE PROCEDURE proc1 AS sum INTEGER := 0; FOR i IN STEP 2 LOOP sum := sum + i; INSERT INTO t6 VALUES(i, sum); END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t6; T6.I1 T6.SUM rows selected. 82 Stored Procedures Manual

95 EXIT 구문 exit_statement ::= EXIT label_name WHEN condition ; 기능 EXIT 문을감싸고있는가장가까운 LOOP 문을빠져나간다. 그러나 label_name 이명시적으로주어진경우에는 label_name 이정의된 LOOP 을빠져나간다. LOOP 문내부가아닌다른블록에서 EXIT 문을사용하면오류가발생한다. <<outer>> LOOP... LOOP... EXIT outer WHEN EXIT both LOOPs END LOOP;... END LOOP outer; EXIT WHEN count > 100; IF count > 100 THEN EXIT; END IF; EXIT 문은아래의 LOOP 문내에서사용가능하다. 흐름제어 83

96 LOOP WHILE LOOP FOR LOOP CURSOR FOR LOOP label_name EXIT 문을감싸고있는가장가까운 LOOP 가아닌그보다더바깥의 LOOP 으로빠져나가야하는경우, 해당 LOOP 의바로앞에 LABEL 을정의하고그이름을여기에명시한다. WHEN condition 특정조건이참인경우루프를빠져나갈수있도록 WHEN 절에조건식을지정할수있다. 조건절에는 SELECT 문의 WHERE 절에서사용가능한모든술어들을사용할수있다. EXIT 문을만나서 WHEN 절에명시된조건이참이면저장프로시저는가장가까운루프나지정된 LABEL 블록문을빠져나가서그다음문장을수행한다. EXIT WHEN 은간단한 IF 구문과유사하다. 다음의두문장들은동일한기능을한다. EXIT WHEN count > 100; IF count > 100 THEN EXIT; END IF; 예제 CREATE TABLE stock( gno BYTE(5) primary key, stock INTEGER, price numeric(10,2)); CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1 IS SELECT gno, stock, price FROM goods; rec1 c1%rowtype; OPEN c1; LOOP 84 Stored Procedures Manual

97 FETCH c1 INTO rec1; IF c1%found THEN IF rec1.stock > 0 AND rec1.stock < 1000 THEN INSERT INTO stock VALUES(rec1.gno, rec1.stock, rec1.price); END IF; ELSIF c1%notfound THEN EXIT; END IF; END LOOP; CLOSE c1; / isql> EXEC proc1; Execute success. isql> SELECT * FROM stock; STOCK.GNO STOCK.STOCK STOCK.PRICE A B D E E rows selected. --##################### -- EXIT WHEN --##################### CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1 IS SELECT gno, stock, price FROM goods; rec1 c1%rowtype; OPEN c1; IF c1%isopen THEN LOOP FETCH c1 INTO rec1; EXIT WHEN c1%notfound; IF rec1.stock > 0 AND rec1.stock < 1000 THEN INSERT INTO stock VALUES(rec1.gno, rec1.stock, rec1.price); END IF; END LOOP; END IF; 흐름제어 85

98 CLOSE c1; / isql> EXEC proc1; Execute success. isql> SELECT * FROM stock; STOCK.GNO STOCK.STOCK STOCK.PRICE A B D E E rows selected. 86 Stored Procedures Manual

99 CONTINUE 구문 continue_statement ::= CONTINUE ; 기능 현재 CONTINUE 문을감싸고있는 LOOP 에서 CONTINUE 문이후의문장들을전부무시하고 LOOP 의맨처음으로되돌아간다. CONTINUE 문을사용할수있는 LOOP 문은다음과같다. LOOP WHILE LOOP FOR LOOP CURSOR FOR LOOP LOOP 문내부가아닌다른곳에서 CONTINUE 문을사용하면오류가발생한다. 예제 CREATE TABLE t8(i1 INTEGER, mathpower INTEGER default 0); INSERT INTO t8(i1) VALUES(7); INSERT INTO t8(i1) VALUES(3); INSERT INTO t8(i1) VALUES(20); INSERT INTO t8(i1) VALUES(15); INSERT INTO t8(i1) VALUES(6); INSERT INTO t8(i1) VALUES(1); INSERT INTO t8(i1) VALUES(9); 흐름제어 87

100 CREATE OR REPLACE PROCEDURE proc1 AS DECLARE CURSOR c1 IS SELECT i1 FROM t8; rec c1%rowtype; OPEN c1; LOOP FETCH c1 INTO rec; EXIT WHEN c1%notfound; IF power(rec.i1, rec.i1) > THEN continue; ELSE UPDATE t8 SET mathpower = power(rec.i1, rec.i1) WHERE i1 = rec.i1; END IF; END LOOP; CLOSE c1; / isql> EXEC proc1; Execute success. isql> SELECT * FROM t8; T8.I1 T8.MATHPOWER rows selected. 88 Stored Procedures Manual

101 GOTO 구문 goto_statement ::= GOTO label_name ; 기능 지정된 LABEL 로제어를이동하는분기문이다. label_name 제어를이동할 LABEL 의이름이다. 제약사항 GOTO 는다음과같은제약사항을가진다. IF 나 CASE 블록내에서사용될때, THEN, ELS(E)IF, ELSE 또는 WHEN 문에해당하는블록안으로이동할수없다. 따라서아래예제의경우에러를출력한다. CREATE OR REPLACE PROCEDURE PROC1 AS V1 INTEGER; V1 := 1; IF V1 = 1 THEN ELSE END IF; GOTO LABEL1; <<LABEL1>> PRINTLN(V1); 흐름제어 89

102 / [ERR-3120F : Illegal GOTO statement. In PROC : GOTO LABEL1; ] ^ ^ 외부블록에서내부블록으로이동할수없다. 모든 /END 블록및 LOOP 문장에이제약조건이적용된다. CREATE OR REPLACE PROCEDURE PROC1 AS / V1 INTEGER; V1 := 1; DECLARE V2 INTEGER; <<LABEL1>> V2 := 1; GOTO LABEL1; [ERR-3120F : Illegal GOTO statement. In PROC : GOTO LABEL1; ] ^ ^ 예외처리부에서분기하는경우, 그예외처리부가속한블록으로는분기할수없다. 따라서다음의예제 1 은에러를반환한다. < 예제 1> CREATE OR REPLACE PROCEDURE PROC1 AS E1 EXCEPTION; RAISE E1; <<LABEL1>> PRINTLN('END'); EXCEPTION WHEN E1 THEN GOTO LABEL1; 90 Stored Procedures Manual

103 / [ERR-3120F : Illegal GOTO statement. In PROC : GOTO LABEL1; ] ^ ^ 그러나, 예외처리부로부터그상위블록으로의분기는가능하다. 예제 2 의경우 V1 이 5 가될때까지 EXCEPTION 을 4 번발생시키고정상으로종료한다. < 예제 2> CREATE OR REPLACE PROCEDURE PROC1 AS / E1 EXCEPTION; V1 INTEGER; V1 := 1; <<LABEL1>> V1 := V1 + 1; PRINTLN('BLOCK1'); PRINTLN('BLOCK2'); PRINTLN(V1); IF V1 = 5 THEN ELSE END IF; PRINTLN('goto label2 ' v1); GOTO LABEL2; RAISE E1; EXCEPTION <<LABEL2>> WHEN E1 THEN PRINTLN('goto label1 ' v1); GOTO LABEL1; PRINTLN('BLOCK1 AFTER BLOCK2'); isql> EXEC PROC1; BLOCK1 BLOCK2 2 흐름제어 91

104 goto label1 2 BLOCK1 BLOCK2 3 goto label1 3 BLOCK1 BLOCK2 4 goto label1 4 BLOCK1 BLOCK2 5 goto label2 5 BLOCK1 AFTER BLOCK2 Execute success. 92 Stored Procedures Manual

105 NULL 구문 null_statement ::= NULL ; 기능 NULL 문은흐름에영향을미치지않고아무것도수행하지않고다음으로넘어감을명시적으로나타내기위해서사용한다. 프로그램의가독성을높이기위해서사용한다. 예제 CREATE OR REPLACE PROCEDURE bonus (amount NUMBER(10,2)) AS CURSOR c1 IS SELECT eno, sum(qty) FROM orders group by eno; order_eno orders.eno%type; order_qty orders.qty%type; OPEN c1; LOOP FETCH c1 INTO order_eno, order_qty; EXIT WHEN c1%notfound; IF order_qty > THEN UPDATE employee SET salary = salary + amount WHERE eno = order_eno; ELSE NULL; END IF; END LOOP; 흐름제어 93

106 CLOSE c1; / isql> SELECT e.eno, salary, sum(qty) FROM employee e, orders o WHERE e.eno = o.eno group by e.eno, salary; ENO SALARY SUM(QTY) rows selected. isql> EXEC bonus(55550); Execute success. isql> SELECT eno, salary FROM employee WHERE eno = 19; ENO SALARY row selected. 저장프로시저내에서테이블의레코드를읽어오는방법에는 SELECT INTO 문을사용하는방법과커서를사용하는방법이있다. 94 Stored Procedures Manual

107 5. 커서 이장은커서를관리하고사용하는방법을설명한다. 커서 95

108 커서의개요 저장프로시저내에서테이블의레코드를읽어오는방법에는 SELECT INTO 문을사용하는방법과커서를사용하는방법이있다. SELECT INTO 문의경우결과레코드의수는반드시한개여야하고그이외의경우오류가발생한다. 따라서여러개의레코드를검색해야할경우커서를사용해야한다. 커서선언 커서는저장프로시저블록의선언부에커서명과함께수행할 SELECT 문을정의해야한다. 이는선언된후에, 아래 2 가지방법중의하나로관리될수있다. OPEN, FETCH, CLOSE 사용 Cursor FOR LOOP 사용 OPEN, FETCH 와 CLOSE 로커서관리하기 OPEN FETCH 커서는블록바디내에서 OPEN, FETCH, CLOSE 문을사용해서관리할수있다. OPEN 문은커서를초기화하는데사용된다. FETCH 문은레코드를반복적으로가져오는데사용된다. 마지막으로 CLOSE 문은커서를해제한다. 커서를사용하기위해서커서와관련된모든리소스들을초기화하는단계이다. 커서정의시에사용자파라미터를지정한경우 OPEN 구문에서파라미터의값을전달해야한다. 커서의 SELECT 문을만족하는결과집합으로부터한번에한레코드씩가져와서사용자변수에저장한다. 별도의변수에각칼럼을저장할수도있고, 전체레코드를 %ROWTYPE 을사용해서정의한 RECORD 타입변수에저장할수도있다. RECORD 타입변수에대한설명은 6 장사용자정의타입으참고하기바란다. 96 Stored Procedures Manual

109 CLOSE 사용이끝난커서의리소스를해제한다. OPEN 문을사용해서열어둔커서는해당프로시저가종료되기전에반드시 CLOSE 문을사용해서닫아야한다. Cursor FOR LOOP 로커서관리하기 커서의 OPEN, FETCH, CLOSE 단계를한번에수행하는 LOOP 문의하나이다. 결과레코드가존재하지않을때까지 LOOP 를반복수행한다. 커서에대해서명시적으로 OPEN 문이나 CLOSE 문을사용할필요가없는경우에편리한구문이다. 커서 97

110 CURSOR 구문 cursor_declaration ::= CURSOR cursor_name ( cursor_parameter_declaration ), IS select_statement ; cursor_parameter_declaration ::= parameter_name IN data_type DEFAULT := cursor_name data_type ::= sql_data_type type_attribute 기능 커서를정의한다. CURSOR 구문에서는커서명과커서가레코드를가져오는데사용할 SELECT 문을명시해야한다. cursor_name 98 Stored Procedures Manual

111 cursor_parameter_declaration OPEN, FETCH, CLOSE 및 Cursor FOR LOOP 에서참조할커서의이름을지정한다. 커서의 SELECT 문에인자가필요한경우, 프로시저의파라미터를지정하는문법과같은방법으로파라미터들을지정할수있다. 이인자들은다음과같은제약이있다. 커서인자는 SELECT 문안에서만사용할수있다 %ROWTYPE 은사용할수없다. 커서인자는 OUT 또는 IN/OUT 인자일수없다. 이파라미터들은커서 OPEN 이나커서 FOR 문으로부터값을받아서 SELECT 문을수행하게된다. DECLARE CURSOR c1 IS SELECT empno, ename, job, sal FROM emp WHERE sal > 2000; CURSOR c2 (low INTEGER DEFAULT 0, high INTEGER DEFAULT 99) IS SELECT...; data_type 3 장의 지역변수선언 절을참고한다. 예제 CREATE TABLE highsal (eno INTEGER, ename CHAR(20), salary NUMBER(10,2)); CREATE OR REPLACE PROCEDURE proc1 AS DECLARE CURSOR c1 IS SELECT eno, ename, salary FROM employee WHERE salary IS not NULL ORDER BY salary desc; emp_name CHAR(20); emp_no INTEGER; 커서 99

112 emp_sal NUMBER(10,2); OPEN c1; FOR i IN LOOP FETCH c1 INTO emp_no, emp_name, emp_sal; EXIT WHEN c1%notfound; INSERT INTO highsal VALUES(emp_no, emp_name, emp_sal); END LOOP; CLOSE c1; / isql> EXEC proc1; Execute success. isql> SELECT * FROM highsal; HIGHSAL.ENO HIGHSAL.ENAME HIGHSAL.SALARY YHBAE MSKIM SJKIM JHCHOI KCJUNG rows selected. 100 Stored Procedures Manual

113 OPEN 구문 open_cursor_statement ::= OPEN cursor_name ( cursor_parameter_name ) ;, 기능 이구문은커서를초기화하고, 쿼리를수행하여결과집합을결정하는데사용된다. 이후에 FETCH 문을사용해서데이터를가져올수있다. 이구문을실행하면알티베이스는커서사용에필요한모든리소스들을할당한다. 이미 OPEN 된커서를다시 OPEN 하려고시도하면 CURSOR_ALREADY_OPEN 에러가발생한다. cursor_name OPEN 하고자하는커서의이름을지정한다. 이커서는블록의선언부에선언되어있어야한다. cursor_parameter_name 커서에사용자파라미터가명시된경우전달할값을지정한다. 인자를가지는커서의경우, 아래와같이선언한다. DECLARE CURSOR c1(pname VARCHAR(40), pno INTEGER) IS SELECT empno, ename, job, sal FROM emp WHERE eame = pname; 커서 101

114 OPEN c1;... 인자가존재하는경우다음과같이커서 OPEN 시값을넘겨준다. OPEN c1(emp_name, 100); OPEN c1('mylee', 100); OPEN c1(emp_name, dept_no); 예제 예제 1 CREATE TABLE mgr (mgr_eno INTEGER, mgr_name CHAR(20), mgr_dno SMALLINT); CREATE OR REPLACE PROCEDURE proc1 AS DECLARE CURSOR emp_cur IS SELECT eno, ename, dno FROM employee WHERE emp_job = 'MANAGER'; emp_no employee.eno%type; emp_name employee.ename%type; emp_dno employee.dno%type; OPEN emp_cur; LOOP FETCH emp_cur INTO emp_no, emp_name, emp_dno; EXIT WHEN emp_cur%notfound; INSERT INTO mgr VALUES(emp_no, emp_name, emp_dno); END LOOP; CLOSE emp_cur; / isql> EXEC proc1; Execute success. 102 Stored Procedures Manual

115 isql> select * from mgr; MGR.MGR_ENO MGR.MGR_NAME HJMIN JDLEE JHCHOI rows selected. MGR.MGR_DNO 예제 2 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE TABLE t2(i1 INTEGER, i2 INTEGER, i3 INTEGER); INSERT INTO t1 VALUES(1,1,1); INSERT INTO t1 VALUES(2,2,2); INSERT INTO t1 VALUES(30,30,30); INSERT INTO t1 VALUES(50,50,50); CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1(k1 INTEGER, k2 INTEGER, k3 INTEGER) IS SELECT * FROM t1 WHERE i1 <= k1 AND i2 <= k2 AND i3 <= k3; FOR rec1 IN c1(2,2,2) LOOP INSERT INTO t2 VALUES (rec1.i1, rec1.i2, rec1.i3); END LOOP; / isql> SELECT * FROM t2; T2.I1 T2.I2 T2.I No rows selected. isql> EXEC proc1; Execute success. isql> SELECT * FROM t2; T2.I1 T2.I2 T2.I rows selected. 커서 103

116 FETCH 구문 fetch_statement ::= FETCH cursor_name INTO record_name variable_name, ; 기능 OPEN 된커서로부터하나의행을가져와서 INTO 절에명시된변수에그값을저장한다. 이때, 커서의 SELECT 문에명시한칼럼들에상응하는사용자변수를각각나열해서칼럼별로각각저장하거나, RECORD 타입변수명만명시해서커서로부터가져온한행을 RECORD 타입변수에저장되도록할수도있다. FETCH 문에 RECORD 타입변수를사용하는데는다음과같은제약이있다. 가져온한행을저장하는데오직한개의 RECORD 타입변수만사용할수있다. SELECT 문에서가져오는모든칼럼들을한 RECORD 타입변수에저장할수있어야한다. RECORD 타입변수는일반변수와섞어서사용할수없다. 만약 OPEN 되지않은커서로부터 FETCH 를하려고시도하면 INVALID_CURSOR 오류가발생한다. cursor_name 104 Stored Procedures Manual

117 FETCH 하고자하는커서의이름을지정한다. 이커서는블록의선언부에선언되어있어야한다. record_name 커서의 SELECT 문이반환하는레코드를받을 RECORD 타입변수명을지정한다. 이때사용되는 RECORD 타입변수는 SEELCT 구문의 select list 와칼럼의개수가같고타입이순서대로정확히일치해야한다. 따라서커서의 SELECT 문이한테이블의모든칼럼을가져오는경우, 그테이블에대해 %ROWTYPE 속성을사용해서선언한 RECORD 타입변수를주로사용하게된다. variable_name 값을저장할변수의이름이다. 이변수들의개수는커서의 SELECT 문에서명시한칼럼의개수와동일해야한다. 또한나열한변수의순서대로상응하는칼럼의타입과각각일치해야한다. LOOP FETCH c1 INTO my_name, my_empno, my_deptno; EXIT WHEN c1%notfound; END LOOP; 예제 CREATE TABLE emp_temp(eno INTEGER, ename CHAR(20)); CREATE OR REPLACE PROCEDURE proc1 AS DECLARE CURSOR c1 IS SELECT eno, ename FROM employee; emp_rec c1%rowtype; OPEN c1; LOOP FETCH c1 INTO emp_rec; EXIT WHEN c1%notfound; INSERT INTO emp_temp VALUES(emp_rec.eno, emp_rec.ename); END LOOP; CLOSE c1; 커서 105

118 / isql> EXEC proc1; Execute success. isql> SELECT * FROM emp_temp; EMP_TEMP.ENO EMP_TEMP.ENAME EJJUNG 2 HJNO 3 HSCHOI KMKIM 20 DIKIM 20 rows selected. 106 Stored Procedures Manual

119 CLOSE 구문 close_cursor_statement ::= CLOSE cursor_name ; 기능 열려있는커서를닫고해당커서에할당된리소스를해제한다. 커서가열려있지않았거나, 이미닫힌커서를닫으려고하면 INVALID_CURSOR 에러가발생한다. 사용자가커서를명시적으로 CLOSE 하지않아도커서가선언된블록을빠져나가게되면자동으로 CLOSE 되지만, 커서를 CLOSE 한다는것은커서와관련된모든리소스를시스템에반납한다는것을의미하므로, 사용이끝난커서는즉시 CLOSE 해주는것이바람직하다. cursor_name CLOSE 하고자하는커서의이름을명시한다. 예제 CLOSE c1; 커서 107

120 Cursor FOR LOOP 구문 cursor_for_loop_statement ::= << label_name >> FOR counter_name IN cursor_name ( cursor_parameter_name ), LOOP statement END LOOP label_name ; 기능 커서열기, 결과가져오기와커서닫기를자동으로처리하는기능을한다. Cursor FOR LOOP 은블록선언부에선언한커서를이용하여, 한번의 LOOP 를수행할때마다쿼리실행결과를한행씩반환한다. 이때하나의행은 RECORD 타입의변수에저장되고루프안에서이를자유롭게사용할수있다. label_ name EXIT 문이나 CONTINUE 문에서 LOOP 을지칭하는데필요한 LABEL 을명시할수있다. counter_name 108 Stored Procedures Manual

121 커서를이용하여 FETCH 된하나의행이저장될 RECORD 타입의변수명을지정한다. 이변수는블록의선언부에선언되어있지않아도 FETCH 된행이가지는칼럼의개수와타입에맞춰서자동으로생성된다. 이렇게생성된변수는 counter_name.column_name 형식으로참조할수있다. 이때 column_name 은 SELECT 구문의 select list 에존재하는칼럼의이름과동일하다. 따라서 select list 에연산식을사용한경우는해당연산식에별칭 (alias) 를지정하여참조가능하도록만들어야한다. cursor_name cursor_parameter_name 루프안에서사용하게될커서의이름를지정한다. 이커서는블록의선언부에선언되어있어야한다. OPEN 절의 cursor_parameter_name 을참조한다. 예제 CREATE TABLE emp_temp(eno INTEGER, ename CHAR(20)); CREATE OR REPLACE PROCEDURE proc1 AS DECLARE CURSOR c1 IS SELECT eno, ename FROM employee; FOR emp_rec IN c1 LOOP INSERT INTO emp_temp VALUES(emp_rec.eno, emp_rec.ename); END LOOP; / isql> EXEC proc1; Execute success. isql> SELECT * FROM emp_temp; EMP_TEMP.ENO EMP_TEMP.ENAME EJJUNG 커서 109

122 2 HJNO KMKIM 20 DIKIM 20 rows selected. 110 Stored Procedures Manual

123 커서속성 저장프로시저내에서커서와관련된수행도중커서의상태를파악하기위해서알티베이스가관리하고있는속성값들을참조할수있다. 구문 cursor_attribute ::= FOUND NOTFOUND cursor_name % ; ISOPEN ROWCOUNT 기능 특정커서의속성을참조할수있다. 정수형을반환하는 ROWCOUNT 커서속성을제외하고, 커서속성은커서의상태를나타내는 BOOLEAN 형의표현식이다. 커서의현재상태에따라각각의속성값은 TRUE 또는 FALSE 일수있다. 사용자는 DECLARE 구문에직접정의한커서의속성값뿐만아니라시스템에서정의한암시적커서의속성값도참조할수있다. 암시적커서는 DELETE, UPDATE, INSERT 와한건의레코드가반환되는 SELECT INTO 구문을위해선언된다. 이는가장최근에수행된 SQL 구문에해당하는커서의속성값을갖는다. %FOUND 커서에명시한 SELECT 문의조건을만족하는행이존재하는지여부를나타낸다. 단, 다음의경우에는조건을만족하는행의존재 커서 111

124 여부에상관없이 %FOUND 의값이무조건 FALSE 이다. 열지않은커서 FETCH 를한번도하지않은커서 이미닫은커서 암시적커서의경우는 DELETE, UPDATE, INSERT 문의수행결과로 1 건이상이영향을받거나, SELECT INTO 의반환되는레코드가 1 건이상일때, %FOUND 의값은 TRUE 가된다. 그러나 SELECT INTO 의반환되는레코드가 2 건이상일때에는 %FOUND 를검사하기전에 TOO_MANY_ROWS 예외가발생하므로, 이경우 %FOUND 커서속성이아닌예외로처리해야한다. %FOUND 속성의값은다음과같이참조할수있다. DELETE FROM emp; IF SQL%FOUND THEN... INSERT INTO emp VALUES (... ); END IF; -- delete succeeded %NOTFOUND 커서에명시한 SELECT 문의조건을만족하는행이존재하는지여부를나타낸다. 항상 %FOUND 와반대의값을가진다. 암시적커서의경우는 DELETE, UPDATE, INSERT 구문이성공적으로수행되었으나영향을받은레코드가하나도없거나, 또는 SELECT INTO 가반환하는레코드가하나도없을때, %NOTFOUND 의값이 TRUE 로된다. 그러나 SELECT INTO 가반환하는레코드가없을때는 %NOTFOUND 속성을검사하기전에 NO_DATA_FOUND 예외가발생하므로, %NOTFOUND 커서속성이아닌예외로처리해야한다. %NOTFOUND 속성의값은다음과같이참조할수있다. DELETE FROM emp; IF SQL%NOTFOUND THEN... END IF; %ISOPEN 커서가열렸는지여부를나타낸다. 커서를닫으면이값은 FALSE 가된다. %ISOPEN 의값은다음과같이참조할수있다. 112 Stored Procedures Manual

125 OPEN c1; -- CURSOR OPEN IF c1%isopen THEN... END IF; %ROWCOUNT 커서를사용하여현재몇개의행을 FETCH 하였는지를나타낸다. 주의할점은 %ROWCOUNT 는커서의 SELECT 문을만족하는행의수가아니라, FETCH 를성공할때마다 1 씩증가한다는것이다. FETCH 를한번도하지않은커서의경우 %ROWCOUNT 는 0 이다. 열기전의커서와닫은이후의커서에대해속성을참조하면 INVALID_CURSOR 에러를반환한다. DELETE FROM emp; IF SQL%ROWCOUNT > 10 THEN... END IF; 예제 예제 1 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE TABLE t3(i1 INTEGER); INSERT INTO t1 VALUES(2,2,2); CREATE OR REPLACE PROCEDURE proc1 AS v1 INTEGER; SELECT i1 INTO v1 FROM t1 WHERE i1 = 2; IF SQL%found THEN INSERT INTO t1 SELECT * FROM t1; v1 := SQL%ROWCOUNT; INSERT INTO t3 VALUES(v1); END IF; / 커서 113

126 isql> EXEC proc1; Execute success. isql> SELECT * FROM t3; T3.I row selected. 예제 2 CREATE TABLE t1(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE TABLE t2(i1 INTEGER, i2 INTEGER, i3 INTEGER); CREATE TABLE t3(i1 INTEGER); INSERT INTO t1 VALUES(1,1,1); INSERT INTO t1 VALUES(1,1,1); INSERT INTO t1 VALUES(1,1,1); CREATE OR REPLACE PROCEDURE proc1 AS CURSOR c1 IS SELECT * FROM t1; v1 INTEGER; v2 INTEGER; v3 INTEGER; OPEN c1; IF c1%isopen THEN LOOP FETCH c1 INTO v1, v2, v3; IF c1%found THEN INSERT INTO t2 VALUES (v1, v2, v3); ELSIF c1%notfound THEN EXIT; END IF; END LOOP; END IF; v1 := c1%rowcount; INSERT INTO t3 VALUES (v1); CLOSE c1; / 114 Stored Procedures Manual

127 isql> EXEC proc1; Execute success. isql> SELECT * FROM t1; T1.I1 T1.I2 T1.I rows selected. isql> SELECT * FROM t2; T2.I1 T2.I2 T2.I rows selected. isql> SELECT * FROM t3; T3.I row selected. 예제 3 CREATE TABLE emp_temp(eno INTEGER, ename CHAR(20)); CREATE OR REPLACE PROCEDURE proc1 AS DECLARE CURSOR c1 IS SELECT eno, ename FROM employee; emp_rec c1%rowtype; OPEN c1; LOOP FETCH c1 INTO emp_rec; EXIT WHEN c1%rowcount > 10 OR c1%notfound; INSERT INTO emp_temp VALUES(emp_rec.eno, emp_rec.ename); END LOOP; CLOSE c1; 커서 115

128 / isql> EXEC proc1; Execute success. isql> SELECT * FROM emp_temp; EMP_TEMP.ENO EMP_TEMP.ENAME EJJUNG 2 HJNO 3 HSCHOI 4 KSKIM 5 SJKIM 6 HYCHOI 7 HJMIN 8 JDLEE 9 KMLEE 10 YHBAE 10 rows selected. 116 Stored Procedures Manual

129 6. 사용자정의타입 이장에서는저장프로시저와저장함수에서사용할수있는사용자정의타입에대해서설명하고있다. 사용자정의타입 117

130 개요 사용자정의타입인 RECORD 타입및 Associative Arrays 는데이터를논리적단위로구성하여처리하는기능을제공한다. 또한다른저장프로시저또는함수로부터호출되는저장프로시저또는함수의인자또는리턴타입으로사용이가능하다. 단, 클라이언트로는해당타입의값을전송할수없다. RECORD 타입 RECORD 타입은칼럼의집합으로이루어진사용자정의데이터타입이다. 이를이용하여각각의서로다른종류의데이터들을논리적단위로구성하여처리할수있다. 예를들어이름, 급여, 부서등의서로다른데이터들을 사원 이라는하나의데이터로처리하는경우하나의 RECORD 타입으로묶어처리할수있다. 블록안에정의된 RECORD 타입의범위는지역적이다. 즉, 그타입을정의한블록내에서만사용할수있다. RECORD 타입의정의는 6 장의 사용자정의타입의정의 절을참고한다. 정의하는방법을제외한다른사용방법은 %ROWTYPE 속성을사용해서선언하는 RECORD 타입변수와동일하다. Associative Arrays Associative Array 는해시테이블과유사하다. Associative Array 는키 - 값쌍의집합이다. 각키는유일한값이어야하고, 키에상응하는값에접근할때사용된다. 다음의문법으로접근할수있다. variable_name[index] 키 (index) 의데이터타입은 INTEGER 또는 VARCHAR 이어야한다. Associative Array 를이용하여데이터의개수와상관없이동일한타입의데이터들을하나의단위로묶어처리를할수있다. 예를들어사원들중사원번호 1~100 까지의사원데이터를처리하는경우 100 개의데이터를하나의 Associative Array 로처리할수있다. Associative Array 의선언방법은 6 장의 사용자정의타입의정의 절을참고한다. Associative Array 변수의배열요소접근을위해서는다음과같이 118 Stored Procedures Manual

131 대괄호 ( [ ] ) 를사용한다. 예 ) V1[ 1 ] := 1; REF CURSOR ( 커서변수 ) 커서변수는다중레코드를검색하는동적 SQL 문에서사용할수있는변수이다. 이러한커서변수는특정질의문에종속되지않기때문에커서보다훨씬유연하다. 저장프로시저또는함수간인자로전달이가능하고, 클라이언트로도전달할수있다. 커서와다른점은커서는항상선언시에명시한질의문만참조할수있지만, 커서변수는커서 OPEN 시에다른질의문을참조할수있다는점이다. 사용자정의타입 119

132 사용자정의타입의정의 구문 type_definition ::= associative_array_type_spec TYPE type_name IS record_type_spec ref_cursor_type_spec associative_array_type_spec ::= TABLE OF data_type INDEX BY integer_type varchar_type record_type_spec ::= RECORD ( column_name sql_data_type ), ref_cursor_type_spec ::= REF CURSOR 120 Stored Procedures Manual

133 type_name 사용자정의타입의이름을명시한다. associative_array_spec data_type 으로이루어진 Associative Array 타입을정의한다. 단, data_type 에다른 Associative Array 는올수없다. 즉 Associative Array 타입의 Associative Array 는생성할수없다. record_type_spec sql_data_type 으로이루어진 RECORD 타입을정의한다. sql_data_type 에는 SQL 구문에서사용가능한어떤데이터타입도올수있다. 단, Associative Array, RECORD 타입은여기에올수없다. ref_cursor_type_spec REF CURSOR 타입을정의한다. 예제 예제 1 이름 (VARCHAR(20)), 부서 (INTEGER), 봉급 (NUMBER(8)) 을 갖는이름이 employee 인 RECORD 타입을정의하라. DECLARE TYPE employee IS RECORD( name VARCHAR(20), dept INTEGER, salary NUMBER(8)); 예제 2 VARCHAR(20) 을구성요소로하고 INTEGER 타입을인덱스로하는이름이 namelist 인 Associative Array 를정의하라. DECLARE TYPE namelist IS TABLE OF VARCHAR(20) INDEX BY INTEGER; 사용자정의타입 121

134 예제 3 사용자정의 RECORD 타입인 employee 를구성요소로가지고 VARCHAR(10) 타입을인덱스로하는 employeelist 라는이름의 Associative Array 를정의하라. DECLARE TYPE employee IS RECORD( name VARCHAR(20), dept INTEGER, salary NUMBER(8)); TYPE employeelist IS TABLE OF employee INDEX BY VARCHAR(10)); 122 Stored Procedures Manual

135 Associative Array 관련함수 구문 associative_array_call_method ::= COUNT ( ), variable_name. index DELETE ( ) EXISTS ( index ) FIRST LAST NEXT PRIOR ( ) ( ) ( index ) ( index ) 기능 Associative array 변수의배열요소관리를위한여러가지함수를제공한다. 이함수들은 SQL 함수와달리 () 를생략할수없다. COUNT Associative array 의구성요소의개수를반환한다. DELETE DELETE() 는모든구성요소를제거하고제거된구성요소의개수를반환한다. DELETE(n) 은 n 에해당하는요소를제거하고제거된구성요소의개수를반환한다. 사용자정의타입 123

136 DELETE(m, n) 은범위 m 부터 n 에속하는모든구성요소를제거하고제거된구성요소의개수를반환한다. m 의값이 n 보다크면, 아무것도제거되지않는다. 값이같으면, 한요소만제거될것이다. EXISTS EXISTS(n) 은 n 에해당하는구성요소가존재하는지검사해서존재하면 boolean 값 TRUE 를그렇지않으면 FALSE 를반환한다. FIRST 정수값으로색인화된경우, 가장작은 index 번호를반환한다. 문자열로색인화된경우, 가장낮은키값을반환한다. 구성요소가하나도없으면 NULL 을반환한다. LAST 정수값으로색인화된경우, 가장큰 index 번호를반환한다. 문자열로색인화된경우, 가장높은키값을반환한다. 구성요소가하나도없으면 NULL 을반환한다. NEXT NEXT(n) 은 n 의다음 index 번호를반환한다. VARCHAR 키를갖는배열의경우, 키문자열들을바이너리값기준으로정렬하여바로다음키값을반환한다. 가장다음 index 가없으면 NULL 을반환한다. PRIOR PRIOR(n) 은 n 의이전 index 번호를반환한다. VARCHAR 키를갖는배열의경우, 키문자열들을바이너리값기준으로정렬하여바로앞의키값을반환한다. 이전 index 가없으면 NULL 을반환한다. 예제 예제 1 Associative array 변수 V1 의요소를삭제 CREATE OR REPLACE PROCEDURE PROC1( 124 Stored Procedures Manual

137 P1 IN VARCHAR(10), P2 IN VARCHAR(10) ) AS TYPE MY_ARR IS TABLE OF INTEGER INDEX BY VARCHAR(10); V1 MY_ARR; V2 INTEGER; V1['FSDGADS'] := 1; V1['AA'] := 2; V1['7G65'] := 3; V1['N887K'] := 4; V1['KU'] := 5; V1['34'] := 6; PRINTLN( 'V1 COUNT IS : ' V1.COUNT() ); V2 := V1.DELETE(P1, P2); PRINTLN( 'DELETED COUNT IS : ' V2); PRINTLN( 'V1 COUNT IS : ' V1.COUNT() ); / 실행결과 EXEC PROC1('005T34', 'BC35'); -- 이범위에포함되는인덱스를가지는요소는 V1['34'], V1['7G65'], V1['AA'] 으로총 3 개가지워져야한다. V1 COUNT IS : 6 DELETED COUNT IS : 3 V1 COUNT IS : 3 Execute success. 예제 2 Associative array 변수 V1 을오름차순과내림차순으로출력해라. CREATE OR REPLACE PROCEDURE PROC1 AS TYPE MY_ARR1 IS TABLE OF INTEGER INDEX BY INTEGER; V1 MY_ARR1; V1_IDX INTEGER; V1[435754] := 1; V1[95464] := 2; 사용자정의타입 125

138 V1[38] := 3; V1[57334] := 4; V1[138] := 5; V1[85462] := 6; PRINTLN( 'ASCENDING ORDER V1'); V1_IDX := V1.FIRST(); LOOP IF V1_IDX IS NULL THEN EXIT; ELSE PRINTLN( 'V1 IDX IS : ' V1_IDX ' VALUE IS : ' V1[V1_IDX] ); V1_IDX := V1.NEXT(V1_IDX); END IF; END LOOP; PRINTLN( 'DESCENDING ORDER V1'); V1_IDX := V1.LAST(); LOOP IF V1_IDX IS NULL THEN EXIT; ELSE PRINTLN( 'V1 IDX IS : ' V1_IDX ' VALUE IS : ' V1[V1_IDX] ); V1_IDX := V1.PRIOR(V1_IDX); END IF; END LOOP; / 실행결과 EXEC PROC1; ASCENDING ORDER V1 V1 IDX IS : 38 VALUE IS : 3 V1 IDX IS : 138 VALUE IS : 5 V1 IDX IS : VALUE IS : 4 V1 IDX IS : VALUE IS : Stored Procedures Manual

139 V1 IDX IS : VALUE IS : 2 V1 IDX IS : VALUE IS : 1 DESCENDING ORDER V1 V1 IDX IS : VALUE IS : 1 V1 IDX IS : VALUE IS : 2 V1 IDX IS : VALUE IS : 6 V1 IDX IS : VALUE IS : 4 V1 IDX IS : 138 VALUE IS : 5 V1 IDX IS : 38 VALUE IS : 3 Execute success. 사용자정의타입 127

140 RECORD 타입변수및 Associative Array 변수의사용 여기서는사용자정의타입을저장프로시저내에서사용할때의규칙및예제를다룬다. 사용자정의타입을파라미터및리턴값으로사용하는부분은 7 장타입세트를참고한다. 타입호환성 L_VALUE := R_VALUE; 위와같은할당문에사용될때사용자정의타입의타입호환성을살펴보면다음과같다. L_VALUE 의타입 R_VALUE 의타입호환성 RECORD 타입 RECORD 타입 같은이름을갖는동일한 레코드타입간에만 호환된다. 레코드타입의내부구조가같은다른레코드타입은서로호환되지않는다. RECORD 타입 %ROWTYPE 내부에정의된칼럼의 개수만동일하면호환된다. %ROWTYPE RECORD 타입 내부에정의된칼럼의 개수만동일하면호환된다. Associative Array Associative Array 동일한타입 ( 즉, 같은 이름의타입 ) 간에만 호환된다. 다음예제와같이사용자정의타입은그내부구조가동일하다하더라도할당문은실패하게된다. 예제 1 RECORD 타입변수의할당 CREATE OR REPLACE PROCEDURE PROC1 AS TYPE emp_rec_type1 IS RECORD ( name VARCHAR(20), job_id VARCHAR(10), salary NUMBER(8) ); 128 Stored Procedures Manual

141 TYPE emp_rec_type2 IS RECORD ( name VARCHAR(20), job_id VARCHAR(10), salary NUMBER(8) ); v_emp1 emp_rec_type1; v_emp2 emp_rec_type2; v_emp1.name := 'smith'; v_emp1.job_id := 'RND1069'; v_emp1.salary := ' '; v_emp2 := v_emp1; -- 실패. 두변수가같은내부구조이지만각각다른타입이므로할당은실패한다. 그러나아래처럼타입이일치하는요소간의할당은가능하다. v_emp2.name := v_emp1.name; RECORD 타입변수예제 예제 1 사원의이름, 급여, 부서를저장하는 RECORD 타입의변수를생성한다. CREATE OR REPLACE PROCEDURE PROC1 AS TYPE emp_rec_type IS RECORD ( v_emp name emp_rec_type; VARCHAR(20), job_id VARCHAR(10), salary NUMBER(8) ); v_emp.name := 'smith'; v_emp.job_id := 'RND1069'; v_emp.salary := ' '; PRINTLN('NAME : ' v_emp.name ' ' 'JOB ID : ' v_emp.job_id ' ' 'SALARY : ' v_emp.salary ); 사용자정의타입 129

142 / ASSOCIATIVE ARRAY 타입예제 예제 1 사원번호가 1 에서 100 사이에속한사원의이름을출력한다. CREATE OR REPLACE PROCEDURE PROC1 AS TYPE emp_array_type IS TABLE OF VARCHAR(20) INDEX BY INTEGER; v_emp emp_array_type; FOR I IN LOOP SELECT name INTO v_emp[i] FROM employees WHERE emp_id = I; END LOOP; FOR I IN v_emp.first().. v_emp.last() LOOP PRINTLN( v_emp[i] ); END LOOP; / 예제 2 사원번호가 1 에서 100 사이에속한사원의이름, 급여, 부서를출력한다. CREATE OR REPLACE PROCEDURE PROC1 AS TYPE emp_rec_type IS RECORD ( name VARCHAR(20), job_id VARCHAR(10), salary NUMBER(8) ); TYPE emp_array_type IS TABLE OF emp_rec_type INDEX BY INTEGER; v_emp emp_array_type; 130 Stored Procedures Manual

143 FOR I IN LOOP SELECT name, job_id, salary INTO v_emp[i] FROM employees WHERE emp_id = I; END LOOP; FOR I IN v_emp.first().. v_emp.last() LOOP PRINTLN( v_emp[i].name v_emp[i].job_id v_emp[i].salary ); END LOOP; / 사용자정의타입 131

144 REF CURSOR 저장프로시저는동적 SQL 의실행으로얻은결과집합 (Result set) 을커서변수 (REF CURSOR) 를통해서클라이언트에게전달할수있다. OPEN FOR 문으로커서변수를열고질의를실행한후, 커서를 OUT 인자를통해서클라이언트로전달하면클라이언트는결과집합에접근할수있게된다. 여러개의커서를전달하면, 클라이언트에서는다중결과집합에접근이가능하다. 커서변수를열기위한 OPEN FOR 구문을제외하고, 기존의커서관련구문을그대로이용할수있다. 커서변수는저장프로시저의 OUT 또는 IN/OUT 인자로만전달할수있고, 저장함수에서 RETURN 문으로는반환할수없다. 저장프로시저에서 OPEN 된상태로커서변수가클라이언트로전달되어야클라이언트에서결과집합을 FETCH 할수있다. 즉, 커서상태가 CLOSE 상태로전달될경우결과집합을사용할수없다. 저장프로시저에서 UPDATE, INSERT 문을실행할경우, 영향받은레코드수 (Affected Row Count) 는반환하지않는다. 클라이언트에서커서변수로결과집합을받는방법은클라이언트의형태에따라달라진다. 커서변수를이용하여결과집합을클라이언트로전달하는것은 ODBC 와 JDBC 에서만가능하다. Embedded SQL (Altibase Precompiler (APRE)) 에서는커서변수를통해프로시저의결과집합을받을수없다. 예제 REF CURSOR를이용한저장프로시저를생성한다. 1. 테이블 emp 와 staff 을생성하고값을입력한다. create table emp (eno integer, ename char(20), dno integer); create table staff (name char(20), dept char(20), job char(20), salary integer); insert into emp values (10, 'dulgi papa', 100); insert into emp values (20, 'kunhan', 200); insert into emp values (30, 'okasa', 300); insert into staff values ('dulgi papa', '100', 'papa', 100); insert into staff values ('shincha', '200', 'engineer', 200); 132 Stored Procedures Manual

145 insert into staff values ('ji hyung', '300', '', 0); 2. REF CUR 인사용자정의타입 MY_CUR 를정의하고, 이를포함하는타입세트 MY_TYPE 를정의한다. create typeset MY_TYPE as end; / type MY_CUR is REF CURSOR; 3. MY_CUR 타입의 OUT 인자 P1 과 P2, INTEGER 타입의 IN 인자 SAL 을가지는저장프로시저 PROC1 을생성한다. create or replace procedure PROC1 (P1 out MY_TYPE.MY_CUR, P2 out MY_TYPE.MY_CUR, SAL in INTEGER) as sql_stmt VARCHAR2(200); begin sql_stmt := 'SELECT name,dept,job FROM staff WHERE salary >?'; OPEN P1 FOR 'SELECT eno, ename, dno FROM emp'; OPEN P2 FOR sql_stmt USING SAL; end; / 4. 데이터베이스서버에연결한후, 프로시저 PROC1 을실행한다. SQLRETURN execute_proc() { SQLCHAR errmsg[msg_len]; char sql[1000]; SQLHSTMT stmt = SQL_NULL_HSTMT; int sal; int sal_len; int eno; int eno_len; int dno; int dno_len; SQLCHAR ename[ename_len+1]; SQLCHAR name[name_len+1]; SQLCHAR dept[dept_len+1]; SQLCHAR job[job_len+1]; int job_ind; SQLRETURN rc = SQL_SUCCESS; 사용자정의타입 133

146 if (SQL_ERROR == SQLAllocStmt(dbc, &stmt)) { printf("sqlallocstmt error!!\n"); return SQL_ERROR; } /* 실행할 SQL 문을준비 */ sprintf(sql, "EXEC proc1(?)"); if ( SQLPrepare(stmt,(SQLCHAR *)sql,sql_nts) == SQL_ERROR ) { printf("error: prepare stmt\n"); } else { printf("success: prepare stmt\n"); } /* 변수 sal 에 100 을할당 */ sal = 100; /* SQL 문장에매개변수 (sal) 를연결시킴 */ if ( SQLBindParameter( stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sal, 0, NULL) == SQL_ERROR ) { printf("error: Bind Parameter\n"); } else { printf("success: 1 Bind Parameter\n"); } /* SQL 문장실행, 프로시져 PROC1 을실행해서 'SELECT eno, ename, dno FROM emp' 의결과값은 P1 에 'SELECT name,dept,job FROM staff WHERE salary >?'(USING SAL) 의결과값은 P2 에가져온다 */ if (SQL_ERROR == SQLExecute(stmt)) 134 Stored Procedures Manual

147 { } printf("error: Execute Procedure\n"); /* 'SELECT eno, ename, dno FROM emp' 의결과값을변수 (eno, ename, dno) 에저장 */ if (SQL_ERROR == SQLBindCol(stmt, 1, SQL_C_SLONG, &eno, 0, (long *)&eno_len)) { printf("error: Bind 1 Column\n"); } if (SQL_ERROR == SQLBindCol(stmt, 2, SQL_C_CHAR, ename, sizeof(ename), NULL)) { printf("error: Bind 2 Column\n"); } if (SQL_ERROR == SQLBindCol(stmt, 3, SQL_C_SLONG, &dno, 0, (long *)&dno_len)) { printf("error: Bind 3 Column\n"); } /* P1 에결과값이있는동안결과값을받아화면에출력 */ while (SQL_SUCCESS == rc) { rc = SQLFetch(stmt); if (SQL_SUCCESS == rc) { printf("result Set 1 : %d,%s,%d\n",eno, ename, dno); } else { if (SQL_NO_DATA == rc) { break; } else { printf("error: SQLFetch [%d]\n", rc); execute_err(dbc, stmt, sql); break; } } } 사용자정의타입 135

148 /* 다음결과 (P2) 로이동 */ rc = SQLMoreResults(stmt); if (SQL_ERROR == rc) { printf("error: SQLMoreResults\n"); } else { /* 'SELECT name,dept,job FROM staff WHERE salary >?'(USING SAL) 의 결과값을변수 (name, dept, job) 에저장 */ if (SQL_ERROR == SQLBindCol(stmt, 1, SQL_C_CHAR, name, sizeof(name), NULL)) { printf("error: Bind 1 Column\n"); } if (SQL_ERROR == SQLBindCol(stmt, 2, SQL_C_CHAR, dept, sizeof(dept), NULL)) { printf("error: Bind 2 Column\n"); } if (SQL_ERROR == SQLBindCol(stmt, 3, SQL_C_CHAR, job, sizeof(job), (long *)&job_ind)) { printf("error: Bind 3 Column\n"); } /* P2 에결과값이있는동안결과값을받아화면에출력 */ while (SQL_SUCCESS == rc) { rc = SQLFetch(stmt); if (SQL_SUCCESS == rc) { if( job_ind == -1 ) printf("result Set 2 : %s,%s,null\n",name, dept); else printf("result Set 2 : %s,%s,%s\n",name, dept, job); } else { if (SQL_NO_DATA == rc) { 136 Stored Procedures Manual

149 break; } else { printf("error: SQLFetch [%d]\n", rc); execute_err(dbc, stmt, sql); break; } } } } if (SQL_ERROR == SQLFreeStmt( stmt, SQL_DROP )) { printf("sql free stmt error\n"); } } 사용자정의타입 137

150

151 7. 타입세트 이장에서는타입세트를정의하고사용하는방법에대해설명한다. 타입세트 139

152 개요 타입세트 (Type Set) 는저장프로시저에서사용하는사용자정의타입들을한곳에모아서관리하도록해주는데이터베이스객체 (Object) 이다. 특징 사용자정의타입의공유 사용자정의타입들을한곳에서관리하므로각각의저장프로시저내에서동일한구조의사용자정의타입을중복해서선언하지않아도된다. 사용자정의타입을인자또는리턴값으로사용 동일한타입세트에속해있는타입은인자또는리턴값으로프로시저간전달이가능하다. 단, 클라이언트로는전송할수없다. 데이터타입들을논리적단위로통합관리 타입세트는저장프로시저와저장함수에서사용하는타입들을데이터의논리적단위로통합관리하기용이하게해준다. 결과집합전달 저장프로시저내부에서실행된 SQL 문의결과집합을 REF CURSOR 타입을사용하여클라이언트로전달할수있다. 구조 아래그림과샘플코드에서처럼, 타입세트를사용하면여러저장프로시저에서사용하는사용자정의타입을공유하고관리하는것이가능하며, 데이터이동이용이하다. 140 Stored Procedures Manual

153 TYPESET 1 PROCEDURE 1, 2, FUNCTION 3 에서사용하는데이터타입들의집합 PROCDURE 1 PROCDURE 2 FUNCTION 3 TYPESET 1 사용자정의타입 emp_rec_type 과 emp_arr_type 을 typeset_1 안에정의한다. CREATE TYPESET typeset_1 AS TYPE emp_rec_type IS RECORD ( name VARCHAR(20), job_id VARCHAR(10), salary NUMBER(8) ); TYPE emp_arr_type IS TABLE OF emp_rec_type INDEX BY INTEGER; / PROCEDURE 1 저장프로시저 procedure_1 에서 emp_arr_type 을 OUT 인자로하는 procedure_2 를호출한다. CREATE PROCEDURE procedure_1 AS V1 typeset_1.emp_arr_type; procedure_2( V1 ); PRINTLN(V1[1].name); PRINTLN(V1[1].job_id); PRINTLN(V1[1].salary); / PROCEDURE 2 타입세트 141

154 저장프로시저 procedure_2 의 OUT 인자에 function_3 의반환값을할당한다. CREATE PROCEDURE procedure_2 ( P1 OUT typeset_1.emp_arr_type ) AS V1 typeset_1.emp_rec_type; V1 := function_3(); P1[1] := V1; / FUNCTION 3 typeset_1.emp_rec_type 타입의값을반환한다. CREATE FUNCTION function_3 RETURN typeset_1.emp_rec_type AS V1 typeset_1.emp_rec_type; V1.name := 'Smith'; V1.job_id := 1010; V1.salary := 200; RETURN V1; / 142 Stored Procedures Manual

155 CREATE TYPESET 구문 create_typeset ::= CREATE TYPESET typeset_name OR REPLACE user_name. AS IS type_declaration END 전제조건 SYS 사용자또는 CREATE PROCEDURE, CREATE ANY PROCEDURE 시스템권한을가진사용자만실행가능하다. 설명 저장프로시저에서사용할사용자정의타입을포함하는타입세트를정의한다. 타입세트내에서정의한타입은프로시저의 INPUT / OUTPUT 인자로사용할때용이하다. user_name 생성될타입세트의소유자이름을명시한다. 생략하면알티베이스는현재세션에연결된사용자의스키마에타입세트를생성한다 typeset_name 타입세트의이름이다. type_declaration 타입세트 143

156 6 장사용자정의타입에서 사용자정의타입의정의 절을참고한다. 예제 예제 1 my_typeset 이란이름의타입세트를생성한다. CREATE TYPESET my_typeset AS TYPE emp_rec_type IS RECORD( name VARCHAR(20), id INTEGER ); TYPE emp_arr_type IS TABLE OF emp_rec_type INDEX BY INTEGER; / 예제 2 my_typeset 을이용하는프로시저 my_proc1 을생성한다. CREATE PROCEDURE my_proc1 AS V1 my_typeset.emp_rec_type; V2 my_typeset.emp_arr_type; V1.name := 'jejeong'; V1.id := 10761; V2[1] := V1; V1.name := 'ehkim'; V1.id := 11385; V2[2] := V1; V1.name := 'mslee'; V1.id := 13693; V2[3] := V1; PRINTLN('NAME : ' V2[1].name ' ID : ' V2[1].id ); PRINTLN('NAME : ' V2[2].name ' ID : ' V2[2].id ); PRINTLN('NAME : ' V2[3].name ' ID : ' V2[3].id ); 144 Stored Procedures Manual

157 / 결과 isql> exec my_proc1; NAME : jejeong ID : NAME : ehkim ID : NAME : mslee ID : Execute success. 타입세트 145

158 DROP TYPESET 구문 drop_typeset ::= DROP TYPESET typeset_name ; user_name. 전제조건 SYS 사용자이거나객체의생성자또는 DROP ANY PROCEDURE 시스템권한을가진사용자만실행가능하다. 설명 명시된타입세트를제거한다. 제거된타입세트를사용하던저장프로시저는유효하지않은 (Invalid) 상태가된다. user_name 제거될타입세트의소유자이름을명시한다. 생략하면알티베이스는제거될타입세트가현재세션에연결된사용자의스키마에속한것으로간주한다. typeset_name 타입세트의이름이다. 예제 146 Stored Procedures Manual

159 my_typeset 이란이름의타입세트를삭제한다. DROP TYPESET my_typeset 타입세트 147

160

161 8. 동적 SQL 이장에서는저장프로시저와저장함수에서동적 SQL 을사용하는방법을설명한다. 동적 SQL 149

162 동적 SQL 의개요 동적 SQL(Dynamic SQL) 은실행시간에사용자가원하는질의를만들어서실행하는것이다. 일반적인저장프로시저의 SQL 실행방법은정적인 (Static) 방법으로, 저장프로시저가컴파일될때이미 SQL 문의실행계획이생성된다. 저장프로시저를실행할때결정되는 SQL 구문은동적 SQL 을사용해야한다. 동적 SQL 의실행 아래다이어그램은정적 SQL 과동적 SQL 이포함된저장프로시저를생성하고실행할때알티베이스내부에서이를수행하는과정을비교하고있다. 150 Stored Procedures Manual

163 [ 그림 8-1] 정적 SQL 과동적 SQL 의실행과정비교 [ 그림 8-1] 의왼쪽저장프로시저는 DELETE FROM T1 문을정적으로처리한것이고, 오른쪽저장프로시저는동일한 DELETE 문을 EXECUTE IMMEDIATE 를사용하여동적으로처리한것이다. 전자는프로시저생성 ( 컴파일 ) 시에이미 DELETE 문에대한실행계획이만들어지고, 실행시에 DELETE 문을수행 (EXECUTE) 한다. 하지만, 후자는프로시저생성 ( 컴파일 ) 시에는실행계획을만들지않고프로시저를실행할때 DELETE 문에대해실행계획을생성하고수행한다. 수행시에실행계획을생성하고수행하기때문에, 수행시에 SQL 문장이다른문장으로바뀌어도된다. 특징 동적 SQL 151

Altibase Stored Procedure Manual

Altibase Stored Procedure Manual ALTIBASE HDB Application Development Stored Procedures Manual Release 6.3.1 (November 30, 2017) ----------------------------------------------------------- ALTIBASE Application Development Stored Procedures

More information

Altibase Stored Procedure Manual

Altibase Stored Procedure Manual ALTIBASE HDB Application Development C/C++ External Procedures Manual Release 6.3.1 (April 16, 2015) ----------------------------------------------------------- ALTIBASE Application Development C/C++ External

More information

13주-14주proc.PDF

13주-14주proc.PDF 12 : Pro*C/C++ 1 2 Embeded SQL 3 PRO *C 31 C/C++ PRO *C NOT! NOT AND && AND OR OR EQUAL == = SQL,,, Embeded SQL SQL 32 Pro*C C SQL Pro*C C, C Pro*C, C C 321, C char : char[n] : n int, short, long : float

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE ALTIBASE HDB 6.3.1.10.1 Patch Notes 목차 BUG-45710 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG-45730 ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG-45760 ROLLUP/CUBE 절을포함하는질의는 SUBQUERY REMOVAL 변환을수행하지않도록수정합니다....

More information

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - chap05-제어문.pptx int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); 1 학습목표 제어문인,, 분기문에 대해 알아본다. 인 if와 switch의 사용 방법과 사용시 주의사항에 대해 알아본다.

More information

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 ALTIBASE HDB 6.5.1.5.10 Patch Notes 목차 BUG-46183 DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG-46249 [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 BUG-46266 [sm]

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 06 반복문 01 반복문의필요성 02 for문 03 while문 04 do~while문 05 기타제어문 반복문의의미와필요성을이해한다. 대표적인반복문인 for 문, while 문, do~while 문의작성법을 알아본다. 1.1 반복문의필요성 반복문 동일한내용을반복하거나일정한규칙으로반복하는일을수행할때사용 프로그램을좀더간결하고실제적으로작성할수있음.

More information

ALTIBASE HDB Patch Notes

ALTIBASE HDB Patch Notes ALTIBASE HDB 6.5.1.5.6 Patch Notes 목차 BUG-45643 암호화컬럼의경우, 이중화환경에서 DDL 수행시 Replication HandShake 가실패하는문제가있어수정하였습니다... 4 BUG-45652 이중화에서 Active Server 와 Standby Server 의 List Partition 테이블의범위조건이다른경우에 Handshake

More information

DBMS & SQL Server Installation Database Laboratory

DBMS & SQL Server Installation Database Laboratory DBMS & 조교 _ 최윤영 } 데이터베이스연구실 (1314 호 ) } 문의사항은 cyy@hallym.ac.kr } 과제제출은 dbcyy1@gmail.com } 수업공지사항및자료는모두홈페이지에서확인 } dblab.hallym.ac.kr } 홈페이지 ID: 학번 } 홈페이지 PW:s123 2 차례 } } 설치전점검사항 } 설치단계별설명 3 Hallym Univ.

More information

강의 개요

강의 개요 DDL TABLE 을만들자 웹데이터베이스 TABLE 자료가저장되는공간 문자자료의경우 DB 생성시지정한 Character Set 대로저장 Table 생성시 Table 의구조를결정짓는열속성지정 열 (Clumn, Attribute) 은이름과자료형을갖는다. 자료형 : http://dev.mysql.cm/dc/refman/5.1/en/data-types.html TABLE

More information

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate ALTIBASE HDB 6.1.1.5.6 Patch Notes 목차 BUG-39240 offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG-41443 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate 한뒤, hash partition

More information

Visual Basic 반복문

Visual Basic 반복문 학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For

More information

윈도우즈프로그래밍(1)

윈도우즈프로그래밍(1) 제어문 (2) For~Next 문 윈도우즈프로그래밍 (1) ( 신흥대학교컴퓨터정보계열 ) 2/17 Contents 학습목표 프로그램에서주어진특정문장을부분을일정횟수만큼반복해서실행하는문장으로 For~Next 문등의구조를이해하고활용할수있다. 내용 For~Next 문 다중 For 문 3/17 제어문 - FOR 문 반복문 : 프로그램에서주어진특정문장들을일정한횟수만큼반복해서실행하는문장

More information

Microsoft Word - 05_SUBPROGRAM.doc

Microsoft Word - 05_SUBPROGRAM.doc ORACLE SUBPROGRAM INTRODUCTION PLSQL 은오라클에서제공하는프로그래밍언어이다. 이는데이터베이스언어인 SQL 과함께효과적으로데이터베이스에접근할수있는방법을제공하고있다. Procedural LanguageSQL 의약자에서볼수있듯이절차적인기능을기본적으로가지는프로그래밍언어이다. PLSQL 은기본적으로블록 (BLOCK) 구조를가지고있다. 블록의기본적인구성은선언부

More information

MySQL-.. 1

MySQL-.. 1 MySQL- 기초 1 Jinseog Kim Dongguk University jinseog.kim@gmail.com 2017-08-25 Jinseog Kim Dongguk University jinseog.kim@gmail.com MySQL-기초 1 2017-08-25 1 / 18 SQL의 기초 SQL은 아래의 용도로 구성됨 데이터정의 언어(Data definition

More information

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins Project 1-3: Implementing DML Due: 2015/11/11 (Wed), 11:59 PM 이번프로젝트의목표는프로젝트 1-1 및프로젝트 1-2에서구현한프로그램에기능을추가하여간단한 DML을처리할수있도록하는것이다. 구현한프로그램은 3개의 DML 구문 (insert, delete, select) 을처리할수있어야한다. 테이블데이터는파일에저장되어프로그램이종료되어도사라지지않아야한다.

More information

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

@OneToOne(cascade = = addr_id) private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a 1 대 1 단방향, 주테이블에외래키실습 http://ojcedu.com, http://ojc.asia STS -> Spring Stater Project name : onetoone-1 SQL : JPA, MySQL 선택 http://ojc.asia/bbs/board.php?bo_table=lecspring&wr_id=524 ( 마리아 DB 설치는위 URL

More information

Infinity(∞) Strategy

Infinity(∞) Strategy 반복제어 표월성 passwd74@cherub.sungkyul.edu 개요 for() 문 break문과 continue문 while문 do-while문 for() 문 for() 문형식 for( 표현식1; 표현식2; 표현식3) 여러문장들 ; 표현식 1 : 초기화 (1 번만수행 ) 표현식 2 : 반복문수행조건 ( 없으면무한반복 ) 표현식 3 : 반복문수행횟수 for()

More information

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터 Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터를사용자에게전송하게되며 Parsing 단계에서실행계획이생성된다. Bind 변수를사용하는 SQL

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

90

90 89 3 차원공간질의를위한효율적인위상학적데이터모델의검증 Validation of Efficient Topological Data Model for 3D Spatial Queries Seokho Lee Jiyeong Lee 요약 키워드 Abstract Keywords 90 91 92 93 94 95 96 -- 3D Brep adjacency_ordering DECLARE

More information

Microsoft Word - 04_EXCEPTION.doc

Microsoft Word - 04_EXCEPTION.doc ORACLE EXCEPTION INTRODUCTION PLSQL 블록이 PARSE 되는동안에발생되는에러를컴파일에러 (Compilation Error) 라고부르며, PLSQL 블록이실행되는동안에발생되는에러를런타임에러 (Run-Time Error) 라고부르는데, 이런타임에러를오라클에서는예외 (Exception) 라고부른다. 오라클의예외 (Exception) 는크게두가지로구분된다.

More information

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 6.1 함수프로시저 6.2 서브프로시저 6.3 매개변수의전달방식 6.4 함수를이용한프로그래밍 3 프로시저 (Procedure) 프로시저 (Procedure) 란무엇인가? 논리적으로묶여있는하나의처리단위 내장프로시저 이벤트프로시저, 속성프로시저, 메서드, 비주얼베이직내장함수등

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

PowerPoint Presentation

PowerPoint Presentation Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음

More information

Microsoft Word - PLSQL.doc

Microsoft Word - PLSQL.doc PL/SQL 2008 DB system and programming 보충자료 PL/SQL의실행절 BEGIN 절에서의몇가지규칙 - 실행문은여러라인에걸쳐사용할수있다. - 변수명의명명규칙은오라클의일반적인명명규칙과동일하다. PL/SQL 블록내에서 SQL 문을사용할때에는컬럼명과같은변수명은피해야한다. - SQL에서와마찬가지로날짜와문자는홑따옴표 ( ) 를사용하여인용하여야한다.

More information

제4장 기본 의미구조 (Basic Semantics)

제4장  기본 의미구조 (Basic Semantics) 제 4 장블록및유효범위 Reading Chap. 5 숙대창병모 1 4.1 변수선언및유효범위 숙대창병모 2 변수선언과유효범위 변수선언 Declaration before Use! 대부분의언어에서변수는사용전에먼저선언해야한다. 변수의유효범위 (scope) 선언된변수가유효한 ( 사용될수있는 ) 프로그램내의범위 / 영역 변수이름뿐아니라함수등다른이름도생각해야한다. 정적유효범위

More information

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D> 리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1

More information

4장.문장

4장.문장 문장 1 배정문 혼합문 제어문 조건문반복문분기문 표준입출력 입출력 형식화된출력 [2/33] ANSI C 언어와유사 문장의종류 [3/33] 값을변수에저장하는데사용 형태 : < 변수 > = < 식 > ; remainder = dividend % divisor; i = j = k = 0; x *= y; 형변환 광역화 (widening) 형변환 : 컴파일러에의해자동적으로변환

More information

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역 WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역시쉽게해결할수있다. 이번화이트페이퍼에서는 Window Function 중순위 RANK, ROW_NUMBER,

More information

쉽게

쉽게 Power Java 제 4 장자바프로그래밍기초 이번장에서학습할내용 자바프로그램에대한기초사항을학습 자세한내용들은추후에. Hello.java 프로그램 주석 주석 (comment): 프로그램에대한설명을적어넣은것 3 가지타입의주석 클래스 클래스 (class): 객체를만드는설계도 ( 추후에학습 ) 자바프로그램은클래스들로구성된다. 그림 4-1. 자바프로그램의구조 클래스정의

More information

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information

단답형 (26 회기출문제 ) 1. 아래와같은테이블이있을때아래의 SQL 결과에대해서 Oracle, SQL Server 순서로적으시오 TAB1 COL1 CHAR(10) COL2 CHAR(10) INSERT INTO TAB1 VALUES ('1',''); INSERT INT

단답형 (26 회기출문제 ) 1. 아래와같은테이블이있을때아래의 SQL 결과에대해서 Oracle, SQL Server 순서로적으시오 TAB1 COL1 CHAR(10) COL2 CHAR(10) INSERT INTO TAB1 VALUES ('1',''); INSERT INT Study Room Doc.03 : SQLD 예상문제 ( 단답형 ) 네이버 Cafe : 데이터베이스전문가포럼 Study Room http://cafe.naver.com/sqlpd SQLD 26,25,24,21 회기출문제를바탕으로작성 작성자 : 월야루 도움 : 빙수민외카페댓글 2017-11-30 단답형 (26 회기출문제 ) 1. 아래와같은테이블이있을때아래의 SQL

More information

6장. SQL

6장. SQL 학습목표 SQL이 무엇인지 개념을 설명 테이블을 생성, 변경, 제거할 할 수 있다. 수 있다. 데이터를 검색, 갱신, 삽입, 삭 제할 수 있다. 뷰, 시스템 카탈로그, 저장 프 로시저, 트리거에 대한 개념 을 설명할 수 있다. 2 목차 SECTION 01 SQL의 개요 11 SQL의 역사 12 SQL의 유형별 종류 SECTION 0 21 스키마 22 테이블

More information

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - e pptx Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

10.ppt

10.ppt : SQL. SQL Plus. JDBC. SQL >> SQL create table : CREATE TABLE ( ( ), ( ),.. ) SQL >> SQL create table : id username dept birth email id username dept birth email CREATE TABLE member ( id NUMBER NOT NULL

More information

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A 예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = 1 2 3 4 5 6 7 8 9 B = 8 7 6 5 4 3 2 1 0 >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = 0 0 0 0 1 1 1 1 1 >> tf = (A==B) % A 의원소와 B 의원소가똑같은경우를찾을때 tf = 0 0 0 0 0 0 0 0 0 >> tf

More information

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - CSharp-10-예외처리 10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2 예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다.

More information

Altibase Installation Manual

Altibase Installation Manual ALTIBASE HDB Application Development Windows ODBC Driver Installer User s Guide Release 6.3.1 (April 17, 2015) ----------------------------------------------------------- ALTIBASE Application Development

More information

Altibase Starting User's Manual

Altibase Starting User's Manual ALTIBASE HDB Tools & Utilities Altibase Hadoop Connector User's Manual Release 6 (April 17, 2015) ----------------------------------------------------------- ALTIBASE Tools & Utilities Altibase Hadoop

More information

PowerPoint Presentation

PowerPoint Presentation 6 장 SQL (section 4-6) 목차 SECTION 01 SQL 의개요 1-1 SQL의역사 1-2 SQL의유형별종류 SECTION 02 데이터정의어 (DDL) 2-1 스키마 2-2 테이블생성 (CREATE TABLE) 2-3 테이블변경 (ALTER TABLE) 2-4 테이블제거 (DROP TABLE) 2-5 제약조건 SECTION 03 데이터조작어 (DML)

More information

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL 다양한예제로쉽게배우는 오라클 SQL 과 PL/SQL 서진수저 9 장인덱스를배웁니다 1 1. 인덱스란무엇인가? 2 - ROWID ( 주소 ) 조회하기 SCOTT>SELECT ROWID, empno, ename 2 FROM emp 3 WHERE empno=7902 ; ROWID EMPNO ENAME --------------------------------- ----------

More information

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx 자바기본문법 1. 기본사항 2. 자료형 3. 변수와상수 4. 연산자 1 주석 (Comments) 이해를돕기위한설명문 종류 // /* */ /** */ 활용예 javadoc HelloApplication.java 2 주석 (Comments) /* File name: HelloApplication.java Created by: Jung Created on: March

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 2 장 : C 프로그램시작하기 2012 년 이은주 학습목표 을작성하면서 C 프로그램의구성요소 주석 (comment) 이란무엇인지알아보고, 주석을만드는방법 함수란무엇인지알아보고, C 프로그램에반드시필요한 main 함수 C 프로그램에서출력에사용되는 printf 함수 변수의개념과변수의값을입력받는데사용되는 scanf 함수 2 목차 프로그램코드

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

Microsoft PowerPoint - 10Àå.ppt

Microsoft PowerPoint - 10Àå.ppt 10 장. DB 서버구축및운영 DBMS 의개념과용어를익힌다. 간단한 SQL 문법을학습한다. MySQL 서버를설치 / 운영한다. 관련용어 데이터 : 자료 테이블 : 데이터를표형식으로표현 레코드 : 테이블의행 필드또는컬럼 : 테이블의열 필드명 : 각필드의이름 데이터타입 : 각필드에입력할값의형식 학번이름주소연락처 관련용어 DB : 테이블의집합 DBMS : DB 들을관리하는소프트웨어

More information

ESQL/C

ESQL/C 20 장. PL/SQL 커서 주요내용 암시적커서 명시적커서선언 명시적커서열기및닫기 명시적커서에서데이터 Fetch 커서의속성 (%ISOPEN, %ROWCOUNT, %FOUND, %NOTFOUND) 커서 FOR 루프 PL/SQL 의커서 (Cursor) 커서 SQL 문과프로그램실행과정에서결과를저장할수있는오라클메모리구조 ( 개별 SQL 작업영역 ) 암시적커서 (Implicit

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

<4D F736F F F696E74202D20C1A63036C0E520BCB1C5C3B0FA20B9DDBAB928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63036C0E520BCB1C5C3B0FA20B9DDBAB928B0ADC0C729205BC8A3C8AF20B8F0B5E55D> Power Java 제 6 장선택과반복 이번장에서학습할내용 조건문이란? if 문 if, else 문 중첩 if 문 switch 문 break문 continue문 지금까지는문장들이순차적으로실행된다고하였다. 하지만필요에따라서조건이만족되면문장의실행순서를변경할수있는기능이제공된다. 3 가지의제어구조 조건문 문장이실행되는순서에영향을주는문장 조건에따라서여러개의실행경로가운데하나를선택

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

PowerPoint Presentation

PowerPoint Presentation #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을작성하면서 C 프로그램의구성요소에대하여알아본다.

More information

슬라이드 제목 없음

슬라이드 제목 없음 4.2 SQL 개요 SQL 개요 SQL은현재 DBMS 시장에서관계 DBMS가압도적인우위를차지하는데중요한요인의하나 SQL은 IBM 연구소에서 1974년에 System R이라는관계 DBMS 시제품을연구할때관계대수와관계해석을기반으로, 집단함수, 그룹화, 갱신연산등을추가하여개발된언어 1986년에 ANSI( 미국표준기구 ) 에서 SQL 표준을채택함으로써 SQL이널리사용되는데기여

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Spring Boot/JDBC JdbcTemplate/CRUD 예제 Spring Boot/JDBC JdbcTemplate/CRUD 예제 오라클자바커뮤니티 (ojc.asia, ojcedu.com) Spring Boot, Gradle 과오픈소스인 MariaDB 를이용해서 EMP 테이블을만들고 JdbcTemplate, SimpleJdbcTemplate 을이용하여 CRUD 기능을구현해보자. 마리아 DB 설치는다음 URL 에서확인하자.

More information

문서 템플릿

문서 템플릿 HDSI 툴분석 [sql injection 기술명세서 ] Sql injection 기술명세서 Ver. 0.01 이문서는 sql injection 기술명세가범위입니다. Copyrights Copyright 2009 by CanvasTeam@SpeeDroot( 장경칩 ) All Rights Reserved. 장경칩의사전승인없이본내용의전부또는일부에대한복사, 전재,

More information

Microsoft PowerPoint 세션.ppt

Microsoft PowerPoint 세션.ppt 웹프로그래밍 () 2006 년봄학기 문양세강원대학교컴퓨터과학과 세션변수 (Session Variable) (1/2) 쇼핑몰장바구니 장바구니에서는사용자가페이지를이동하더라도장바구니의구매물품리스트의내용을유지하고있어야함 PHP 에서사용하는일반적인변수는스크립트의수행이끝나면모두없어지기때문에페이지이동시변수의값을유지할수없음 이러한문제점을해결하기위해서 PHP 에서는세션 (session)

More information

C# Programming Guide - Types

C# Programming Guide - Types C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든

More information

Microsoft PowerPoint - chap-06.pptx

Microsoft PowerPoint - chap-06.pptx 쉽게풀어쓴 C 언어 Express 제 6 장조건문 컴퓨터프로그래밍기초 이번장에서학습할내용 조건문이란? if 문 if, 문 중첩 if 문 switch 문 break문 continue문 goto 문 5장까지는문장들이순차적으로실행된다고하였다. 하지만필요에따라서조건이만족되면문장의실행순서를변경할수있는기능이제공된다. 컴퓨터프로그래밍기초 2 조건문 조건에따라서여러개의실행경로가운데하나를선택

More information

Microsoft PowerPoint Predicates and Quantifiers.ppt

Microsoft PowerPoint Predicates and Quantifiers.ppt 이산수학 () 1.3 술어와한정기호 (Predicates and Quantifiers) 2006 년봄학기 문양세강원대학교컴퓨터과학과 술어 (Predicate), 명제함수 (Propositional Function) x is greater than 3. 변수 (variable) = x 술어 (predicate) = P 명제함수 (propositional function)

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Lecture 02 프로그램구조및문법 Kwang-Man Ko kkmam@sangji.ac.kr, compiler.sangji.ac.kr Department of Computer Engineering Sang Ji University 2018 자바프로그램기본구조 Hello 프로그램구조 sec01/hello.java 2/40 자바프로그램기본구조 Hello 프로그램구조

More information

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher( 실행할페이지.jsp); 다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher

More information

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - chap06-5 [호환 모드] 2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.

More information

PowerPoint Presentation

PowerPoint Presentation public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +

More information

17장 클래스와 메소드

17장 클래스와 메소드 17 장클래스와메소드 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 1 / 18 학습내용 객체지향특징들객체출력 init 메소드 str 메소드연산자재정의타입기반의버전다형성 (polymorphism) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 2 / 18 객체지향특징들 객체지향프로그래밍의특징 프로그램은객체와함수정의로구성되며대부분의계산은객체에대한연산으로표현됨객체의정의는

More information

Tcl의 문법

Tcl의 문법 월, 01/28/2008-20:50 admin 은 상당히 단순하고, 커맨드의 인자를 스페이스(공백)로 단락을 짓고 나열하는 정도입니다. command arg1 arg2 arg3... 한행에 여러개의 커맨드를 나열할때는, 세미콜론( ; )으로 구분을 짓습니다. command arg1 arg2 arg3... ; command arg1 arg2 arg3... 한행이

More information

C 프로그램의 기본

C 프로그램의 기본 C 프로그램의기본 목차 C 프로그램의구성요소 주석 main 함수 출력 C 언어의입력과출력 변수 printf 함수 scanf 함수 2 예제 2-1 : 첫번째 C 프로그램 3 2.1.1 주석 주석의용도 프로그램에대한설명 프로그램전체에대한대략적인정보를제공 프로그램수행에영향을미치지않는요소 4 2.1.1 주석 주석사용방법 /* 과 */ 을이용한여러줄주석 // 을이용한한줄주석

More information

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUERY 을실행하게된다면 BLOCK I/O 가많이발생하게된다. 이런이유로 QUERY 의성능은좋지못할것이다.

More information

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 (

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 ( 배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 ( 이후배치프로그램 ) 에대한성능문제를파악하기위해수행되는모든 SQL 에대한개별수행내역을정확히판단할수있어야한다.

More information

슬라이드 1

슬라이드 1 9. 저장프로시저 동일한 Transact-SQL 문을수시로사용한다면저장프로시저로만들어사용해보자. 효율성과성능면에서월등한발전을경험할수있을것이다. 2 청춘 청춘이란인생의어느기간을말하는것이아니라마음의상태를말하는것이다. 그것은장밋빛얼굴, 앵두같은입술, 하늘거리는자태가아니고강인한의지, 풍부한상상력, 불타는정열을말한다. 청춘이란인생의깊은샘물에서나오는정신력을뜻하며청춘이란유약함을물리치는용기,

More information

쉽게 풀어쓴 C 프로그래밊

쉽게 풀어쓴 C 프로그래밊 Power Java 제 27 장데이터베이스 프로그래밍 이번장에서학습할내용 자바와데이터베이스 데이터베이스의기초 SQL JDBC 를이용한프로그래밍 변경가능한결과집합 자바를통하여데이터베이스를사용하는방법을학습합니다. 자바와데이터베이스 JDBC(Java Database Connectivity) 는자바 API 의하나로서데이터베이스에연결하여서데이터베이스안의데이터에대하여검색하고데이터를변경할수있게한다.

More information

ALTIBASE HDB Patch Notes

ALTIBASE HDB Patch Notes ALTIBASE HDB 5.3.3.93 Patch Notes Table of Contents BUG-27950 ALL PRIVILEGES 권한을가진계정이다른계정의테이블에 Foreign Key 를 생성하지못한다. 3 BUG-38105 PASSWORD_LIFE_TIME 경과후유예기간 (PASSWORD_GRACE_TIME) 내에 접속을시도할경우알림메시지를발생해야한다.

More information

슬라이드 1

슬라이드 1 UNIT 16 예외처리 로봇 SW 교육원 3 기 최상훈 학습목표 2 예외처리구문 try-catch-finally 문을사용핛수있다. 프로그램오류 3 프로그램오류의종류 컴파일에러 (compile-time error) : 컴파일실행시발생 럮타임에러 (runtime error) : 프로그램실행시발생 에러 (error) 프로그램코드에의해서해결될수없는심각핚오류 ex)

More information

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770>

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770> 제 8강 SQL: 관계데이터베이스언어 강의목표 관계데이타베이스언어로서상용 DBMS에서가장널리사용되는 SQL의동작원리에관하여학습하고, 이를이용하여다양한질의문을작성하는방법을습득한다 기대효과 SQL의데이터정의기능을이해한다 SQL의데이터조작기능중질의기능을이해한다 SQL의데이터조작기능중데이터갱신기능을이해한다 SQL의데이터조작기능중뷰및인덱스관련기능을이해한다 SQL 의개요

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 3 if, if else, if else if, switch case for, while, do while break, continue : System.in, args, JOptionPane for (,, ) @ vs. logic data method variable Data Data Flow (Type), ( ) @ Member field

More information

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout <<  양수입력 : ; cin >> *p; if (*p <= 0) cout <<  양수를입력해야합니다  << endl; return; 동적할 15 장기타주제들 auto_ptr 변환함수 cast 연산자에의한명시적형변환실행시간타입정보알아내기 (RTTI) C++ 프로그래밍입문 1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout > *p; if (*p

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean

More information

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp 1 0 1.7 6 5 'A ' '/ u 4 4 2 2 ' " JS P 프로그래밍 " A ', 'b ', ' 한 ', 9, \ u d 6 5 4 ' c h a r a = 'A '; 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 < % @ p a g e c o n te n

More information

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

SQL Tuning Business Development DB

SQL Tuning Business Development DB SQL Tuning Business Development DB Oracle Optimizer 4.1 Optimizer SQL SQL.. SQL Optimizer :.. Rule-Based Optimization (RBO), Cost-Based Optimization (CBO) SQL Optimizer SQL Query Parser Dictionary Rule-Based

More information

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT 3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT NOT NULL, FOREIGN KEY (parent_id) REFERENCES Comments(comment_id)

More information

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET 135-080 679-4 13 02-3430-1200 1 2 11 2 12 2 2 8 21 Connection 8 22 UniSQLConnection 8 23 8 24 / / 9 3 UniSQL 11 31 OID 11 311 11 312 14 313 16 314 17 32 SET 19 321 20 322 23 323 24 33 GLO 26 331 GLO 26

More information

TITLE

TITLE CSED421 Database Systems Lab MySQL Basic Syntax SQL DML & DDL Data Manipulation Language SELECT UPDATE DELETE INSERT INTO Data Definition Language CREATE DATABASE ALTER DATABASE CREATE TABLE ALTER TABLE

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

ALTIBASE5 개발자교육

ALTIBASE5 개발자교육 ALTIBASE5 개발자교육 CONTENTS I 1. SQL 2. PSM 3. Precompiler (SESC, APRE) 4. JDBC 5. FailOver 6. Data Dictionary - 2 - CONTENTS II 7. isql 8. iloader 9. AEXPORT 10. altiprofile 11. AdminCenter 12. 기타 - 3 -

More information

Microsoft Word - 03_SQL_CURSOR.doc

Microsoft Word - 03_SQL_CURSOR.doc SQL Cursor SQL 커서소개오라클서버에서는 SQL 문을실행할때마다처리 (Parse, Execution) 를위한메모리공간, 즉 SQL 커서를사용하게된다. 이메모리공간은 Private SQL Area 라고도불리우며, 오라클의작업환경이 Dedicated Server 환경이냐또는 MTS(Multi- Threaded Server) 환경이냐에따라서버내에위치되는곳이다르다.

More information

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning C Programming Practice (I) Contents 변수와상수 블록과변수의범위 수식과연산자 제어문과반복문 문자와문자열 배열, 포인터, 메모리관리 구조체 디버거 (gdb) 사용법 2/17 Reference The C Programming language, Brian W. Kernighan, Dennis M. Ritchie, Prentice-Hall

More information

歯sql_tuning2

歯sql_tuning2 SQL Tuning (2) SQL SQL SQL Tuning ROW(1) ROW(2) ROW(n) update ROW(2) at time 1 & Uncommitted update ROW(2) at time 2 SQLDBA> @ UTLLOCKT WAITING_SESSION TYPE MODE_REQUESTED MODE_HELD LOCK_ID1

More information

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다 10 강. 쉘스크립트 쉘스크립트 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다른운영체제로이식되지않음 -스크립트언어를사용하면컴파일과정이없고인터프리터가소스파일에서명령문을판독하여각각의명령을수행

More information

슬라이드 1

슬라이드 1 17.1 데이터베이스트리거 17.2 DML 트리거 17.3 DML 트리거작성 17.4 DML 트리거관리 17.5 INSTEAD OF 트리거 17.6 NON-DML 트리거 17.1 데이터베이스트리거 데이터베이스트리거 (database trigger) 테이블에어떤조작이가해졌을때에미리지정해놓은처리를자동으로실행시키는블록 PL/SQL 블록으로작성, 오라클데이터베이스에저장

More information

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 ) 8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 ) - DDL(Data Definition Language) : show, create, drop

More information

PowerPoint Template

PowerPoint Template JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과

More information

Modern Javascript

Modern Javascript ES6 - Arrow Function Class Template String Destructuring Default, Rest, Spread let, const for..of Promises Module System Map, Set * Generator * Symbol * * https://babeljs.io/ Babel is a JavaScript compiler.

More information