Tibero tbesql/cobol 안내서 Tibero 5 Copyright 2013 TIBERO Co., Ltd. All Rights Reserved.
Copyright Notice Copyright 2013 TIBERO Co., Ltd. All Rights Reserved. 대한민국경기도성남시분당구서현동 272-6 우 ) 463-824 Restricted Rights Legend All TIBERO Software (Tibero ) and documents are protected by copyright laws and the Protection Act of Computer Programs, and international convention. TIBERO software and documents are made available under the terms of the TIBERO License Agreement and may only be used or copied in accordance with the terms of this agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any means, electronic, mechanical, or optical, without the prior written consent of TIBERO Co., Ltd. 이소프트웨어 (Tibero ) 사용서의내용과프로그램은저작권법, 컴퓨터프로그램보호법및국제조약에의해서보호받고있습니다. 사용서의내용과여기에된프로그램은 TIBERO Co., Ltd. 와의사용권계약하에서만사용이가능하며, 사용권계약을준수하는경우에만사용또는복제할수있습니다. 이사용서의전부또는일부분을 TIBERO의사전서면동의없이전자, 기계, 녹음등의수단을사용하여전송, 복제, 배포, 2차적저작물작성등의행위를하여서는안됩니다. Trademarks Tibero is a registered trademark of TIBERO Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. Tibero 는 TIBERO Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Open Source Software Notice This product includes open source software developed and/or licensed by "OpenSSL," "RSA Data Security, Inc.," "Apache Foundation," "Jean-loup Gailly and Mark Adler," and "Paul Hsieh's hash". Information about the afore mentioned and the related open source software can be found in the "${INSTALL_PATH}/license/oss_licenses" directory. 본제품은 OpenSSL, RSA Data Security, Inc., Apache Foundation 및 Jean-loup Gailly와 Mark Adler 및 Paul Hsieh's hash 에의해개발또는라이선스된오픈소스소프트웨어를포함합니다. 관련상세정보는제품의디렉터리 ${INSTALL_PATH}/license/oss_licenses 에기재된사항을참고해주십시오. 안내서정보안내서제목 : Tibero tbesql/cobol 안내서발행일 : 2013-02-25 소프트웨어버전 : Tibero 5 안내서버전 : 2.1.4
내용목차 안내서에대하여... xi 제1장 tbesql/cobol 소개... 1 1.1. 개요... 1 1.2. 구성요소... 1 1.2.1. tbesql/cobol 문장... 1 1.2.2. 프로그램변수... 2 1.2.3. 구조체및배열변수... 4 1.2.4. 커서... 5 1.2.5. 프리컴파일러... 5 제2장 데이터타입... 7 2.1. Tibero의데이터타입... 7 2.2. tbesql/cobol의데이터타입... 9 2.2.1. 데이터타입의대응... 9 2.2.2. 데이터타입의변환... 10 2.2.3. 데이터변수의사용... 12 2.2.4. ROWID... 13 2.2.5. VARCHAR... 14 2.2.6. 구조체... 16 2.2.7. 지시자... 17 제3장 기본프로그래밍... 21 3.1. 개요... 21 3.1.1. tbesql/cobol 프로그램의문법... 21 3.1.2. 프로그램의실행과정... 23 3.1.3. 런타임에러처리... 25 3.2. 프로그램의구조... 25 3.2.1. 변수선언... 26 3.2.2. 초기화... 26 3.2.3. 데이터베이스작업... 27 3.2.4. 종료화... 27 3.2.5. 에러처리... 28 3.3. tbesql/cobol 문장의실행... 28 3.3.1. SELECT... 28 3.3.2. INSERT... 30 3.3.3. UPDATE... 31 3.3.4. DELETE... 32 3.4. 커서... 33 3.4.1. 사용방법... 33 3.4.2. CURRENT OF 절... 35 3.4.3. 사용예제... 36 Tibero iii
3.5. 스크롤가능커서... 38 3.5.1. 사용방법... 38 3.5.2. 사용예제... 40 제4장 배열변수... 43 4.1. 개요... 43 4.2. 배열변수의선언... 44 4.3. 입 / 출력배열변수... 44 4.3.1. SELECT... 44 4.3.2. INSERT... 51 4.3.3. UPDATE... 53 4.3.4. DELETE... 54 4.3.5. FOR 절... 55 4.4. 구조체배열변수... 56 4.4.1. 구조체배열변수의선언... 56 4.4.2. 사용방법... 57 제5장 tbesql/cobol 문장... 59 5.1. 개요... 59 5.2. tbesql/cobol 문장의문법... 59 5.3. tbesql/cobol 문장의공통문법... 60 5.3.1. AT 절... 60 5.3.2. FOR 절... 61 5.3.3. DESCRIPTOR 이름... 61 5.4. tbesql/cobol 문장의목록... 63 5.4.1. ALLOCATE DESCRIPTOR... 64 5.4.2. CLOSE... 65 5.4.3. COMMIT... 66 5.4.4. CONNECT... 67 5.4.5. DEALLOCATE DESCRIPTOR... 69 5.4.6. DECLARE CURSOR... 69 5.4.7. DECLARE DATABASE... 71 5.4.8. DELETE... 71 5.4.9. DESCRIBE... 73 5.4.10. DESCRIBE DESCRIPTOR... 74 5.4.11. EXECUTE... 75 5.4.12. EXECUTE DESCRIPTOR... 77 5.4.13. EXECUTE IMMEDIATE... 78 5.4.14. FETCH... 79 5.4.15. FETCH DESCRIPTOR... 82 5.4.16. GET DESCRIPTOR... 83 5.4.17. INSERT... 86 5.4.18. OPEN... 87 5.4.19. PREPARE... 89 iv Tibero tbesql/cobol 안내서
5.4.20. ROLLBACK... 91 5.4.21. SAVEPOINT... 92 5.4.22. SELECT... 93 5.4.23. SET DESCRIPTOR... 94 5.4.24. UPDATE... 95 5.4.25. WHENEVER... 97 제6장 tbesql/cobol 프리컴파일러옵션... 99 6.1. 개요... 99 6.2. tbesql/cobol 프리컴파일러옵션의지정... 100 6.2.1. 환경설정파일... 100 6.2.2. 명령프롬프트... 101 6.2.3. 프로그램내부... 101 6.3. tbesql/cobol 프리컴파일러옵션의목록... 102 6.3.1. CLOSE_ON_COMMIT... 103 6.3.2. CONFIG... 103 6.3.3. DYNAMIC... 104 6.3.4. HOLD_CURSOR... 104 6.3.5. INAME... 105 6.3.6. INCLUDE... 105 6.3.7. MODE... 106 6.3.8. ONAME... 107 6.3.9. PREFETCH... 107 6.3.10. RELEASE_CURSOR... 108 6.3.11. SELECT_ERROR... 108 6.3.12. SQLCHECK... 109 6.3.13. TYPE_CODE... 110 6.3.14. UNSAFE_NULL... 110 6.3.15. USERID... 111 색인... 113 Tibero v
그림목차 [ 그림 1.1] tbesql/cobol 프로그램의컴파일과정... 6 [ 그림 2.1] ROWID의구성... 13 [ 그림 3.1] tbesql/cobol 프로그램의실행과정... 23 [ 그림 5.1] tbesql/cobol 문장의문법... 59 Tibero vii
예목차 [ 예 1.1] tbesql/cobol에서의 UPDATE 문장... 2 [ 예 1.2] tbesql/cobol에서의프로그램변수의선언... 3 [ 예 1.3] 입 / 출력변수의사용... 4 [ 예 2.1] 데이터타입의변환... 10 [ 예 2.2] TO_CHAR 함수를이용한데이터타입의변환... 11 [ 예 2.3] ROWID 타입의사용... 13 [ 예 2.4] VARCHAR 타입의변수선언... 14 [ 예 2.5] VARCHAR 타입이변환된구조체... 14 [ 예 2.6] VARCHAR 변수의일관성... 15 [ 예 2.7] 출력변수와지시자변수... 17 [ 예 2.8] 입력변수와지시자변수... 18 [ 예 3.1] emp.tbco 프로그램의프리컴파일... 24 [ 예 3.2] 프리컴파일러옵션을사용한 COPY 또는 SQLCA ESQL INCLUDE 파일의경로지정... 24 [ 예 3.3] 커서의선언... 33 [ 예 3.4] OPEN의실행... 33 [ 예 3.5] FETCH의실행... 34 [ 예 3.6] WHENEVER 문장의사용... 34 [ 예 3.7] CLOSE의사용... 34 [ 예 3.8] 커서의사용... 36 [ 예 4.1] SELECT 문장에서의배열변수의사용... 44 [ 예 4.2] SQLERRD(3) IN SQLCA를활용한루프의중단... 47 [ 예 4.3] INSERT 문장의배열변수... 52 [ 예 4.4] UPDATE 문장의배열변수... 53 [ 예 4.5] DELETE 문장의배열변수... 54 [ 예 6.1] tbesql/cobol 프리컴파일실행... 99 [ 예 6.2] tbesql/cobol 프리컴파일러의옵션을사용한프리컴파일실행... 99 Tibero ix
안내서에대하여 안내서의대상 본안내서는 Tibero ( 이하 Tibero) 에서제공하는 tbesql/cobol의기본개념과이를활용한프로그램의개발방법을알고자하는데이터베이스관리자 (Database Administrator, 이하 DBA) 및애플리케이션프로그램개발자를대상으로기술한다. 안내서의전제조건 본안내서를원활히이해하기위해서는다음과같은사항을미리알고있어야한다. 데이터베이스의이해 RDBMS 의이해 SQL 의이해 COBOL 프로그래밍의이해 안내서의제한조건 본안내서는 Tibero 를실무에적용하거나운용하는데필요한모든사항을포함하고있지않다. 따라서설 치와환경설정등운용및관리에관한내용은각제품안내서를참고하기바란다. 참고 Tibero 의설치및환경설정에관한내용은 "Tibero 설치안내서 " 를참고한다. 안내서에대하여 xi
안내서구성 TiberotbESQL/COBOL 안내서는총 6개의장으로이루어져있다. 각장의주요내용은다음과같다. 제1장 : tbesql/cobol 소개 tbesql/cobol의기본개념과구성요소를기술한다. 제 2 장 : 데이터타입 tbesql/cobol 프로그램에서사용되는데이터타입과데이터타입간의대응을기술한다. 제 3 장 : 기본프로그래밍 tbesql/cobol 프로그램의문법과실행과정, 런타임에러처리, 그리고 tbesql/cobol 문장의실행 과커서를기술한다. 제 4 장 : 배열변수 배열변수의기본개념과선언방법, tbesql/cobol 문장에서입 / 출력변수로배열변수를사용하는 방법을기술한다. 제 5 장 : tbesql/cobol 문장 tbesql/cobol 프로그램에서데이터베이스처리를위해사용하는 tbesql/cobol 문장을기술한다. 제 6 장 : tbesql/cobol 프리컴파일러옵션 tbesql/cobol 프리컴파일러를동작시킬때사용할수있는옵션을기술한다. xii Tibero tbesql/cobol 안내서
안내서규약 표기 <AaBbCc123> <Ctrl>+C [Button] 진하게 " "( 따옴표 ) ' 입력항목 ' 하이퍼링크 > +---- ---- 참고 의미프로그램소스코드의파일명, 디렉터리 Ctrl과 C를동시에누름 GUI의버튼또는메뉴이름강조다른관련안내서또는안내서내의다른장및절언급화면 UI에서입력항목에대한메일계정, 웹사이트메뉴의진행순서하위디렉터리또는파일있음하위디렉터리또는파일없음참고또는주의사항 [ 그림 1.1] [ 표 1.1] AaBbCc123 그림이름 표이름 명령어, 명령어수행후화면에출력된결과물, 예제코드 { } [ ] 필수인수값 옵션인수값 선택인수값 안내서에대하여 xiii
시스템사용환경 요구사항 Platform HP-UX 11i (PA-RISC, ia64) Solaris (SPARC 9/Solaris 9) AIX (PPC 5L/AIX 5.3) GNU (X86, 64, IA64) Linux kernel 2.6 이상 Windows(x86) 32bit/64bit Hardware 최소 1.5GB 하드디스크공간 512MB 이상메모리공간 Compiler PSM (C99 지원필요 ) tbesql/c (C99 지원필요 ) xiv Tibero tbesql/cobol 안내서
관련안내서 안내서 Tibero 설치안내서 Tibero tbcli 안내서 Tibero 애플리케이션개발자안내서 Tibero External Procedure 안내서 Tibero JDBC 개발자안내서 Tibero tbesql/c 안내서 Tibero tbpsm 안내서 Tibero tbpsm 참조안내서 Tibero 관리자안내서 Tibero tbadmin 안내서 Tibero 유틸리티안내서 Tibero 설치시필요한시스템요구사항과설치및제거방법을기술한안내서이다. Call Level Interface인 tbcli의개념과구성요소, 프로그램구조를소개하고 tbcli 프로그램을작성하는데필요한데이터타입, 함수, 에러메시지를기술한안내서이다. 각종애플리케이션라이브러리를이용하여애플리케이션프로그램을개발하는방법을기술한안내서이다. External Procedure를소개하고이를생성하고사용하는방법을기술한안내서이다. Tibero에서제공하는 JDBC 기능을이용하여애플리케이션프로그램을개발하는방법을기술한안내서이다. C 프로그래밍언어를사용해데이터베이스작업을수행하는각종애플리케이션프로그램을작성하는방법을기술한안내서이다. 저장프로시저모듈인 tbpsm의개념과문법, 구성요소를소개하고, tbpsm 프로그램을작성하는데필요한제어구조, 복합타입, 서브프로그램, 패키지와 SQL 문장을실행하고에러를처리하는방법을기술한안내서이다. 저장프로시저모듈인 tbpsm의패키지를소개하고, 이러한패키지에포함된각프로시저와함수의프로토타입, 파라미터, 예제등을기술한참조안내서이다. Tibero의동작과주요기능의원활한수행을보장하기위해 DBA가알아야할관리방법을논리적또는물리적측면에서하고, 관리를지원하는각종도구를기술한안내서이다. SQL/PSM 처리와 DBA를위한시스템관리기능을제공하는 GUI 기반의툴인 tbadmin을소개하고, 설치및사용방법을기술한안내서이다. 데이터베이스와관련된작업을수행하기위해필요한유틸리티의설치및환경설정, 사용방법을기술한안내서이다. Tibero를사용하는도중에발생할수있는각종에러의원인과해결방법을기술한안내서이다. 안내서에대하여 xv
안내서 에러참조안내서 Tibero 참조안내서 Tibero SQL 참조안내서 Tibero의동작과사용에필요한초기화파라미터와데이터사전, 정적뷰, 동적뷰를기술한참조안내서이다. 데이터베이스작업을수행하거나애플리케이션프로그램을작성할때필요한 SQL 문장을기술한참조안내서이다. xvi Tibero tbesql/cobol 안내서
연락처 Korea TIBERO Co., Ltd. 272-6, Seohyeon-dong, Bundang-gu, Seongnam-si, Gyeonggi-do, 463-824 South Korea Tel: +82-31-779-7113 Fax: +82-31-779-7119 Email: info@tmax.co.kr Web (Korean): http://www.tibero.com 기술지원 : http://technet.tmax.co.kr USA TmaxSoft, Inc. 560 Sylvan Avenue Englewood Cliffs, NJ 07632 U.S.A Tel: +1-201-567-8266 Fax: +1-201-567-7339 Email: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Japan TmaxSoft Japan Co., Ltd. 5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073 Japan Tel: +81-3-5765-2550 Fax: +81-3-5765-2567 Email: info@tmaxsoft.co.jp Web (Japanese): http://www.tmaxsoft.co.jp 안내서에대하여 xvii
China TmaxSoft China Co., Ltd. Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan, Chaoyang District, Beijing, China, 100027 China Tel: +86-10-6410-6145~8 Fax: +86-10-6410-6144 Email: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn xviii Tibero tbesql/cobol 안내서
제 1 장 tbesql/cobol 소개 본장에서는 tbesql/cobol 의기본개념과 tbesql/cobol 프로그래밍을시작하기전에알아야할구 성요소를한다. 1.1. 개요 tbesql은 ESQL(Embedded SQL: 내장 SQL) 의사용을위해 Tibero가제공하는인터페이스이다. 일반적으로, 프로그래밍언어는매우복잡하고세밀한작업을빠르게수행할수있으며, SQL 문장은간단한문법만으로데이터베이스에직접적인작업을수행할수있다. ESQL은이러한프로그래밍언어의연산능력과 SQL의데이터베이스 (Database) 를조작하는능력을결합하기위한방법이며, ANSI 및 ISO 표준으로정의되어있다. Tibero에서는애플리케이션개발에사용되는 COBOL과 C에대한 tbesql 인터페이스를제공한다. COBOL 프로그래밍언어를위한 ESQL 인터페이스를 tbesql/cobol이라고부르며, C 프로그래밍언어에대한인터페이스를 tbesql/c라고부른다. 참고 tbesql/c 에대한내용은 "Tibero tbesql/c 안내서 " 를참고한다. 1.2. 구성요소 1.2.1. tbesql/cobol 문장 tbesql/cobol 프로그램에는 COBOL 프로그래밍언어의소스코드와 tbesql/cobol 문장이혼합되어있다. tbesql/cobol 프로그램내에서 SQL 문장의질의 (Query) 등데이터베이스처리와관련된문장을 tbesql/cobol 문장 (tbesql/cobol Statement) 이라고한다. tbesql/cobol 문장은일반 SQL 문장과비슷하지만다음과같은점에서차이가난다. 항상 EXEC SQL로시작하고 END EXEC. 로종료한다. 필요한경우에입력변수와출력변수를포함한다. 일반 SQL 문장에는없는새로운절을포함할수있다. 예를들어, SELECT 문장은 INTO 절을포함할수있다. 제 1 장 tbesql/cobol 소개 1
다음은 tbesql/cobol 프로그램에서 UPDATE 문장을작성한예이다. [ 예 1.1] tbesql/cobol에서의 UPDATE 문장 EXEC SQL UPDATE EMP SET SALARY = SALARY * 1.05 WHERE EMPNO = 5 위의예에서는 tbesql/cobol 문장임을나타내는 EXEC SQL 로시작되고 로끝난다는점 에서일반 SQL 문장과차이가난다는것을알수있다. 참고 자세한내용은 제 5 장 tbesql/cobol 문장 을참고한다. 1.2.2. 프로그램변수 tbesql/cobol 프로그램에서가장중요한작업중에하나는프로그램과데이터베이스간에데이터를전달하는것이다. 이러한작업은주로프로그램변수를이용하여수행한다. 즉, 프로그램변수를이용하여질의를하거나변수의값을데이터베이스에저장할수있고, 데이터베이스의컬럼값을프로그램변수에저장할수도있다. 이러한작업을하기위해서는 Tibero의데이터타입과 tbesql/cobol 프로그램의데이터타입간의연관성이필요하다. 예를들어, 다음의 Tibero의데이터타입과 tbesql/cobol 프로그램의데이터타입은서로대응된다. Tibero 의데이터타입 NUMBER(p, s) tbesql/cobol 프로그램의데이터타입 PIC S9(n) NUMBER 타입에서 p 는정밀도 (Precision), s 는스케일 (Scale) 을의미한다. 참고 Tibero 의데이터타입과 tbesql/cobol 프로그램의데이터타입간의대응에대해서는 2.2.1. 데 이터타입의대응 을참고한다. 프로그램변수의선언 tbesql/cobol 프로그램에서의변수는 COBOL 프로그램의변수와거의동일하게선언되고사용된다. 데이터베이스작업과관련되지않는변수는 COBOL 프로그램에서사용되는것과같이제약없이사용할수있다. 다음은 tbesql/cobol에서프로그램변수를선언한예이다. 2 Tibero tbesql/cobol 안내서
[ 예 1.2] tbesql/cobol에서의프로그램변수의선언 01 OPERATION PIC X(20) VARYING OCCURS 5 TIMES. 01 TELLER. 03 EMPNO PIC S9(7). 03 ENAME PIC X(10). 03 SALARY PIC S9(5). 01 CNT PIC S9(9). 위의예에서 VARYING 키워드로선언한 VARCHAR 타입은 tbesql/cobol 프로그램내에서만사용할 수있는타입이며, 프리컴파일과정을거쳐 COBOL 프로그래밍언어의데이터타입으로변환된다. 입 / 출력변수 데이터베이스작업과관련된변수는다음과같이두가지로구분된다. 입력변수 tbesql/cobol 문장을통해컬럼의값을삽입, 갱신, 삭제할때데이터의값을설정하기위한변수이다. 입력변수는다음과같은특징이있다. 입력변수를사용할때는반드시변수앞에콜론 (:) 을붙여야한다. 입력변수는 SELECT, INSERT, UPDATE, DELETE 문장과 WHERE 절과 SET 절등의컬럼값의위 치에사용될수있다. 입력변수는테이블이름이나컬럼이름의위치에는사용될수없다. 출력변수 tbesql/cobol 문장의질의수행결과로반환된값을저장하기위한변수이다. 출력변수는다음과같은특징이있다. 입력변수와마찬가지로변수앞에반드시콜론 (:) 을붙여야한다. 출력변수는 SELECT 문장의 INTO 절에사용될수있다. INTO 절에는출력변수와함께 INDICATOR 키워드와지시자변수가올수있다. 다음은 WHERE 절에사용된입력변수 EMPNO 와 INTO 절에사용된출력변수 ENAME, SALARY, ADDR 를사용한예이다. 제 1 장 tbesql/cobol 소개 3
[ 예 1.3] 입 / 출력변수의사용 EXEC SQL SELECT ENAME, SALARY, ADDR INTO :ENAME, : SALARY, :ADDR FROM EMP WHERE EMPNO = :EMPNO 위의문장을실행하기전에 EMPNO 값을설정하는코드가와야하며, 또한문장이실행된후에는반환된 ENAME, SALARY, ADDR 컬럼값에대한적절한작업이진행되어야한다. 1.2.3. 구조체및배열변수 구조체와배열변수는동시에여러개의입 / 출력변수를처리하는자료구조이다. 구조체 tbesql/cobol 프로그램에서는보통동시에여러개의입력변수나출력변수가사용된다. [ 예 1.3] 의경우에도 SELECT 문장의 INTO 절에서세개의출력변수 (ENAME, SALARY, ADDR) 가사용되었다. 또한 INSERT 문장을사용할경우에는여러개의입력변수가사용될수있다. 이렇게여러개의입력변수나출력변수가사용될경우, tbesql/cobol 프로그램에서도 COBOL 프로그래밍언어에서처럼여러개의변수를묶어하나의구조체로사용할수있다. 참고 입 / 출력구조체변수에대한자세한내용은 2.2.6. 구조체 를참고한다. 배열변수 SELECT 문장을실행한결과의로우개수는대개의경우하나이상이며, INSERT 문장을실행할때에도보통하나이상의로우를삽입하게된다. 이때, 각각의로우에대해개별적으로 SQL 문장을여러번실행하지않고, 출력변수나입력변수를배열로선언하여 SQL 문장을한번만실행할수도있다. 출력변수나입력변수를배열로선언한경우각각을출력배열변수, 입력배열변수라고부른다. 또한이두가지변수를한꺼번에지칭할때는입 / 출력배열변수라고한다. 출력배열변수를이용하여 SELECT 문장을실행하는경우, 각결과로우는결과로우의개수와동일한크기를갖는출력배열변수에저장된다. tbesql/cobol 프로그램에서는하나이상의결과로우가반환되는 SELECT 문장에출력배열변수나커서를사용하지않으면에러를반환한다. 구조체도배열변수로선언하여사용할수있으며, 이를구조체배열변수라고부른다. 4 Tibero tbesql/cobol 안내서
참고 입 / 출력배열변수와구조체배열변수에대한자세한내용은 제 4 장배열변수 를참고한다. 1.2.4. 커서 커서는 SELECT 문장을실행한결과로반환된다수의로우각각에차례대로액세스하는데이터구조이다. SELECT 문장을실행한결과로반환되는로우의개수는기본키에대한질의가아니라면대부분하나이상이다. 또한, 반환되는로우의개수를미리알수없는경우가많기때문에, SELECT 문장의 INTO 절에변수를하나만명시해서는모든로우의데이터를저장할수없다. 이러한경우에프로그램을보다간편하고편리하게작성하기위해앞절에서한배열변수를사용할수도있지만커서를사용할수도있다. 커서를사용하는방법및순서는다음과같다. 1. DECLARE CURSOR 를이용하여커서를선언한다. 2. OPEN 을실행하여커서를연다. 커서를열면, 연관된 SQL 문장이실행되고질의의결과가반환된다. 3. FETCH 를실행한다. FETCH 를실행할때마다하나또는그이상의결과로우를얻을수있다. 커서는항상현재처리중인로우를가리킨다. 4. 모든결과로우에대한 FETCH 를실행한후에는 CLOSE 를실행하여커서를닫는다. 참고 자세한내용은 3.4. 커서 를참고한다. 1.2.5. 프리컴파일러 tbesql/cobol 프로그램내에는 COBOL 프로그래밍언어와 tbesql/cobol 문장이함께포함되어있다. tbesql/cobol 문장은 COBOL 프로그래밍언어의문법을따르지않기때문에, tbesql/cobol 프로그램을컴파일하기전에적절한처리를해주어야한다. 이러한컴파일이전의처리과정을프리컴파일 (Precompile) 이라고하며, 그때사용하는유틸리티를프리컴파일러 (Precompiler) 라고부른다. 프리컴파일러는 tbesql/cobol 프로그램에포함된 tbesql/cobol 문장을 tbesql/cobol 라이브러리함수로호출할수있는 COBOL 프로그래밍언어의소스코드로변환해준다. 제 1 장 tbesql/cobol 소개 5
이러한과정을위해서 tbesql/cobol 에서는다음과같은함수를정의하고있다. esql_do( ) 이함수의파라미터로는 SQL 문장과입 / 출력변수의정보가포함된다. 다음은 tbesql/cobol 프로그램의컴파일과정을나타내는그림이다. [ 그림 1.1] tbesql/cobol 프로그램의컴파일과정 tbesql/cobol 프로그램의컴파일과정은크게두가지과정으로나눌수있다. 프리컴파일 (Precompile) tbesql/cobol 프로그램을작성하여프리컴파일과정을거치고나면 COBOL 프로그래밍언어로만구성된소스코드가생성된다. 생성된소스코드는.cob 확장자를가진파일의형태로저장된다. 컴파일 (Compile) 프리컴파일과정을거친프로그램은다시컴파일과정을거치게되고최종적으로실행파일이생성된 다. 6 Tibero tbesql/cobol 안내서
제 2 장데이터타입 본장에서는 tbesql/cobol 프로그램에서사용하는데이터타입을알아보고데이터타입간의대응을한다. 데이터타입은 tbesql/cobol 문장에값을입력하고, 질의결과를얻기위해사용한다. tbesql/cobol은다음과같이두가지타입을지원한다. Tibero의데이터타입데이터베이스에저장된데이터에접근할때사용한다. tbesql/cobol 의데이터타입 애플리케이션프로그램에서데이터를조작할때사용한다. 2.1. Tibero 의데이터타입 본절에서는 Tibero에서디폴트로제공하는데이터타입을간략히한다. 이러한데이터타입은데이터베이스의스키마객체를생성하는데사용하는것으로 tbesql/cobol 프로그램내에서도모든데이터타입에대응되는변수를사용할수있다. 다음은 Tibero 의데이터타입이다. 구분문자형숫자형날짜형대용량객체형내재형 데이터타입 CHAR, VARCHAR, RAW NUMBER, INTEGER, FLOAT DATE, TIME, TIMESTAMP BLOB, CLOB ROWID 문자열을표현하는데이터타입이다. 정수나실수의숫자를저장하는데이터타입이다. 시간이나날짜를저장하는데이터타입이다. LOB 타입을의미한다. 다른데이터타입이지원하는최대길이 (8KB 이하 ) 보다훨씬큰길이를가질수있는객체이다. 4GB까지가능하다. 사용자가명시적으로선언하지않아도 Tibero가자동으로삽입되는로우마다포함하는컬럼의타입이다. 참고 자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 제 2 장데이터타입 7
다음은각데이터타입에대한세부이다. 데이터타입 CHAR 일반문자열을저장하는데이터타입이다. ( 예 : CHAR(10)) VARCHAR 일반문자열을저장하는데이터타입이다. ( 예 : VARCHAR(10)) RAW 임의의바이너리데이터를저장하는데이터타입이다. ( 예 : RAW(10)) NUMBER 정수또는실수를저장하는타입이다. NUMBER 타입을선언할때정밀도와스케일을함께선언할수있다. - 정밀도 : 데이터값의전체자릿수 - 스케일 : 소수점이하자릿수 INTEGER FLOAT DATE TIME TIMESTAMP 기본적으로는 NUMBER 타입이다. 단, NUMBER 타입과는다르게정밀도와스케일을선언할때범위에한계를둔다. NUMBER 타입의값은 Tibero에서가변길이로저장되며, 실제값과정밀도, 스케일에따라그길이가달라진다. 특정날짜와시간을나타내는데이터타입이다. - DATE: 특정날짜 - TIME: 특정시간 - TIMESTAMP: 특정날짜와시간 BLOB 임의의바이너리데이터를데이터베이스에저장하는데이터타입이다. 한테이블의여러컬럼에선언할수있다. CLOB 읽을수있는문자열을데이터베이스에저장하는데이터타입이다. 한테이블의여러컬럼에선언할수있다. ROWID 데이터베이스내의각로우를식별하기위해, Tibero 시스템이각로우마다자동 으로부여하는데이터타입이다. 각로우가저장된물리적인위치를포함한다. 8 Tibero tbesql/cobol 안내서
2.2. tbesql/cobol 의데이터타입 본절에서는 tbesql/cobol 의데이터타입을한다. 2.2.1. 데이터타입의대응 Tibero에서제공하는데이터타입을 tbesql/cobol 프로그램에서그대로사용할수는없다. tbesql/cobol에는 Tibero의각데이터타입에대응되는 tbesql/cobol의데이터타입이정의되어있다. tbesql/cobol의데이터타입은대체로 COBOL 프로그래밍언어의데이터타입과동일하다. 또한각 Tibero의데이터타입에대응되는 tbesql/cobol의데이터타입은하나이상일수도있다. 다음은 Tibero의데이터타입에대응되는 tbesql/cobol의데이터타입이다. Tibero의데이터타입 CHAR, VARCHAR RAW NUMBER tbesql/cobol의데이터타입 PIC X(n), PIC X(n) VARYING PIC X(n) VARYING PIC S9(n) PIC S9(n)V9(n) 길이 n의문자열길이 n의바이너리데이터정수데이터실수데이터 ( 데이터가삽입될때이미정해진컬럼의정밀도및스케일을초과할수있다.) DATE, TIME, TIMESTAMP ROWID PIC X(n), PIC X(n) VARYING PIC X(n), PIC X(n) VARYING 길이 n 의문자열로변환 길이 n 의문자열로변환 tbesql/cobol의데이터타입중 VARYING 키워드를사용해서선언하는VARCHAR 타입은 Tibero의데이터타입중에 VARCHAR 타입을비롯한여러가지타입에대응하기위해새롭게정의된타입이다. tbesql/cobol 프로그램에서는각데이터타입간의변환을지원한다. 예를들어, VARCHAR 타입의문자열이정수를표현하고있는내용이라면, 그값을 PIC S9(n) 타입의변수에저장할수있다. 또한실제로 DATE, TIME, TIMESTAMP 타입과 ROWID 타입에바로대응되는타입은없으며, 항상변환과정을거쳐서저장해야한다. 참고 VARCHAR 타입의자세한내용은 2.2.5. VARCHAR 을참고한다. 제 2 장데이터타입 9
2.2.2. 데이터타입의변환 tbesql/cobol 프로그램에서는 Tibero 데이터타입각각에대응되는타입이외에다른데이터타입을사용할수있다. 예를들면데이터베이스의 NUMBER 타입의컬럼값을저장하기위해 tbesql/cobol 프로그램에서는출력변수로 VARCHAR 타입을사용할수있다. 이와반대로, NUMBER 타입프로그램변수의값을 VAR CHAR 타입의컬럼에저장할수도있다. tbesql/cobol 프로그램을프리컴파일하면입 / 출력변수의데이터타입이프로그램내에함께포함된다. 이렇게포함된데이터타입을기준으로데이터의값이입 / 출력될때, 컬럼타입과비교하여필요한경우에는데이터타입의변환을수행한다. 만약데이터타입의변환이불가능한경우에는에러를반환한다. 변환가능한데이터타입 다음은 Tibero 데이터타입으로부터변환가능한 tbesql/cobol 데이터타입이다. 2.2.1. 데이터타입의 대응 의일부내용이포함되어있다. Tibero의데이터타입 NUMBER CHAR, VARCHAR DATE, TIME, TIMESTAMP ROWID tbesql/cobol의데이터타입 PIC S9(n) PIC S9(n)V9(n) PIC X(n), PIC X(n) VARYING PIC X(n), PIC X(n) VARYING PIC X(n), PIC X(n) VARYING 정수데이터실수데이터문자열데이터 ( 실수를포함한다.) 날짜형데이터 ROWID 데이터 tbesql/cobol 데이터타입으로부터 Tibero 데이터타입으로변환할때에도위의변환관계가적용된다. 예를들어, tbesql/cobol 프로그램의 PIC S9(n) 타입의변수값을 VARCHAR 타입컬럼에저장할수있으며, VARYING 키워드를통해선언하는VARCHAR 타입값을이용하여 ROWID에대한질의를수행할수있다. 다음은데이터타입의변환을수행하는예이다. [ 예 2.1] 데이터타입의변환 01 SAL-STR PIC X(8) VARYING. 01 EMP-DATE PIC X(20) VARYING.... EXEC SQL SELECT SALARY, EMP_DATE INTO :SAL-STR, :EMP-DATE FROM EMP WHERE EMPNO = 20 10 Tibero tbesql/cobol 안내서
DISPLAY 'SALARY = ' SAL-STR-ARR IN SAL-STR. DISPLAY 'EMP-DATE = ' EMP-DATE-ARR IN EMP-DATE. 위의 [ 예 2.1] 을실행하면다음과같은내용이출력된다. SALARY = 35000 EMP-DATE = 2001-12-01 데이터타입을변환할때에는데이터값의범위와내용에유의해야한다. 데이터값의범위는그값을저장할장소가충분히포함할수있는한도내이어야한다. 예를들면데이터값의범위는 tbesql/cobol 프로그램의 PIC S9(3) 타입의변수에그범위를넘어서는값인문자열 "327680" 을변환하거나, 마찬가지로 VARCHAR(3) 의타입을갖는컬럼에그범위를넘어서는값인 65535를변환할수없다. 데이터의내용은데이터베이스컬럼에저장된 "ABCDE" 문자열을프로그램 PIC S9(3) 타입의변수에변환할수없으며, 프로그램변수에저장된 " 가나다 " 문자열을 DATE 타입의컬럼에변환할수없다. 내장함수를이용한데이터타입의변환 Tibero 내장함수를이용하여데이터타입의변환을실행할수도있다. 그러한함수로는 TO_CHAR,TO_DATE,TO_NUMBER 등이있다. 다음은 TO_CHAR 함수를이용하여실수데이터를문자데이터로변환하여출력하는예이다. [ 예 2.2] TO_CHAR 함수를이용한데이터타입의변환 01 SAL-STR PIC X(8) VARYING.... EXEC SQL SELECT TO_CHAR(SALARY, '$99,999.99')... 1... INTO :SAL-STR... 2... FROM EMP WHERE EMPNO = 20 DISPLAY 'SALARY = ' SAL-STR-ARR IN SAL-STR... 3... 1 실수데이터를담고있는변수 SALARY를 TO_CHAR 함수를통해형식문자열 ('$99,999.99') 을지정하여문자데이터로변환한다. 2 VARCHAR 타입의변수 SAL-STR에저장한다. 3 DISPLAY 문을통해 SAL-STR 변수를출력한다. 위의 [ 예 2.2] 을실행하면다음과같은내용이출력된다. SALARY = $35,000 제 2 장데이터타입 11
참고 데이터타입을변환하는내장함수에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 2.2.3. 데이터변수의사용 COBOL 프로그래밍언어의변수와는달리 tbesql/cobol 프로그램에서데이터베이스작업과관련된변수는모두 DECLARE 영역내에선언되어야한다. 다음은 DECLARE 영역내에선언된변수의예이다. EXEC SQL BEGIN DECLARE SECTION 01 OPERATION PIC X(20) VARYING OCCURS 5 TIMES. 01 TELLER. 03 EMPNO PIC S9(7). 03 ENAME PIC X(10). 03 SALARY PIC S9(5). 01 CNT PIC S9(9). EXEC SQL END DECLARE SECTION 위의예에서알수있듯이 DECLARE 영역은 EXEC SQL BEGIN DECLARE SECTION 로시작하고 EXEC SQL END DECLARE SECTION 로끝난다. VARCHAR 타입은일반적인 CHAR 배열타입과유사하게선언한다. CHAR 타입과는달리배열이아닌형태로는선언이불가능하다. 프리컴파일과정을거치면 VARCHAR 타입은 tbesql/cobol에서정의한구조체타입으로변환된다. DECLARE 영역내에선언된변수는 COBOL 프로그래밍언어의변수와동일한방법으로프로그램내에서사용된다. 하지만, tbesql/cobol 문장내에서의변수는 tbesql/cobol 문장과의구별을위하여반드시콜론 (:) 뒤에와야한다. 이렇게콜론 (:) 뒤에사용된 tbesql/cobol 문장내의변수를입 / 출력변수라고부른다. 다음은 tbesql/cobol 문장내에서사용된입력변수와출력변수에대한예이다. MOVE 20 TO EMPNO. EXEC SQL SELECT ENAME, SALARY, ADDR INTO :ENAME, :SALARY, :ADDR FROM EMP WHERE EMPNO = :EMPNO DISPLAY 'SALARY = ' SALARY. 위의예에서는 SELECT 문장을실행하기위해먼저입력변수 EMPNO 의값을읽어와 tbesql/cobol 문장을완성한다. 그리고나서, SELECT 문장을실행하고실행결과로반환된로우의각컬럼값이출력 12 Tibero tbesql/cobol 안내서
변수 ENAME, SALARY, ADDR에할당된다. 출력변수 ENAME, SALARY, ADDR은 COBOL 프로그래밍언어의변수와마찬가지로사용될수있다. 만약 SELECT 문장의실행결과로반환된로우가없거나둘이상의로우가반환되면에러가발생한다. 이러한경우에러를처리하는루틴이미리정의되어있으면그루틴을실행하게되고, 그렇지않으면프로그램을종료한다. 2.2.4. ROWID ROWID 타입은로우의물리적인위치정보를포함하는데이터타입이다. tbesql/cobol에서는 ROWID 를위한별도의데이터타입을제공하지않는다. PIC X(n) 타입또는 VARCHAR(VARYING) 타입을이용해데이터타입을변환하여사용해야한다. ROWID 타입의값은다음의그림에서처럼 4부분으로구성된다. [ 그림 2.1] ROWID의구성 문자열변수에저장되는 ROWID 값은전체 18byte 를가지므로, 문자열변수의길이는 NULL 값을포함하 여최소한 19 byte 가되어야한다. Tibero 의데이터베이스에서는다른형태로저장된다. 참고 ROWID 타입에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 다음은 ROWID 타입을사용하는예이다. [ 예 2.3] ROWID 타입의사용 EXEC SQL BEGIN DECLARE SECTION 01 ROWID PIC X(20). EXEC SQL END DECLARE SECTION... EXEC SQL SELECT ROWID,... INTO :ROWID,... FROM EMP WHERE EMPNO = :EMPNO DISPLAY 'rowid = ' ROWID. 제 2 장데이터타입 13
ROWID 의값은이처럼출력변수로사용될뿐만아니라 SELECT 문장의 WHERE 절이나 INSERT 문장 에서입력변수로사용될수도있다. 위의 [ 예 2.3] 을실행하면다음과같은내용이출력된다. rowid = AAAABkAAUAAAAD6AAA 2.2.5. VARCHAR VARCHAR타입은 Tibero의데이터타입의 VARCHAR 타입을 tbesql/cobol 프로그램에서사용하기위해새롭게정의한데이터타입이다. VARCHAR 타입은 RAW, DATE, ROWID 타입에도대응하여사용할수있다. VARCHAR 타입의변수선언 VARCHAR 타입의변수선언은 COBOL 프로그래밍언어에서 PIC X(n) 타입의배열변수를선언하는것과동일한데, 마지막에 VARYING 키워드를삽입한다. PIC X(n) 과마찬가지로문자열의최대크기를반드시지정해주어야한다. 다음은 VARCHAR 타입의변수를선언하는예이다. [ 예 2.4] VARCHAR 타입의변수선언 01 USERNAME PIC X(16) VARYING. 위의 [ 예 2.4] 에서선언된 VARCHAR 타입의변수는프리컴파일러를통하여다음과같은구조체타입의변수로변환된다. [ 예 2.5] VARCHAR 타입이변환된구조체 01 USERNAME. 03 USERNAME-LEN PIC S9(4) COMP-5. 03 USERNAME-ARR PIC X(9). VARCHAR 타입의변수의참조와일관성 VARCHAR 타입의변수를선언할때를제외하고, VARCHAR 타입의변수를사용하기위해서는프리컴파일러가변환한구조체의문법을따라야한다. 예를들어, 위의 [ 예 2.4] 에서선언한 USERNAME을출력하고자한다면, 프리컴파일러에의해변환된 [ 예 2.5] 의구조체를출력하는문법에맞춰다음과같이코드를작성하여야한다. 14 Tibero tbesql/cobol 안내서
DISPLAY USERNAME-ARR. 또는 DISPLAY USERNAME-ARR IN USERNAME. VARCHAR 구조체내의변수 LEN과 ARR은입력변수일때이든출력변수일때이든상관없이항상일관성을유지하여야한다. 즉, 다음과같은조건을만족해야한다. [ 예 2.6] VARCHAR 변수의일관성 LENGTH(USERNAME-ARR) EQUALS USERNAME-LEN VARCHAR 타입의변수가입력변수로사용되었는지, 출력변수로사용되었는지에따라서위의조건을 만족시키기위한방법은다르다. VARCHAR 타입의변수 입력변수 입력변수로사용된경우, tbesql/cobol 프로그램내에조건을유지시키 는코드를작성해야한다. 조건을만족하지않는다면 tbesql/cobol 라이브러리에서는 LEN 변수를 우선적으로참조한다. 출력변수 출력변수로사용된경우, tbesql/cobol 라이브러리내에서자동으로조 건을유지시킨다. NULL 값의처리 VARCHAR 타입의변수의값이 NULL 인경우에는프리컴파일러를통해변환된구조체내의변수 ARR 과 LEN 의값은다음과같다. ARR EQUAL Z"" LEN SQUAL 0 VARCHAR 타입의변수의값이 NULL 일때, VARCHAR 타입의변수가입력변수로사용되었는지, 출력 변수로사용되었는지에따라, 변환된구조체내의멤버변수 ARR 과 LEN 의값은다르다. VARCHAR 타입의변수 입력변수 입력변수인경우에는 LEN 변수에 0 을할당하는코드를작성해야한다. 만약 ARR 문자열의길이가 0 이아니더라도 LEN 변수를먼저참조하므로 NULL 로인식한다. 출력변수 출력변수인경우에는 ARR 과 LEN 의값을 tbesql/cobol 라이브러리에서 자동으로설정해준다. 제 2 장데이터타입 15
다음은 VARCHAR 타입의출력변수 ADDR 의값으로 NULL 이반환되었는지검토하여출력하는예이다. 01 ADDR PIC X(32) VARYING.... EXEC SQL SELECT ADDR INTO:ADDR FROM EMP WHERE EMPNO = 20 IF (ADDR-LEN EQUALS 0) DISPLAY 'ADDR = NULL' ELSE DISPLAY 'ADDR = ' ADDR-ARR END-IF. 2.2.6. 구조체 tbesql/cobol 프로그램에서도 COBOL 프로그래밍언어의구조체를사용할수있다. tbesql/cobol 프로그램의 SELECT 문장에서는질의결과로반환되는컬럼의개수만큼 INTO 절에출력변수를명시해야한다. 이런경우에 INTO 절에명시될다수의출력변수를한데묶어구조체를만들고, INTO 절에이구조체변수하나만명시해프로그램을간소화할수있다. 구조체변수를사용할때에유의할점은 SELECT 문장의결과로우내의컬럼의순서와구조체변수내의변수의순서가같아야한다는점이다. 다음은세개의출력변수를포함하는구조체를사용한예이다. EXEC SQL BEGIN DECLARE SECTION 01 EMP. 03 ENAME PIC X(20) VARYING. 03 SALARY PIC S9(7) COMP-5. 03 ADDR PIC X(32) VARYING.... EXEC SQL END DECLARE SECTION... EXEC SQL SELECT ENAME, SALARY, ADDR INTO :EMP FROM EMP WHERE EMPNO = :EMPNO 구조체변수는 INSERT 문장등에서입력변수로사용될수도있다. 이때에도출력변수와동일하게하나 의구조체변수만사용할수있으며, 구조체내부에삽입하려는컬럼과같은순서로변수가정의되어있어 야한다. 16 Tibero tbesql/cobol 안내서
다음은세개의컬럼에값을삽입하는예이다. MOVE Z"Smith" TO ENAME-ARR IN ENAME IN EMP. MOVE 35000 TO SALARY IN EMP. MOVE Z"Los Angeles" TO ADDR-ARR IN ADDR IN EMP. EXEC SQL INSERT INTO EMP(ENAME, SALARY, ADDR) VALUES (:EMP) 2.2.7. 지시자 일반프로그램과달리 tbesql/cobol 프로그램에서만사용되는변수로지시자 (INDICATOR) 변수가있다. tbesql/cobol 문장을통해데이터베이스와 tbesql/cobol 프로그램간에데이터를주고받을때, 지시자변수는전달된데이터에대한정보를저장하고있다. 지시자변수의선언 지시자변수는 PIC S9(4) COMP-5 타입을가지며, 반드시 DECLARE 영역안에선언되어야한다. SELECT 문장에사용된지시자변수는 INTO 절에서 INDICATOR 키워드와콜론 (:) 다음에오거나, INDI CATOR 없이데이터변수바로뒤에콜론 (:) 과함께올수도있다. 다음은 SELECT 문장에서출력변수와지시자변수가사용된예이다. [ 예 2.7] 출력변수와지시자변수 EXEC SQL BEGIN DECLARE SECTION 01 IND-ENAME PIC S9(4) COMP-5. 01 IND-ADDR PIC S9(4) COMP-5.... EXEC SQL END DECLARE SECTION... EXEC SQL SELECT ENAME, ADDR INTO :ENAME INDICATOR :IND-ENAME, :ADDR INDICATOR :IND-ADDR FROM EMP WHERE EMPNO = :EMPNO 위의예에서는출력변수 ENAME 에대응되는지시자변수로 IND-ENAEM 이사용되었고, 출력변수 ADDR 에대응되는지시자변수로는 IND-ADDR 가사용되었다. INDICATOR 키워드를명시하지않고다음과같이작성해도위의 [ 예 2.7] 문장과동일한의미를갖는다. 제 2 장데이터타입 17
EXEC SQL SELECT ENAME, ADDR INTO :ENAME :IND-ENAME,:ADDR :IND-ADDR FROM EMP WHERE EMPNO = :EMPNO 다음은출력변수와함께사용된지시자변수값의의미를정리한표이다. tbesql/cobol 프로그램에서 는필요한경우지시자변수의값을검토하여그값에따른처리를해주어야한다. 지시자변수의값 0-1 > 0 데이터값이성공적으로저장되었다. 데이터값이 NULL이다. 문자열데이터변수에저장된값이잘린 (truncated) 값이다. 지시자변수에주어진값은실제데이터베이스에저장된문자열의길이이다. 다음은 INSERT 문장에서입력변수와함께지시자변수를사용한예이다. [ 예 2.8] 입력변수와지시자변수 01 ENAME PIC X(24) VARYING. 01 ADDR PIC X(36) VARYING. 01 IND-ADDR PIC S9(4) COMP-5. 01 EMPNO PIC S9(9).... MOVE Z"Peter" TO ENAME-ARR. MOVE Z"New York" TO ADDR-ARR. MOVE -1 TO IND-ADDR. MOVE 25 TO EMPNO. EXEC SQL INSERT INTO EMP (ENAME, ADDR, EMPNO) VALUES (:ENAME, :ADDR INDICATOR :IND-ADDR, :EMPNO) 위의예에서는입력변수로 ENAME, ADDR, EMPNO 가사용되었으며, 입력변수 ADDR 에대응되는지시 자변수로 IND-ADDR 이사용되었다. INDICATOR 키워드를명시하지않고다음과같이작성해도위의 [ 예 2.8] 문장과동일한의미를갖는다. EXEC SQL INSERT INTO EMP (ENAME, ADDR, EMPNO) VALUES (:ENAME,:ADDR:IND-ADDR, :EMPNO) 18 Tibero tbesql/cobol 안내서
위의예에서는 INDICATOR 키워드를생략하고입력변수 ADDR 뒤에지시자변수 IND-ADDR 을바로붙 여서명시하였다. 지시자변수값이 -1 인경우에는입력변수의값이 NULL 이라는의미이다. 이때, 입력변수에저장된실제 값은무시된다. 따라서, 지시자변수의값이 -1 인경우앞의 INSERT 문장은다음과같이고쳐써도된다. EXEC SQL INSERT INTO EMP (ENAME, ADDR, EMPNO) VALUES (:ENAME, NULL, :EMPNO) 지시자변수값이 -1인경우는입력변수 ADDR의값이 NULL이라는것이므로입력변수와지시자변수를명시할필요없이 NULL만명시해도된다. 다음은입력변수와함께사용된지시자변수값의의미를정리한표이다. 지시자변수의값 -1 >= 0 데이터값이 NULL 이다. 입력변수에저장된값을그대로사용한다. 지시자변수를사용하지않고 tbesql/cobol 프로그램을작성할수도있지만, SQL 문장의질의결과로 반환되는값에대해충분히알고있지않다면지시자변수를사용하여검토하는코드를삽입하는것이좋 다. 구조체타입의지시자 SELECT 문의 INTO 절에구조체변수와지시자변수를함께사용하는경우, 지시자변수역시마찬가지로별도의구조체변수로구성해야한다. 이러한지시자변수를구조체타입의지시자 (STRUCTURAL IN DICATOR) 라고부른다. 구조체타입의지시자도출력구조체변수를구성하는것과마찬가지로질의결과컬럼과같은순서로지시자변수가와야한다. 또한모든지시자변수는 PIC S9(4) COMP-5 타입을갖는다. 다음은구조체타입의지시자변수를사용하는예이다. EXEC SQL BEGIN DECLARE SECTION 01 EMP... 1... 03 ENAME PIC X(24) VARYING. 03 SALARY PIC S9(5). 03 ADDR PIC X(32) VARYING. 01 EMP-IND... 2... 03 ENAME-IND PIC S9(4) COMP-5. 03 SAL-IND PIC S9(4) COMP-5. 03 ADDR-IND PIC S9(4) COMP-5.... 제 2 장데이터타입 19
EXEC SQL END DECLARE SECTION... EXEC SQL SELECT ENAME, SALARY, ADDR INTO :EMP INDICATOR :EMP-IND FROM EMP WHERE EMPNO = :EMPNO 1 컬럼 ENAME, SALARY, ADDR의내용을저장하기위해서구조체타입의변수로 EMP를선언한다. 2 이구조체변수를 SELECT 문장의출력변수로사용하면서, 이에대응되는지시자변수 EMP_IND 역시구조체변수로선언한다. 구조체변수 EMP_IND를정의할때, 구조체내의멤버변수를 EMP에대응되게정의하고, EMP_IND의모든멤버변수를 PIC S9(4) COMP-5 타입으로정의한다. 20 Tibero tbesql/cobol 안내서
제 3 장기본프로그래밍 본장에서는 tbesql/cobol 프로그램의문법과실행과정, 런타임에러 (runtime error) 처리, 그리고 tbesql/cobol 문장의실행, 커서를한다. 3.1. 개요 본절에서는 tbesql/cobol 프로그램의문법과런타임에러처리에대해서한다. 3.1.1. tbesql/cobol 프로그램의문법 tbesql/cobol 프로그램의문법은다음과같다. SQL 문장의시작과끝 tbesql/cobol 프로그램에포함되는 SQL 문장은항상 EXEC SQL로시작되며 로끝난다. 하나의 SQL 문장은여러줄에걸쳐있을수있다. DECLARE 영역 DECLARE 영역은 BEGIN DECLARE SECTION 으로시작되며, END DECLARE SECTION 으로끝 난다. DECLARE 영역에는변수선언이외에다른코드가삽입되어서는안된다. SQL 문장과함께사용되는입 / 출력변수는항상 DECLARE 영역에선언해야한다. 입 / 출력변수가구조체나배열의형태로선언된경우에도 DECLARE 영역에선언해야한다. 단, 프리컴파일러옵션에따라그렇지않은경우도있다. 프리컴파일러옵션에대해서는 제6 장 tbesql/cobol 프리컴파일러옵션 을참고한다. 입 / 출력변수가아닌일반적인프로그램변수의경우에는 DECLARE 영역밖에선언되어도무방하다. 다음은 DECLARE 영역의예이다. EXEC SQL BEGIN DECLARE SECTION 01 OPERATION PIC X(20) VARYING OCCURS 5 TIMES. 제 3 장기본프로그래밍 21
01 TELLER. 03 EMPNO PIC S9(7). 03 ENAME PIC X(10). 03 SALARY PIC S9(5). 01 CNT PIC S9(9). EXEC SQL END DECLARE SECTION 문자열 COBOL 프로그래밍코드에포함된문자열은큰따옴표 (" ") 를사용한다. tbesql/cobol 문장에포함되는문자열은작은따옴표 (' ') 를사용한다. 주석 (Comment) 주석은 COBOL 프로그래밍언어에서사용하는방법이외에두개의마이너스부호 (--) 를이용하는방 법이있다. 두개의마이너스부호 (--) 를사용하는주석은주석의부호 (--) 가시작되는곳에서부터그라인의끝까 지주석으로처리한다. 또한, EXEC SQL 문장에만사용될수있으며, COBOL 프로그래밍코드부분에는사용되지못한다. 다음은주석을사용하는예이다. EXEC SQL SELECT ENAME, SALARY, ADDR INTO :EMP -- 구조체변수를사용한다. FROM EMP WHERE EMPNO = :EMPNO 22 Tibero tbesql/cobol 안내서
3.1.2. 프로그램의실행과정 다음그림은 tbesql/cobol 프로그램소스코드를실행파일로생성하기위해거치는전과정이다. 프리컴파일과정을제외하면 COBOL 프로그램의경우와별로다르지않다. [ 그림 3.1] tbesql/cobol 프로그램의실행과정 tbesql/cobol 프로그램을작성할때는필요한데이터타입이나함수프로토타입등을이용하기위해 서반드시 SQLCA 파일을포함해야한다. 즉, 아래의내용이항상 tbesql/cobol 프로그램소스코드의 맨위에명시되어있어한다. EXEC SQL INCLUDE SQLCA 만약존재하지않으면프리컴파일러실행후에생성되는 COBOL 코드에자동으로추가된다. 위의 [ 그림 3.1] 의과정을순서대로하면다음과같다. 1. tbesql/cobol program tbesql/cobol 프로그램을작성한뒤소스코드를저장하면.tbco 확장자를갖는파일이생성된다. 2. Precompile 작성된프로그램을실행하려면, 먼저프리컴파일과정을거쳐야한다. tbesql/cobol 의프리컴파일 러를실행하는명령어는 tbpcb 이다. 제 3 장기본프로그래밍 23
다음은 emp.tbco 프로그램파일에대해프리컴파일을실행하는예이다. [ 예 3.1] emp.tbco 프로그램의프리컴파일 $ tbpcb emp.tbco 프리컴파일러를실행하는명령어는옵션을포함할수있다. 다음은프리컴파일러옵션을사용하여 COPY 또는 SQLCA ESQL INCLUDE 파일의경로를지정하는예이다. [ 예 3.2] 프리컴파일러옵션을사용한 COPY 또는 SQLCA ESQL INCLUDE 파일의경로지정 $ tbpcb INCLUDE=../include emp.tbco 프리컴파일러옵션에대한자세한내용은 제 6 장 tbesql/cobol 프리컴파일러옵션 을참고한다. 3. General program 프리컴파일의결과로는 COBOL 프로그램소스코드가생성되며, 이때파일의이름은원본파일의이름과동일하고확장자만.cob로변경된다. 예를들어 emp.tbco 파일을프리컴파일하면 emp.cob라는이름을가진파일이생성된다. 4. Compile, Link 프리컴파일이완료된파일은그다음으로컴파일과정과링크과정을거쳐야한다. [ 그림 3.1] 에서는컴 파일과링크과정이따로표현되었지만, 실제로는대개의경우에두과정이함께수행된다. 다음은 [ 예 3.1] 의실행결과로생성된 emp.cob 파일을컴파일하고링크하는예이다. 본예제는 64-bit 머신의 MF-COBOL 컴파일러를사용하는경우이다. $ cob64 -xo emp emp.cob -L$TB_HOME/client/lib -ltbertl -ltbcli -lpthread -lm tbesql/cobol에서는 tbcli 함수도함께사용하기때문에 tbertl 라이브러리이외에 tbcli 라이브러리를함께링크한다. 위의 [ 그림 3.1] 에서링크 (Link) 과정에서링커 (Linker) 의입력으로받아들이는 tbertl 라이브러리는 tbesql/cobol 의함수라이브러리이다. 이라이브러리에는 esql_do 함수등이정의되어있으며, tbesql/cobol 프로그램을안전하고효율적으로실행하기위한여러가지작업을수행한다. 5. Execution code 컴파일과정과링크과정을거치고나면 emp 라는이름의실행파일이생성된다. 24 Tibero tbesql/cobol 안내서
3.1.3. 런타임에러처리 tbesql/cobol 프로그램내의 SQL 문장을실행했을때, 에러또는경고등의여러가지예외상황이발생할수있다. 예를들면 SELECT 문장의실행결과로반환되는로우가존재하지않거나특정컬럼의일부내용이잘린경우를들수있다. tbesql/cobol 프로그램내에서는에러또는경고상황이발생한경우, 그에대한적절한처리를프로그램내에서수행할수있다. tbesql/cobol에서는이러한런타임에러처리를위해다음의 3가지인터페이스를지원한다. 인터페이스 상태변수 상태변수 (Status Variable) 는임의의 SQL 문장이실행된결과가저장되는변수이다. 프로그램내에서는 SQL 문장을실행한후에상태변수의값을검토하여, 에러또는 경고상황의발생을알수있고, 그에따른처리를수행할수있다. SQLCA SQLCA(SQL 통신영역 : SQL Communication Area) 는임의의 SQL 문장이실행된결 과가저장되는구조체변수이다. 이구조체는 SQLCA 라는이름으로 SQLCA ESQL INCLUDE 파일에정의되어있으며, 상태변수를포함하고있다. 상태변수와마찬가지로, SQL 문장을실행한후에 SQLCA 내의적절한멤버변수의 값을검토하여에러또는경고상황의발생을알수있고, 그에따른처리를수행할수 있다. WHENEVER WHENEVER 문장은에러또는경고상황이발생하면미리정해진특정동작을수행한다. 상태변수나 SQLCA 구조체를이용하면 SQL 문장을실행할때마다에러또는경고상황이발생하였는지검토해야한다. 하지만 WHENEVER 문장을사용하면 tbesql/cobol이자동으로예외상황을검토하고그에따른처리를수행한다. 3.2. 프로그램의구조 tbesql/cobol 프로그램의구조는다음과같다. 변수선언 초기화 데이터베이스작업 종료화 에러처리 제 3 장기본프로그래밍 25
3.2.1. 변수선언 변수선언부분에는 1.2. 구성요소 에서한 DECLARE 영역이포함된다. tbesql/cobol 문장에서데이터베이스작업에사용될모든변수를 DECLARE 영역에선언해야한다. 데이터베이스작업과관련이없는변수는 DECLARE 영역에포함하지않아도된다. 다음은변수선언의예이다. EXEC SQL BEGIN DECLARE SECTION 01 BRANCH pic x(9) varying. 01 POSTAL pic x(10) varying. 01 REGION pic x(10) varying. 01 OPERATION pic x(20) varying occurs 5 times. 01 TELLER. 03 IDE pic x(5). 03 BR pic x(5). 03 NAMEE pic x(12). 01 TELLER2 occurs 10 times. 03 IDE pic x(5). 03 BR pic x(5). 03 NAMEE pic x(12). 01 IDK pic x(5) occurs 10 times. 01 NAMEK pic x(12) occurs 10 times. 01 CDK pic x(5). EXEC SQL END DECLARE SECTION 3.2.2. 초기화 초기화부분에서는다음의두가지를수행한다. 런타임에러가발생했을때, 어떤작업을수행할것인지선언한다. 런타임에러가발생했을때, 수행하는작업에는에러처리함수를호출하는경우, 에러를무시하고프로그램을계속진행하는경우, 프로그램을종료하는경우, 특정위치로이동한후실행을계속하는경우등이있다. 대부분의경우에에러처리를위한함수를미리정의하고그정의된함수를호출한다. 다음은런타임에러가발생했을때,tbesql_error함수를호출하는예이다. EXEC SQL WHENEVER SQLERROR DO CALL "tbesql_error" USING BY REFERENCE SQLCODE IN SQLCA Tibero 의데이터베이스에접속한다. 데이터베이스에접속할때는반드시사용자이름과패스워드를함께명시해야한다. 26 Tibero tbesql/cobol 안내서
다음의소스코드는 USERNAME 과 PASSWORD, 이렇게두개의입력변수를이용해데이터베이스에 접속하는예이다. EXEC SQL CONNECT :USERNAME IDENTIFIED BY :PASSWORD 3.2.3. 데이터베이스작업 데이터베이스작업부분에서는 tbesql/cobol 문장을사용해데이터베이스질의및갱신을수행한다. 이부분은 tbesql/cobol 프로그램에서가장중요한부분중하나이다. 데이터베이스와관련된작업에는입력변수와출력변수를많이사용하게된다. 데이터베이스질의와관련된소스코드에는커서를선언하고, 이선언된커서를이용해로우를액세스하는코드가포함된다. 다음은데이터베이스작업부분의예이다. EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM BRANCH ORDER BY BRANCH_CD EXEC SQL OPEN C1 EXEC SQL FETCH C1 INTO :BRANCH, :POSTAL, :REGION 3.2.4. 종료화 종료화부분에서는모든데이터베이스작업을마치고커밋을수행하거나롤백을수행한다. 주의 종료화부분이 tbesql/cobol 프로그램에포함되지않으면, 자동으로커밋되지않으므로주의하 도록한다. 다음은데이터베이스에부분롤백을수행한뒤커밋을하는예이다. EXEC SQL ROLLBACK WORK TO SAVEPOINT SP1 EXEC SQL COMMIT WORK 제 3 장기본프로그래밍 27
3.2.5. 에러처리 에러처리부분에서는에러를처리하기위한코드가포함된다. 에러처리와관련된코드는다른코드와섞여동일한하나의함수안에포함될수도있으며, 별도의함수로정의할수도있다. 다음은에러처리의예이다. IF SQLCODE IN SQLCA IS LESS THAN 0 THEN DISPLAY "connection failed" END-IF 3.3. tbesql/cobol 문장의실행 본절에서는 tbesql/cobol 프로그램에서 SELECT, INSERT, UPDATE, DELETE 문장을실행하는방법에대해한다. 각문장에는입 / 출력변수가사용되는데, 입 / 출력변수는각문장내에포함된스키마객체와구별하기위하여반드시앞에콜론 (:) 이와야한다. 3.3.1. SELECT SELECT 문장은데이터베이스에질의를수행하고결과로우를반환하는문장이다. 결과로우의개수는 보통하나이상이지만하나도없을수도있다. INTO 절과출력변수 tbesql/cobol 프로그램내에서사용되는 SELECT 문장은일반 SELECT 문장과같은문법을가지며, 다만 SELECT 리스트다음에결과로우의각컬럼값을출력변수에저장하기위해 INTO 절이삽입된다. 다음은 SELECT 문장의 INTO 절에출력변수가사용된예이다. EXEC SQL SELECT A INT :COL-A FROM TAB1 다음은 SELECT문장의 INTO 절에포함되는출력변수에대한이다. 컬럼값과출력변수의대응 INTO절에포함되는출력변수는 SELECT 리스트내의컬럼과같은개수이어야하며, 지시자변수와함께사용될수있다. 질의결과로반환된로우의각컬럼값은컬럼값과동일한순서로대응되는각각의출력변수에저장된다. 출력변수에저장될때, tbesql/cobol 프로그램에서는필요한경우데이터타입의변환을수행한다. 28 Tibero tbesql/cobol 안내서
구조체변수 INTO 절에포함되는출력변수에는구조체변수를사용할수도있다. 이때구조체변수에포함된멤버변수의개수는 SELECT 리스트내의컬럼과개수가같아야한다. tbesql/cobol 프로그램에서는결과로우의각컬럼값을구조체변수내의각멤버변수에할당한다. 로우의개수에따른출력변수 SELECT 문장의결과로우의개수가반드시하나라는보장이있다면 INTO 절에단순출력변수를이용하여처리가가능하다. 하지만, 하나이상인경우에는커서를사용하거나 INTO 절에출력배열변수를사용하여야한다. 참고 커서에대한자세한내용은 3.4. 커서 와 3.5. 스크롤가능커서 를, 배열변수에대한자세한내용은 제 4 장배열변수 를참고한다. 다음은결과로우가하나인경우, 이를처리하는예이다. 01 ENAME PIC X(24) VARYING. 01 SALARY PIC S9(5). 01 ADDR PIC X(32) VARYING.... MOVE 20 TO EMPNO. EXEC SQL SELECT ENAME, SALARY * 1.05 INTO :ENAME, :SALARY FROM EMP WHERE EMPNO = :EMPNO DISPLAY 'ENAME = ' ENAME-ARR. 위의예에서컬럼 EMPNO 가테이블 EMP 의기본키컬럼이므로질의결과로우의개수가하나라는것을 알수있다. WHERE 절과입력변수 SELECT 문장내에서변수의위치는 INTO 절에출력변수가포함되는것외에 WHERE 절에입력변수가 포함된다. 다음은 SELECT 문장의 WHERE 절에입력변수가사용된예이다. EXEC SQL SELECT EMP_NO, EMP_NAME INTO :EMP-A, :NAME 제 3 장기본프로그래밍 29
FROM EMP WHERE DEPT_NO = :DEPT-NO 다음은 SELECT 문장의 WHERE 절에포함되는입력변수에대한이다. 입력변수의값설정 WHERE 절에포함되는입력변수의값은 SELECT 문장이실행되기전에설정되어있어야한다. 그이유는 SELECT 문장은실행직전에입력변수의값을가져와서 SELECT 문장을완성한뒤에실행되기때문이다. SELECT 문장의실행에필요한입력변수의값은그문장이실행되기직전에읽혀지므로, 입력변수의값은프로그램실행중에동적으로설정할수있다. 입력변수사용의제약 SELECT 문장의입력변수는상수를대신하여사용할수있지만, 스키마객체또는컬럼등의이름을대신하여사용될수는없다. SELECT 문장에부질의 (Subquery) 가사용되는경우에는부질의내에출력변수를포함시킬수는없지만입력변수를포함시킬수는있다. 다음은컬럼의이름을대신하여입력변수가사용된예이다. 01 ENAME PIC X(24) VARYING. 01 SALARY PIC S9(5). 01 COL-NAME PIC X(32) VARYING.... MOVE Z"EMPNO" TO COL-NAME-ARR. EXEC SQL SELECT ENAME, SALARY INTO :ENAME, :SALARY FROM EMP WHERE :COL-NAME = 20 위의예에서 WHERE 절다음에컬럼의이름이나와야하는데, 대신변수가사용되었기때문에잘못되었다. 3.3.2. INSERT INSERT, DELETE, UPDATE 문장은공통적으로질의의결과로우가존재하지않으므로출력변수없이입력변수만을사용한다. INSERT 문장에서입력변수는컬럼에삽입할데이터값의위치나부질의내부에사용될수있다. INSERT 문장에서삽입하고자하는컬럼값의일부에대해서만입력변수를사용할수도있다. 30 Tibero tbesql/cobol 안내서
다음은일부컬럼에대해서만입력변수를사용하는예이다. 01 ENAME PIC X(24) VARYING. 01 EMPNO PIC S9(9).... MOVE 20 TO EMPNO. MOVE Z"Peter" TO ENAME-ARR. EXEC SQL INSERT INTO EMP (ENAME, SALARY, EMPNO) VALUES (:ENAME, 35000, :EMPNO) 삽입하고자하는모든컬럼값에대하여입력변수를사용하는경우구조체변수를사용할수있다. 이때, 구조체변수에포함된각변수값은삽입하고자하는각컬럼값에대응된다. 다음은구조체변수를사용해데이터를삽입하는예이다. 01 EMP. 03 ENAME PIC X(24) VARYING. 03 SALARY PIC S9(5). 03 EMPNO PIC S9(9).... MOVE Z"Peter" TO ENAME-ARR IN ENAME IN EMP. MOVE 35000 TO SALARY IN EMP. MOVE 25 TO EMPNO IN EMP. EXEC SQL INSERT INTO EMP (ENAME, SALARY, EMPNO) VALUES (:EMP) 또한, 부질의에입력변수를사용할수도있다. 다음은부질의를포함하는 INSERT 문장의예이다. 01 SAL-BOUND PIC S9(5).... MOVE 30000 TO SAL-BOUND. EXEC SQL INSERT INTO EMP_SUB (ENAME, EMPNO) SELECT ENAME, EMPNO FROM EMP WHERE SALARY >= :SAL-BOUND 3.3.3. UPDATE UPDATE 문장도 INSERT 문장과마찬가지로입력변수만을사용한다. UPDATE 문장에서는 SET 절의컬럼값의위치나 WHERE 절에서입력변수가사용될수있다. UPDATE 문장에포함된부질의에서도입력변수를사용할수있다. UPDATE 문장에서는 INSERT 문장에서와달리구조체입력변수를사용할수없다. 제 3 장기본프로그래밍 31
다음은일부컬럼값과 WHERE 절내에입력변수를사용하는예이다. 01 ENAME PIC X(24) VARYING. 01 EMPNO PIC S9(9).... EXEC SQL UPDATE EMP SET ENAME = :ENAME, SALARY = SALARY * 1.05 WHERE EMPNO = :EMPNO 다음은부질의에입력변수를사용하는예이다. 01 EMPNO PIC S9(9). 01 SAL-BOUND PIC S9(5).... MOVE 20 TO EMPNO. MOVE 30000 TO SAL-BOUND. EXEC SQL UPDATE EMP SET SALARY = (SELECT SALARY FROM EMP WHERE EMPNO = :EMPNO) WHERE SALARY <= :SAL-BOUND 3.3.4. DELETE DELETE문장도 INSERT, UPDATE 문장과마찬가지로입력변수만을사용한다. DELETE 문장에서는 WHERE 절에서입력변수가사용된다. DELETE 문장에서도 UPDATE 문장과마찬가지로구조체입력변수를사용할수없다. 다음은입력변수를사용하는 DELETE 문장의예이다. 01 SAL-BOUND PIC S9(5).... MOVE 25000 TO SAL-BOUND. EXEC SQL DELETE FROM EMP WHERE SALARY <= :SAL-BOUND 32 Tibero tbesql/cobol 안내서
3.4. 커서 본절에서는커서의기본적인사용방법에대하여하고, 갱신및삭제를위한 CURRENT OF 절을설 명한다. 그리고마지막으로사용예제를제시한다. 3.4.1. 사용방법 SELECT 문을통한질의를수행할때 WHERE 절에기본키제약조건을부여하지않으면, 대개의경우결과로우의개수는하나이상이다. 커서는이렇게반환된다수의결과로우에각각차례로액세스하기위한데이터구조이다. 다음은커서를사용하는순서이다. 1. 커서를사용하기위해서는 DECLARE CURSOR를사용해맨먼저 SQL 문장과연관하여커서를선언해야한다. 커서를선언할때에는항상커서의이름을주어야하며, 커서의선언부는그커서를사용하는다른모든문장의앞에와야한다. 다음은 EMP-CURSOR라는이름으로커서를선언하는예이다. [ 예 3.3] 커서의선언 EXEC SQL DECLARE EMP-CURSOR CURSOR FOR SELECT ENAME, SALARY, ADDR FROM EMP WHERE DEPTNO = :DEPTNO 2. 커서를사용하기위해서는 OPEN을사용해해당커서를열어야한다. OPEN을실행하면연관된 SELECT 문장이실행되어질의의결과로우가반환된다. 또한커서는결과로우중에서맨처음에위치한로우의직전을가리킨다. 첫 FETCH가실행되면첫번째로우를가리키게된다. OPEN을실행할때유의할점은커서를선언할때에 SELECT 문장에포함된입력변수의값은 OPEN이실행될때할당된다는것이다. 다음은 [ 예 3.3] 에서선언한 EMP-CUROSR라는이름의커서에 OPEN을실행하는예이다. [ 예 3.4] OPEN의실행 EXEC SQL OPEN EMP-CURSOR 3. FETCH 를실행해로우에액세스를한다. OPEN 의실행으로는아직로우에액세스할수있는것은아니다. 로우에액세스를하기위해서는 FETCH 를실행해야한다. FETCH 의 INTO 절에는구조체변수나지시자변수를함께사용할수있다. 제 3 장기본프로그래밍 33
다음은 FETCH 를실행하는예이다. [ 예 3.5] FETCH의실행 EXEC SQL FETCH EMP-CURSOR INTO :ENAME, :SALARY, :ADDR FETCH를실행하면먼저커서가다음결과로우를가리키게되고, 커서가가리키는결과로우를출력변수에저장한다. FETCH를실행할때마다커서는다음결과로우를가리키고, 결국맨마지막결과로우의범위를넘어 FETCH를실행하면, NOT FOUND 에러가발생한다. 대개의경우 FETCH를무한루프안에포함시키며, NOT FOUND 에러가발행하면루프를빠져나오도록코드를작성한다. 이때, NOT FOUND 에러가발생했을때루프를빠져나오도록하기위해서는 WHENEVER 문장을사용한다. 다음은 WHENEVER 문장을사용하는예이다. [ 예 3.6] WHENEVER 문장의사용 EXEC SQL WHENEVER NOT FOUND GOTO FETCH-END FETCH-LOOP. EXEC SQL FETCH EMP-CURSOR INTO :ENAME, :SALARY, :ADDR... GO TO FETCH-LOOP. FETCH-END. WHENEVER 문장에 GOTO 명령이외에 DO CALL, DO PERFORM 등의명령을사용할수도있다. OPEN을사용해커서를열기전이나 CLOSE를사용해커서를닫은후, 그리고 NOT FOUND 에러가발생한이후에 FETCH를실행하면에러가발생한다. FETCH를이용해다음로우뿐만아니라이전로우를액세스할수도있다. 이러한작업을위해서는스크롤가능커서를선언해야한다. 스크롤가능커서에대해서는 3.5. 스크롤가능커서 를참고한다. 4. 커서사용의마지막단계는 CLOSE를사용해커서를닫는것이다. 커서를닫은이후에는그커서에대해어떠한작업도실행할수없다. 다음은 EMP-CURSOR라는이름의커서에 CLOSE를실행하는예이다. [ 예 3.7] CLOSE의사용 EXEC SQL CLOSE EMP-CURSOR 34 Tibero tbesql/cobol 안내서
3.4.2. CURRENT OF 절 커서를이용해 SELECT 문장의실행결과로우를차례로액세스하면서커서가현재가리키고있는결과로우를삭제하거나갱신하려고할때, DELETE 문장과 UPDATE 문장에 CURRENT OF 절을사용한다. SELECT 문장에서 CURRENT OF 절을사용하기위해서는 FOR UPDATE 절을포함해야한다. FOR UP DATE 절은질의결과로반환된로우에잠금 (LOCK) 을설정한다. 잠금이설정된로우는현재트랜잭션이커밋또는롤백되기전까지는다른트랜잭션이로우를갱신하거나삭제할수없다. 다음은 UPDATE 문장에서 CURRENT OF 절을이용하여컬럼 SALARY 만을갱신하는예이다. EXEC SQL DECLARE EMP-CURSOR CURSOR FOR SELECT ENAME, SALARY, ADDR FROM EMP WHERE DEPTNO = :DEPTNO FOR UPDATE OF SALARY... EXEC SQL OPEN CURSOR EMP-CURSOR EXEC SQL WHENEVER NOT FOUND GOTO FETCH-END FETCH-LOOP. EXEC SQL FETCH EMP-CURSOR INTO :ENAME, :SALARY, :ADDR... EXEC SQL UPDATE EMP SET SALARY = SALARY * 1.05 WHERE CURRENT OF EMP-CURSOR... GO TO FETCH-LOOP. FETCH-END. 커서가현재가리키고있는로우는 FETCH 문장을실행하여방금전에컬럼값을읽은로우이다. 커서에대해 OPEN 문장을실행한후에한번도 FETCH 문장을실행하지않았거나모든결과로우를읽고나서 NOT FOUND 에러가반환되었다면커서가현재가리키고있는로우는없다. 현재가리키고있는로우가없는커서를이용하여 DELETE 또는 UPDATE 문장을실행하였다면에러를반환한다. 또한, OPEN 문장을수행하지않았거나 CLOSE 문장을이미수행한커서를이용하여삭제또는갱신을시도할때에도에러를반환한다. CLOSE_ON_COMMIT 옵션이 'YES' 로지정된경우를제외하고는일반적으로커서는현재트랜잭션이커밋또는롤백한후에도사용할수있다. 즉, 커서를이용하여질의결과로우를액세스할수있다. 하지만, FOR UPDATE 절을포함한 SELECT 문장에대한커서는사용할수없다. 왜냐하면, 트랜잭션이커밋되거나롤백되는동시에결과로우에설정되었던잠금을해제해버리기때문이다. 제 3 장기본프로그래밍 35
3.4.3. 사용예제 다음은커서를사용하는예제프로그램이다. [ 예 3.8] 커서의사용 IDENTIFICATION DIVISION. ************************************************************* PROGRAM-ID. TEST. ************************************************************* ENVIRONMENT DIVISION. ************************************************************* CONFIGURATION SECTION. * SOURCE-COMPUTER. TEST-MACHINE. OBJECT-COMPUTER. TEST-MACHINE. ************************************************************* DATA DIVISION. ************************************************************* WORKING-STORAGE SECTION. EXEC SQL BEGIN DECLARE SECTION... 1... 01 USERPASS PIC X(20) VALUE Z"tibero/tmax". 01 ENAME PIC X(24) VARYING. 01 SALARY PIC S9(5). 01 ADDR PIC X(32) VARYING. 01 DEPTNO PIC S9(9). EXEC SQL END DECLARE SECTION EXEC SQL INCLUDE SQLCA PROCEDURE DIVISION. EXEC SQL DECLARE EMP-CURSOR CURSOR FOR... 2... SELECT ENAME, SALARY, ADDR FROM EMP WHERE DEPTNO =:DEPTNO... 3... EXEC SQL DECLARE EMP-UPDATE-CURSOR CURSOR FOR... 4... SELECT SALARY FROM EMP WHERE DEPTNO =:DEPTNO... 5... FOR UPDATE OF SALARY EXEC SQL CONNECT :USERPASS DISPLAY "Connected.". 36 Tibero tbesql/cobol 안내서
DISPLAY "Enter dept number to show: " ACCEPT DEPTNO. EXEC SQL OPEN EMP-CURSOR EXEC SQL WHENEVER NOT FOUND GOTO FETCH-END FETCH-LOOP. EXEC SQL FETCH EMP-CURSOR INTO :ENAME, :SALARY, :ADDR DISPLAY 'ENAME = 'ENAME-ARR', SALARY = 'SALARY ',ADDR = 'ADDR-ARR GO TO FETCH-LOOP. FETCH-END. EXEC SQL CLOSE EMP-CURSOR DISPLAY "Enter dept number to raise salary: " ACCEPT DEPTNO. EXEC SQL OPEN EMP-UPDATE-CURSOR EXEC SQL WHENEVER NOT FOUND GOTO FETCH-UPDATE-END FETCH-UPDATE-LOOP. EXEC SQL FETCH EMP-UPDATE-CURSOR INTO :SALARY EXEC SQL UPDATE EMP SET SALARY = :SALARY * 1.05 WHERE CURRENT OF EMP-UPDATE-CURSOR GO TO FETCH-UPDATE-LOOP. FETCH-UPDATE-END. EXEC SQL CLOSE EMP-UPDATE-CURSOR EXEC SQLCOMMIT WORK RELEASE... 6... 1 tbesql/cobol 문장내에포함되는모든입 / 출력변수는 DECLARE 영역안에서선언한다. 프로그램의맨앞쪽에서커서를선언하고있지만, 변수의선언과는달리커서의선언은어떠한위치에오더라도상관없으며, 그커서가사용되기전에만선언되면된다. 2, 4 두개의커서를선언한다. 각각단순질의와갱신을위한커서인데, 단순질의를위한커서는 EMP- CURSOR이고, 갱신을위한커서는 EMP-UPDATE-CURSOR이다. 3, 5 변수 DEPTNO가두개의커서에공통적으로사용된다. 커서와연관된 SELECT 문장은 OPEN 문장으로커서를열때실행되며, 그직전에입력변수의값을읽어들인다. 따라서, 같은변수를사용하더라도각각의 SELECT 문장이실행될때서로다른 DEPTNO 값이적용될수도있다. 제 3 장기본프로그래밍 37
6 프로그램의맨마지막에서는현재트랜잭션을커밋한다. 단순질의를위한커서 EMP-CURSOR 는트 랜잭션커밋후에도계속사용할수있으나, 갱신을위한커서 EMP-UPDATE-CURSOR 는사용할수없다. 3.5. 스크롤가능커서 본절에서는스크롤가능커서 (Scrollable Cursors) 의사용방법을하고, 사용예제를제시한다. 3.5.1. 사용방법 커서는질의의결과로우를액세스할때, 항상다음에위치한로우만액세스할수있는것에비해, 스크롤가능커서는임의의로우에액세스를할수있다. 예를들어, 스크롤가능커서는현재커서가가리키고있는로우의바로이전로우를액세스하거나전체결과로우중에서 n번째로우를액세스할수있다. 스크롤가능커서는사용방법의편리성과유연성을제공하지만커서와비교했을때, 메모리등의리소스를많이사용할수있으므로프로그램의실행성능을떨어뜨릴수있다. 따라서, 꼭필요한경우가아니라면커서를사용하는것이효율적이다. 다음은커서와스크롤가능커서의차이점이다. 커서 다음위치에있는로우만차례대로액세스를한다. 'DECLARE { 커서이름 } CURSOR' 의형태로선언 한다. FETCH를실행할때, 옵션을지정할수없다. 스크롤가능커서임의의위치에있는로우를액세스할수있다. 'DECLARE { 커서이름 } SCROLL CURSOR' 의형태로선언한다. FETCH를실행할때, 반드시옵션을지정해야한다. 스크롤가능커서에서도커서와동일하게 OPEN 과 CLOSE 를사용한다. 스크롤가능커서가현재가리키 고있는로우에대하여삭제및갱신을수행하고자할때에도커서와마찬가지로 DELETE 문장과 UPDATE 문장내에서 CURRENT OF 절을이용한다. 문장의작성및사용방법은커서와동일하다. 커서와스크롤가능커서의차이점을좀더상세하게하면다음과같다. 스크롤가능커서의선언스크롤가능커서의선언은 SCROLL키워드가포함된다는것을제외하면커서의선언과동일하며다음과같은형태로선언한다. DECLARE { 커서이름 } SCROLL CURSOR 다음의소스코드는스크롤가능커서를선언하는예이다. EXEC SQL DECLARE EMP-SCROLL-CURSOR SCROLL CURSOR FOR SELECT ENAME, SALARY, ADDR 38 Tibero tbesql/cobol 안내서
FROM EMP WHERE DEPTNO = :DEPTNO 스크롤가능커서에서의 FETCH 의사용 스크롤가능커서에서 FETCH 를사용할때는항상액세스할대상로우를지정해야한다. 다음은 FETCH 에서액세스를할대상로우를지정할때사용되는옵션이다. 옵션 NEXT 현재커서가가리키고있는로우의다음로우에액세스를한다. PRIOR 옵션과반대이다. 이옵션은생략이가능하다. PRIOR 현재커서가가리키고있는로우의이전로우에액세스를한다. NEXT 옵션과반대이다. FIRST 맨처음에위치한로우에액세스를한다. LAST 옵션과반대이다. LAST 맨마지막에위치한로우에액세스를한다. FIRST 옵션과반대이다. CURRENT RELATIVE offset 현재로우에액세스를한다. 현재커서가가리키고있는로우의다음 offset 번째에위치한로우에액세스를한 다. offset 값이음수라면커서가현재위치에서앞으로이동한다. 예를들어, 현재커서가 8 번째로우를가리키고있는데, 'FETCH RELATIVE -3' 을 실행한다면커서는 5 번째로우를가리키게된다. ABSOLUTE offset 전체로우중에서 offset 번째로우에액세스를한다. 다음은 FETCH 에옵션을사용하는예이다. EXEC SQL FETCH PRIOR EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR EXEC SQL FETCH LAST EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR EXEC SQL FETCH ABSOLUTE 3 EMP-SCROLL-CURSOR 제 3 장기본프로그래밍 39
INTO :ENAME, :SALARY, :ADDR 위의예에서는각각순서대로첫번째문장은이전로우를액세스하고, 두번째문장은마지막로우를액세스하고, 세번째문장은전체로우중에서세번째로우를액세스하고있다. 만약액세스하고자하는로우가존재하지않으면 NOT FOUND 에러가반환된다. 3.5.2. 사용예제 다음은스크롤가능커서를사용하는예제프로그램이다. IDENTIFICATION DIVISION. ************************************************************* PROGRAM-ID. TEST. ************************************************************* ENVIRONMENT DIVISION. ************************************************************* CONFIGURATION SECTION. * SOURCE-COMPUTER. TEST-MACHINE. OBJECT-COMPUTER. TEST-MACHINE. ************************************************************* DATA DIVISION. ************************************************************* WORKING-STORAGE SECTION. EXEC SQL BEGIN DECLARE SECTION 01 USERPASS PIC X(20) VALUE Z"tibero/tmax". 01 ENAME PIC X(24) VARYING. 01 SALARY PIC S9(5). 01 ADDR PIC X(32) VARYING. 01 DEPTNO PIC S9(9). EXEC SQL END DECLARE SECTION EXEC SQL INCLUDE SQLCA PROCEDURE DIVISION. EXEC SQL DECLARE EMP-SCROLL-CURSOR SCROLL CURSOR FOR SELECT ENAME, SALARY, ADDR FROM EMP WHERE DEPTNO = :DEPTNO EXEC SQL CONNECT :USERPASS 40 Tibero tbesql/cobol 안내서
DISPLAY "Connected.". MOVE 10 TO DEPTNO. EXEC SQL OPEN EMP-SCROLL-CURSOR * 1st row EXEC SQL FETCH FIRST EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * last row EXEC SQL FETCH LAST EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * 5th row EXEC SQL FETCH ABSOLUTE 5 EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * 8th row EXEC SQL FETCH RELATIVE 3 EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * 7th row EXEC SQL FETCH PRIOR EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * 7th row EXEC SQL FETCH CURRENT EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * 4th row EXEC SQL FETCH RELATIVE -3 EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR * 5th row EXEC SQL FETCH EMP-SCROLL-CURSOR INTO :ENAME, :SALARY, :ADDR EXEC SQL CLOSE EMP-SCROLL-CURSOR EXEC SQL COMMIT WORK RELEASE 위의예에서는주석을삽입하여, FETCH를실행할때마다스크롤가능커서의현재위치를하였다. 또한질의결과로우가 8개이상임을가정한다. SQL 문장내에포함되는모든입 / 출력변수는 DECLARE 영역안에서선언하였다. 커서를선언할때와마찬가지로스크롤가능커서를선언하는문장도, 스크롤가능커서가사용되기전이라면어떤위치에있어도상관없다. 제 3 장기본프로그래밍 41
제 4 장배열변수 본장에서는배열변수의기본개념과선언방법, 그리고배열변수를 tbesql/cobol 문장에서입 / 출력 변수로사용하는방법을한다. 4.1. 개요 tbesql/cobol 프로그램의배열변수는 COBOL 프로그래밍언어의배열변수의개념과동일하다. 배열은동일한타입의값을여러개저장할수있는데이터구조이다. tbesql/cobol 프로그램에서는 SELECT 문장을실행한뒤다수의결과로우를저장하기위해서출력변수로배열변수를사용하거나, INSERT 문장을사용할때도보통여러개의로우를삽입하게되므로입력변수로배열변수를사용한다. 배열변수가출력변수로사용될때는출력배열변수라고부르며, 입력변수로사용될때는입력배열변수라고부른다. 출력배열변수와입력배열변수가사용되는문장은다음과같다. 출력배열변수 SELECT 입력배열변수 INSERT UPDATE DELETE tbesql/cobol 프로그램에서 tbesql/cobol 문장과 COBOL 프로그램의변수사이에데이터를주고받을때, 배열변수를사용하면다음과같은장점이있다. 간결하고구조적인프로그래밍배열변수를사용하면각각의로우를처리할때마다별도의 SQL 문장을사용하지않고, 모든로우를하나의 SQL 문장으로처리할수있다. 따라서, 프로그램의소스코드를보다단순화할수있으며, 구조적인프로그래밍이가능하다. 제 4 장배열변수 43
tbesql/cobol 프로그램의성능향상 클라이언트와서버환경에서는데이터를주고받기위하여많은시간이필요하다. 배열변수를사용해 여러로우를한꺼번에처리하면전송시간이크게줄어든다. 4.2. 배열변수의선언 tbesql/cobol 문장에서사용될배열변수는대체로 COBOL 프로그램에서배열변수를선언하는방법과같다. 다만, tbesql/cobol 문장에사용될배열변수를선언할때에는반드시 DECLARE 영역안에선언해야한다. 다음은배열변수를선언하는예이다. EXEC SQL BEGIN DECLARE SECTION 01 ENAME PIC X(24) OCCURS 50 TIMES VARYING. 01 SALARY PIC S9(5) OCCURS 50 TIMES. 01 ADDR PIC X(32) OCCURS 50 TIMES VARYING.... EXEC SQL END DECLARE SECTION 4.3. 입 / 출력배열변수 본절에서는 tbesql/cobol 문장에서배열변수가입 / 출력변수로사용될경우, 각 tbesql/cobol 문 장에따른배열변수의사용방법에대해한다. 4.3.1. SELECT SELECT 문장을실행하여반환되는결과로우의개수가하나이상이라면반드시커서또는배열변수를사용하여야한다. 결과로우의개수를미리예측할수있다면배열변수의크기를충분히선언하여사용할수있다. 만약결과로우의개수가예측하기힘들거나매우크다면, 배열변수와커서를함께사용할수도있다. 배열변수 SELECT문장의실행결과로반환된로우의개수가예측가능하고크기가크지않다면배열변수를이용하여모든결과로우를한번에받을수있다. 예를들어, SELECT 문장의결과로반환되는로우의개수가 50개를넘지않는경우에다음과같이소스코드를작성할수있다. [ 예 4.1] SELECT 문장에서의배열변수의사용 01 ENAME PIC X(24) OCCURS 50 TIMES VARYING. 01 SALARY PIC S9(5) OCCURS 50 TIMES. 01 ADDR PIC X(32) OCCURS 50 TIMES VARYING. 44 Tibero tbesql/cobol 안내서
... EXEC SQL SELECT ENAME, SALARY, ADDR INTO :ENAME, :SALARY, :ADDR FROM EMP WHERE SALARY >= 50000 결과로우의각컬럼값은각배열변수에저장되며, 저장될때같은순서의변수에저장된다. 예를들어, 세번째로우의컬럼값은각각배열변수의세번째위치인 ENAME(3), SALARY(3), ADDR(3) 에저장된 다. SELECT 문장에서배열변수를사용할때는다음의사항에유의해야한다. INTO 절에포함되는출력변수는배열변수와일반변수가동시에함께올수없다. 따라서, INTO 절에포함된모든출력변수는배열변수이거나또는일반변수이어야한다. SELECT 문장의실행결과로반환된로우의전부가아닌일부만을얻고싶을때에도배열변수를이용할수있다. 위의 [ 예 4.1] 에서 SELECT 문장의실행결과로반환된로우가 50개가넘는경우에 50개까지의결과로우만을배열변수에저장한다. SELECT 문장의실행결과로배열변수에저장된로우의실제개수는변수인 SQLERRD(3) IN SQLCA 를통해알수있다. 다음은 SELECT 문의실행후에올수있는소스코드에 SQLERRD(3) IN SQLCA 를사용한예이다. PERFORM VARYING CNT FROM 1 BY 1 UNTIL ( CNT > SQLERRD(3) IN SQLCA ) DISPLAY ENAME(CNT) ', ' SALARY(CNT) ', ' ADDR(CNT) END-PERFORM. DISPLAY 'number of returned rows = ' SQLERRD(3) IN SQLCA 맨마지막라인을보면반환된로우의개수를출력하는데 SQLERRD(3) IN SQLCA를사용하였다. 배열변수의크기가일정하지않은경우에는가장작은배열변수의크기를전체배열변수의크기로설정한다. 예를들어, 다음의소스코드와같이배열변수가선언된경우에배열변수 ENAME과 SALARY의크기는 50이지만, ADDR의크기가 30이므로, SELECT 문의실행후에반환되는결과로우의개수는 30개이다. 01 ENAME PIC X(24) OCCURS 50 TIMES VARYING. 01 SALARY PIC S9(5) OCCURS 50 TIMES. 01 ADDR PIC X(32) OCCURS 30 TIMES VARYING.... 제 4 장배열변수 45
EXEC SQL SELECT ENAME, SALARY, ADDR INTO :ENAME, :SALARY, :ADDR FROM EMP WHERE SALARY >= 50000 SELECT 문장의 WHERE 절에는배열변수가올수없다. WHERE 절에배열변수가오는경우질의의 의미가모호해지기때문이다. 따라서, 다음과같은소스코드는프리컴파일과정에서에러를반환한다. 01 DEPTNO PIC S9(9) OCCURS 50 TIMES.... EXEC SQL SELECT ENAME, SALARY, ADDR INTO :ENAME, :SALARY, :ADDR FROM EMP WHERE DEPTNO = :DEPTNO 배열변수와함께커서를사용하더라도 SELECT 문장의 WHERE 절에배열변수를사용할수는없다. 배열변수와커서 SELECT 문장의실행결과로반환되는로우의개수를예측하기어렵거나반환되는로우의개수가많다면배열변수와함께커서를이용하여야한다. 이때, 일반커서는물론스크롤가능커서도사용할수있다. 커서와배열변수를함께사용하는방법은커서와일반변수를함께사용하는경우와거의유사하다. 하지만 FETCH를실행할때, 루프를빠져나오는방법이일반변수를사용할때와다르다. 그이유는 NOT FOUND 에러가발생되는경우가차이가있기때문이다. 일반적으로커서를이용하여루프내에서결과로우를액세스할때더이상읽어올결과로우가없으면 NOT FOUND 에러가반환된다. 하지만, 일반변수일때와배열변수일때, NOT FOUND 에러는다음과같은차이가있다. 구분 일반변수 배열변수 일반변수를이용할때에는결과로우를하나씩액세스하므로 NOT FOUND 에러가발생할때에는출력변수에저장된결과로우는없다. 배열변수를이용할때에는배열변수의크기보다작은수의결과로우를반환하더라도 NOT FOUND 에러를반환한다. 즉, NOT FOUND 에러를반환하더라도출력배열변수에는결과로우가포함되어있을수있다. 따라서, 배열변수를사용할때는 SQLCA 의변수를사용해루프를빠져나온다. 커서와함께배열변수가 사용될때에 SQLERRD(3) IN SQLCA 에는 FETCH 문장을수행할때마다현재까지처리된결과로우의 누적개수가저장된다. 그러므로, 이누적개수가더이상증가하지않을때, 루프를중단하면된다. 46 Tibero tbesql/cobol 안내서
다음은루프를중단하는소스코드의예이다. [ 예 4.2] SQLERRD(3) IN SQLCA를활용한루프의중단 01 IDX PIC S9(9). 01 COUNT PIC S9(9). 01 BEFORE-COUNT PIC S9(9). 01 CURRENT-COUNT PIC S9(9).... EXEC SQL DECLARE CUR CURSOR FOR...... MOVE 0 TO BEFORE-COUNT. MOVE 0 TO CURRENT-COUNT.... FETCH. EXEC SQL FETCH CUR INTO... MOVE SQLERRD(3) IN SQLCA TO CURRENT-COUNT. IF (CURRENT-COUNT = BEFORE-COUNT) GOTO FETCH-END. COMPUTE COUNT = CURRERNT-COUNT - BEFORE-COUNT. PERFORM VARYING IDX FROM 1 BY 1 UNTIL ( IDX > COUNT ) * 각로우에대한처리 END-PERFORM. MOVE CURRENT-COUNT TO BEFORE-COUNT. GO TO FETCH. FETCH-END. 위의예에서는두개의새로운변수 BEFORE-COUNT 와 CURRENT-COUNT 를사용하여두변수의값이 일치하면 FETCH 루프를중단한다. 출력배열변수에저장된실제결과로우의개수는변수 COUNT 에저 장된다. 다수의커서 SELECT 문장에는배열변수와함께다수의커서를사용할수도있다. 몇개의커서를사용하더라도하나의커서를사용할때와동일하게처리된다. 동시에여러개의커서를사용할때, SQLCA의변수는각커서마다별도로선언되지는않는다. 따라서변수 SQLCA에저장된데이터는직전에실행된질의또는기타 SQL 문장의결과에대한데이터이다. 다음은각커서에 FETCH를수행할때마다변수 SQLCA에저장되는데이터의예이다. EXEC SQL DECLARE CUR1 CURSOR FOR... EXEC SQL DECLARE CUR2 CURSOR FOR...... EXEC SQL OPEN CUR1 EXEC SQL OPEN CUR2 제 4 장배열변수 47
... EXEC SQL FETCH CUR1 INTO :ENAME * SQLERRD(3) = 20 EXEC SQL FETCH CUR2 INTO :SALARY * SQLERRD(3) = 30, not 50 EXEC SQL FETCH CUR1 INTO :ENAME * SQLERRD(3) = 40, not 70 EXEC SQL FETCH CUR1 INTO :ENAME * SQLERRD(3) = 60, not 90 EXEC SQL FETCH CUR2 INTO :SALARY * SQLERRD(3) = 60, not 120 위의예에서배열변수 ENAME과 SALARY는각각크기가 20과 30이며, 커서 CUR1과 CUR2에연관된 SELECT 문장의결과로우의개수가충분히크다고가정한다. 스크롤가능커서 SELECT 문장에는배열변수와함께스크롤가능커서를사용할수도있다. 스크롤가능커서는일반커서의경우와거의동일하게사용할수있으나, SQLERRD(3) IN SQLCA에저장되는값의의미가달라진다. 일반커서와스크롤가능커서의 SQLERRD(3) IN SQLCA 값의차이는다음과같다. 구분일반커서의 SQLERRD(3) IN SQLCA 스크롤가능커서의 SQLERRD(3) IN SQLCA 일반커서의경우에는액세스된결과로우의누적개수를저장하고있다. 현재까지액세스된가장마지막결과로우의절대위치를저장하고있다. 스크롤가능커서를사용할때, SQLERRD(3) IN SQLCA에저장되는값은다음과같이결정된다. FETCH 문장을수행할때마다옵션에의하여정해진결과로우의위치로부터배열변수의크기만큼액세스하게되므로, SQLERRD(3) IN SQLCA에저장되는값은 ( 액세스하고자하는결과로우의절대위치 + 배열변수의크기 - 1) 값중에서현재까지가장큰값이된다. 만약액세스를하려는위치에서부터남아있는결과로우의개수가배열변수의크기보다작다면 SQLERRD(3) IN SQLCA에저장되는값은전체결과로우의개수가된다. 결과로우의절대위치값과 SQLERRD(3) IN SQLCA 값은항상 1 이상이다. 다음의소스코드는배열변수와함께스크롤가능커서를사용하는예이다. EXEC SQL DECLARE CUR SCROLL CURSOR FOR...... 48 Tibero tbesql/cobol 안내서