Tibero

Similar documents
13주-14주proc.PDF

Tmax

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

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap06-1Array.ppt

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

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

강의 개요

Microsoft PowerPoint - chap06-2pointer.ppt

개발및운영 Tibero DB Link (Tibero To Oracle) - Local 방식

Tibero

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

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

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

DBMS & SQL Server Installation Database Laboratory

C++ Programming

歯sql_tuning2

PowerPoint 프레젠테이션

Tibero

Microsoft PowerPoint - ch07 - 포인터 pm0415

Visual Basic 반복문

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

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

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

Lab 3. 실습문제 (Single linked list)_해답.hwp

JVM 메모리구조

Microsoft Word - PLSQL.doc

개요오라클과티베로에서 JDBC 를통해접속한세션을구분할수있도록 JDBC 접속시 ConnectionProperties 를통해구분자를넣어줄수있다. 하나의 Node 에다수의 WAS 가있을경우 DB 에서 Session Kill 등의동작수행시원하는 Session 을선택할수있다.

Tibero

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

ALTIBASE HDB Patch Notes

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

untitled

Microsoft Word - AnyLink Introduction v3.2.3.doc

API 매뉴얼

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

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

chap 5: Trees

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

10.ppt

ESQL/C

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

C# Programming Guide - Types

윈백및업그레이드 Tibero Flashback 가이드

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

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

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Tablespace On-Offline 테이블스페이스 온라인/오프라인

윤성우의 열혈 TCP/IP 소켓 프로그래밍

KNK_C_05_Pointers_Arrays_structures_summary_v02

PowerPoint 프레젠테이션

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

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap03-변수와데이터형.pptx

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

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

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

Microsoft PowerPoint 웹 연동 기술.pptx

<BFDCB1B9C0CE20C5F5C0DAB1E2BEF7C0C720B3EBBBE7B0FCB0E82E687770>

Spring Boot/JDBC JdbcTemplate/CRUD 예제

OCW_C언어 기초

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - 10Àå.ppt

11장 포인터

PowerPoint Presentation

Microsoft PowerPoint - [2009] 02.pptx

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

OCW_C언어 기초

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

90

윈도우시스템프로그래밍

PowerPoint Presentation

슬라이드 제목 없음

설계란 무엇인가?

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - chap05-제어문.pptx

C++ Programming

쉽게 풀어쓴 C 프로그래밊

Microsoft Word - PLC제어응용-2차시.doc

C 프로그램의 기본

개발및운영 Tibero Perl 연동

인디쓔피-IOM핸돜벁닄큐1014pdf, page Preflight ( IOM핸돜벁닄큐__1014 )

<C6F7C6AEB6F5B1B3C0E72E687770>

Microsoft PowerPoint 세션.ppt

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

문서 템플릿

PowerPoint Presentation

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

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

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

RHEV 2.2 인증서 만료 확인 및 갱신

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

PowerPoint Presentation

마리오와 소닉 리우 올림픽™

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

Transcription:

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 안내서

EXEC SQL OPEN CUR... EXEC SQL FETCH CUR INTO :ENAME * 1 번째로우부터액세스. SQLERRD(3) = 20 EXEC SQL FETCH NEXT CUR INTO :ENAME * 21 번째로우부터액세스. SQLERRD(3) = 40 EXEC SQL FETCH ABSOLUTE 11 CUR INTO :ENAME * 11 번째로우부터액세스. SQLERRD(3) = 40 EXEC SQL FETCH RELATIVE 20 CUR INTO :ENAME * 51 번째로우부터액세스. SQLERRD(3) = 70 EXEC SQL FETCH ABSOLUTE 41 CUR INTO :ENAME * 41 번째로우부터액세스. SQLERRD(3) = 70 EXEC SQL FETCH RELATIVE 20 CUR INTO :ENAME * 81 번째로우부터액세스. SQLERRD(3) = 90 EXEC SQL FETCH ABSOLUTE 51 CUR INTO :ENAME * 51번째로우부터액세스. SQLERRD(3) = 90 위의예에서배열변수 ENAME의크기는 20이며, 커서 CUR에연관된 SELECT 문장의결과로반환된로우의전체개수는 90이라고가정한다. 지시자배열변수 SELECT 문장에는출력배열변수와함께지시자배열변수를사용할수있다. 지시자배열변수는출력배열변수와같은크기를가져야하며, 배열변수로선언한다는것외에는일반적인지시자변수와동일하게사용할수있다. 반환되는컬럼값이 NULL이거나값의일부가잘릴가능성이있다면지시자배열변수의사용을고려해야한다. 지시자배열변수도다른변수와마찬가지로 DECLARE 영역내에선언한다. 다음은지시자배열변수를사용한예이다. 01 ADDR PIC X(24) OCCURS 50 TIMES VARYING. 01 ADDR-IND PIC S9(4) OCCURS 50 TIMES COMP-5.... EXEC SQL SELECT ADDR,... INTO :ADDR INDICATOR :ADDR-IND,... FROM EMP WHERE DEPTNO = 5 제 4 장배열변수 49

참고 입력배열변수와함께지시자배열변수를사용할수도있다. 입력지시자변수는 INSERT, UPDATE, DELETE 문장에서사용할수있다. 사용예제 다음은 [ 예 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 01 USERPASS PIC X(20) VALUE Z"tibero/tmax". 01 ENAME PIC X(24) OCCURS 30 TIMES VARYING... 1... 01 SALARY PIC S9(5) OCCURS 30 TIMES. 01 ADDR PIC X(32) OCCURS 30 TIMES VARYING. 01 DEPTNO PIC S9(9). EXEC SQL END DECLARE SECTION 01 IDX PIC S9(9). 01 COUNT PIC S9(9). 01 BEFORE_COUNT PIC S9(9). 01 CURRENT_COUNT PIC S9(9). EXEC SQL INCLUDE SQLCA PROCEDURE DIVISION. EXEC SQL DECLARE EMP-CURSOR CURSOR FOR SELECT ENAME, SALARY, ADDR FROM EMP WHERE DEPTNO = :DEPTNO 50 Tibero tbesql/cobol 안내서

EXEC SQL CONNECT :USERPASS DISPLAY 'Connected.'. MOVE 10 TO DEPTNO. EXEC SQL OPEN EMP-CURSOR MOVE 0 TO BEFORE-COUNT. MOVE 0 TO CURRENT-COUNT. FETCH. EXEC SQL FETCH EMP-CURSOR INTO :ENAME, :SALARY, :ADDR MOVE SQLERRD(3) IN SQLCA TO CURRENT-COUNT. IF (CURRENT-COUNT = BEFORE-COUNT) GOTO FETCH-END... 2... COMPUTE COUNT = CURRERNT_COUNT - BEFORE-COUNT. PERFORM VARYING IDX FROM 1 BY 1 UNTIL ( IDX > COUNT ) DISPLAY 'ENAME = ' ENAME-ARR(IDX)... 3... ', SALARY = ' SALARY(IDX) ', ADDR = ' ADDR-ARR(IDX) END-PERFORM. MOVE CURRENT-COUNT TO BEFORE-COUNT. GO TO FETCH. FETCH-END. EXEC SQL CLOSE EMP-CURSOR EXEC SQL COMMIT WORK RELEASE 1[ 예 3.8] 과비교했을때, 변수를배열변수로선언한다. 2 FETCH를수행할때루프를중단한다. 3 배열변수에저장된컬럼의값을 DISPLAY 문을통해출력한다. 4.3.2. INSERT INSERT문장에서배열변수를사용하는방법은일반적인입력변수를사용하는방법과동일하다. 입력배열변수가사용되는각문장은문장이실행되기직전에동적으로배열변수에저장된값을읽어들인다. 따라서, 각문장이실행되기전에반드시배열변수에적절한값을넣어주는코드가있어야한다. INSERT 문장에서배열변수를사용할때는다음의사항에유의해야한다. 제 4 장배열변수 51

INSERT 문장에서사용되는입력변수는배열변수와일반변수가함께올수없다. 따라서, 모든입력변수가배열변수이거나일반변수로만구성되어야한다. SELECT 문장과유사하게, SQLERRD(3) IN SQLCA 에는삽입된로우의개수가저장되어있다. SQLERRD(3) IN SQLCA 에는항상하나의 INSERT 문장에의해삽입된로우의개수만저장된다. FOR 절을사용해, 입력배열변수의크기보다적은개수의로우를삽입하도록할수도있다. 예를들면크기가 50 인입력배열변수의내용중에서 30 개의로우값만을이용하는경우이다. 입력배열변수와함께지시자배열변수를사용할수도있다. 삽입해야할컬럼값중일부만 NULL 값인경우에는반드시지시자배열변수를사용해야한다. 다음은배열변수와함께 INSERT 문장을실행하는예이다. [ 예 4.3] INSERT 문장의배열변수 01 ENAME PIC X(24) OCCURS 50 TIMES VARYING. 01 SALARY PIC S9(5) OCCURS 50 TIMES.... MOVE "BROWN" TO ENAME(1). MOVE "30000" TO SALARY(1). MOVE "WHITE" TO ENAME(2). MOVE "28000" TO SALARY(2).... EXEC SQL INSERT INTO EMP (ENAME, SALARY) VALUES (:ENAME, :SALARY) 위의 [ 예 4.3] 에서의 INSERT 문장은다음의루프를이용한소스코드와같은결과를갖는다. 하지만, 배열 변수를이용하는편이서버와의통신비용을크게줄일수있으므로성능면에서훨씬효율적이다. PERFORM VARYING IDX FROM 1 BY 1 UNTIL ( IDX > 50 ) EXEC SQL INSERT INTO (ENAME, SALARY) VALUES (:ENAME(IDX), :SALARY(IDX)) END-PERFORM. 다음은컬럼 SALARY 에대해지시자배열변수를사용한예이다. 01 ENAME PIC X(24) OCCURS 50 TIMES VARYING. 01 SALARY PIC S9(5) OCCURS 50 TIMES. 01 SALARY-IND PIC S9(4) COMP-5 OCCURS 50 TIMES. 52 Tibero tbesql/cobol 안내서

... EXEC SQL INSERT INTO EMP (ENAME, SALARY) VALUES (:ENAME, :SALARY:SALARY-IND) 4.3.3. UPDATE UPDATE 문장에서배열변수를사용하는방법도일반변수를사용하는방법과유사하다. UPDATE 문장에서배열변수를사용할때는다음의사항에유의해야한다. UPDATE 문장에서는 SELECT 문장과는다르게 WHERE 절에도배열변수를사용할수있다. WHERE 절에배열변수를사용하면, SET 절에도배열변수를사용해야한다. 만약, WHERE 절에일반변수를사용하였다면 SET 절에도일반변수를사용하여야한다. INSERT 문장과유사하게, SQLERRD(3) IN SQLCA 에는갱신된로우의개수가저장된다. SQLERRD(3) IN SQLCA 에는항상하나의 UPDATE 문장에의해갱신된로우의개수만저장되며, 무결 성제약조건을만족하기위해연속적으로갱신되거나삭제된로우의개수는포함되지않는다. UPDATE 문장에서 SET 절내에사용된입력변수에는배열변수와일반변수가함께올수없다. SELECT FOR UPDATE 문장내에서 UPDATE... CURRENT OF 절과함께배열변수를사용할수없 다. 다음은 UPDATE 문장의 SET 절과 WHERE 절에배열변수를사용한예이다. [ 예 4.4] UPDATE 문장의배열변수 01 SALARY PIC S9(5) OCCURS 50 TIMES. 01 EMPNO PIC S9(9) OCCURS 50 TIMES.... MOVE "12000" TO SALARY(1). MOVE "22000" TO SALARY(2). MOVE "18000" TO SALARY(3). MOVE "23000" TO SALARY(4). MOVE "30000" TO SALARY(5). MOVE "23401" TO EMPNO(1). MOVE "12089" TO EMPNO(2). MOVE "13560" TO EMPNO(3). MOVE "32109" TO EMPNO(4). MOVE "10094" TO EMPNO(5). 제 4 장배열변수 53

... EXEC SQL UPDATE EMP SET SALARY = :SALARY WHERE EMPNO = :EMPNO 위의 [ 예 4.4] 은다음과같은루프를이용한연속된 UPDATE 문장과동일한결과를갖는다. 하지만, 배열 변수를이용하는편이성능면에서더욱효율적이다. PERFORM VARYING IDX FROM 1 BY 1 UNTIL ( IDX > 50 ) EXEC SQL UPDATE EMP SET SALARY = :SALARY(IDX) WHERE EMPNO = :EMPNO(IDX) END-PERFORM. 4.3.4. DELETE DELETE 문장에서배열변수를사용하는방법도일반변수를사용하는방법과유사하다. DELETE 문장에서배열변수를사용할때는다음의사항에유의해야한다. DELETE 문장에서도 UPDATE 문장과같이 WHERE 절에배열변수를사용할수있다. INSERT, UPDATE 문장에서와유사하게, SQLERRD(3) IN SQLCA에는삭제된로우의개수가저장된다. SQLERRD(3) IN SQLCA에는항상하나의 DELETE 문장에의하여삭제된로우의개수만저장되며, 무결성제약조건을만족하기위하여연속적으로갱신되거나삭제된로우의개수는포함되지않는다. DELETE 문장의 WHERE 절에사용될입력변수로배열변수와일반변수가함께올수없다. DELETE 문장에배열변수를사용할때는 DELETE... CURRENT OF 절을사용할수없다. 다음은 DELETE 문장의 WHERE 절에배열변수를사용한예이다. [ 예 4.5] DELETE 문장의배열변수 01 EMPNO PIC S9(9) OCCURS 50 TIMES.... MOVE "15009" TO EMPNO(1). MOVE "13450" TO EMPNO(2). MOVE "24200" TO EMPNO(3). MOVE "15832" TO EMPNO(4). MOVE "20009" TO EMPNO(5). 54 Tibero tbesql/cobol 안내서

MOVE "30110" TO EMPNO(6).... EXEC SQL DELETE EMP WHERE EMPNO = :EMPNO 위의 [ 예 4.5] 은다음의루프와동일한결과를갖는다. 하지만 INSERT, UPDATE 문장과마찬가지로배열 변수를이용하는편이성능면에서효율적이다. PERFORM VARYING IDX FROM 1 BY 1 UNTIL ( IDX > 50 ) EXEC SQL DELETE EMP WHERE EMPNO = :EMPNO(IDX) END-PERFORM. 4.3.5. FOR 절 INSERT, DELETE, UPDATE 문장에서입력배열변수를사용할때, 배열변수의크기보다적은개수의로우를처리하려는경우에 FOR 절을사용한다. FOR 절은 EXEC SQL 바로다음에오며, 처리하고자하는로우의개수를명시한다. FOR 절에로우의개수를명시할때다음의사항에유의해야한다. FOR 절에로우의개수를명시할때는숫자를명시할수도있으며, 변수를명시할수도있다. 변수를명시할경우해당변수는반드시 DECLARE 영역에선언되어있어야한다. FOR 절에로우의개수를명시할때, 연산식을사용해서는안된다. FOR 절의로우개수는항상입력배열변수의크기보다작아야한다. tbesql/cobol 프로그램에서는지정된로우의개수를저장할배열변수의크기를검토하지않는다. 만약지정된로우의개수보다배열변수의크기가작다면, 내부적으로유효하지않은메모리에접근하게되어메모리에러가발생하고, 이때 tbesql/cobol 프로그램이어떠한동작을할지보장할수없다. 다음의소스코드는 FOR 절을이용하는예이다. 01 ENAME PIC X(24) OCCURS 50 TIMES VARYING. 01 SALARY PIC S9(5) OCCURS 50 TIMES. 01 EMPNO PIC S9(9) OCCURS 50 TIMES. 01 ROW-COUNT PIC S9(9).... 제 4 장배열변수 55

EXEC SQL FOR20... 1... INSERT INTO EMP (ENAME, SALARY, ADDR) VALUES (:ENAME, :SALARY, NULL)... MOVE 30 TO ROW-COUNT. EXEC SQL FOR:ROW-COUNT... 2... UPDATE EMP SET SALARY = :SALARY WHERE EMPNO = :EMPNO 1 로우의개수를숫자로설정하여 FOR 절을이용할수있다. 2 변수를이용하여로우의개수를설정하여 FOR 절을이용할수있다. 단, 변수 ROW-COUNT는 DECLARE 영역에선언되어있어야한다. 다음은 FOR 절에서로우의개수를명시할때임의의연산식을사용한경우로잘못된예이다. EXEC SQL FOR( :ROW-COUNT + 10 ) DELETE EMP WHERE EMPNO = :EMPNO 4.4. 구조체배열변수 tbesql/cobol 문장내에서여러컬럼을동시에처리할때, 각컬럼별입 / 출력변수각각을나열할수도있지만, 각컬럼에대한변수를모아하나의구조체로정의하여구조체타입의변수를이용할수도있다. 또한, 더나아가각컬럼의여러로우를한꺼번에처리하고자할때구조체로정의한타입을배열로선언하여, 구조체배열변수를이용할수있다. 4.4.1. 구조체배열변수의선언 구조체배열변수를선언할때는다음의사항에유의해야한다. 구조체배열변수는반드시 DECLARE 영역에선언되어야한다. tbesql/cobol 문장에서사용되는구조체타입의변수는중첩되어정의될수없다. 이점은일반적인구조체변수일때나구조체배열변수일때나동일하다. 구조체변수의그하위멤버는배열일수없다. 이점도일반적인구조체변수일때나구조체배열변수일때나동일하다. 56 Tibero tbesql/cobol 안내서

다음은구조체배열변수를선언하는예이다. 01 EMP OCCURS 50 TIMES. 03 ENAME PIC X(24) VARYING. 03 SALARY PIC S9(5). 03 ADDR PIC X(32) VARYING. 다음은구조체를잘못선언한예이다. 01 EMP OCCURS 50 TIMES. 03 ENAME PIC X(24) VARYING. 03 SUB-EMP. 05 SALARY PIC S9(5). 05 ADDR PIC X(32) VARYING. 위의예에서는구조체 EMP 내부에구조체 SUB_EMP를중첩하여정의하였다. 구조체타입의변수는중첩되어정의될수없다. 다음은구조체타입변수의하위멤버를배열로선언한경우로잘못선언한예이다. 01 ENAME 03 FIRST-NAME OCCURS 5 TIMES 03 LAST-NAME OCCURS 5 TIMES 01 ENAME-ARR OCCURS 10 TIMES 03 FIRST-NAME OCCURS 5 TIMES 03 LAST-NAME OCCURS 5 TIMES 위의예에서 ENAME 과 ENAME-ARR 의하위멤버로각각배열을선언하였다. 구조체타입의변수는하위 멤버로배열이올수없다. 4.4.2. 사용방법 단순구조체타입의변수와마찬가지로구조체배열변수는 SELECT 문장에서의출력변수와 INSERT 문장에서의입력변수로사용할수있다. 구조체배열변수를사용하는방법은일반적인배열변수와동일하며, 배열변수의사용방법에대한내용은구조체배열변수에도동일하게해당된다. 단순히구조체배열변수만을사용할수도있으며커서와함께사용할수도있다. 다음은구조체배열변수를입 / 출력변수로사용하는예이다. 01 EMP OCCURS 50 TIMES. 03 ENAME PIC X(24) VARYING. 03 SALARY PIC S9(5). 03 ADDR PIC X(32) VARYING. 제 4 장배열변수 57

... EXEC SQL SELECT ENAME, SALARY, ADDR INTO :EMP FROM EMP WHERE SALARY >= 50000... EXEC SQL INSERT INTO EMP VALUES(:EMP) 58 Tibero tbesql/cobol 안내서

제 5 장 tbesql/cobol 문장 본장에서는 tbesql/cobol 프로그램에서데이터베이스처리를위해사용하는 tbesql/cobol 문장을 한다. 5.1. 개요 tbesql/cobol 프로그램은 COBOL 언어의소스코드와 tbesql/cobol 문장이혼합되어있다. tbesql/cobol 문장 (tbesql/cobol Statement) 은 tbesql/cobol 프로그램내에서 SQL 질의, 로우의삽입과갱신, 제거등과같은데이터베이스와관련된처리를하는문장을말한다. tbesql/cobol 문장은크게다음과같이두가지로구성된다. 실행문장 (Executable Statements) 실행문장은말그대로데이터베이스에어떠한동작을실행하기위한문장이다. 지시어 (Directive) 지시어는 tbesql/cobol 프로그램의실행을설정하기위한것으로데이터베이스에대한실행은이루 어지지않는다. 5.2. tbesql/cobol 문장의문법 다음은 tbesql/cobol 문장의문법을나타내는그림이다. [ 그림 5.1] tbesql/cobol 문장의문법 esql_stmt EXEC SQL STMT option ( param, ) choice1 choice2 제 5 장 tbesql/cobol 문장 59

[ 그림 5.1] 을기준으로 tbesql/cobol 문장의문법을해석하는방법은다음과같다. 항목 tbesql/c 문장의문법을대표하는이름은왼쪽위에나타낸다. ( 예 : esql_stmt) 타원안의포함되는문자는키워드 (Keyword) 이며, 반드시 tbesql/c 문장내에포함되어있어야한다. ( 예 : EXEC SQL, STMT) 사각형안의문자는 tbesql/c 문장에포함된문법의구성요소이며, 구성요소에맞는적절한문자열로바꾸어야한다. ( 예 : option, param, choice1, choice2) 원안의문자는 tbesql/c 문장의기호이며, 반드시 tbesql/c 문장내에포함되어있어야한다. ( 예 : 소괄호 (( )), 쉼표 (,)) tbesql/c 문장을완성하는순서는화살표를따라가면된다. 여러갈래로갈라지면서순방향으로이동하는화살표는두가지형태로띈다. 이는 [ 그림 5.1] 에서 option은포함되거나포함되지않은경우이며, choice1, choice2는여러가지중에하나만이 tbesql/c 문장에포함되어야하는경우이다. 또는, 역방향으로이동하는화살표는포함되지않거나한번이상포함되는경우이다. [ 그림 5.1] 에서쉼표 (,) 에해당되며, param은반드시한번이상포함되어야한다. 다음의 tbesql/cobol 문장은 [ 그림 5.1] 에따라모두유효한예이다. EXEC SQL STMT (param) choice1 EXEC SQL STMT option (param, param) choice1 EXEC SQL STMT (param, param) choice2 5.3. tbesql/cobol 문장의공통문법 본절에서는 tbesql/cobol 문장에서공통적으로자주사용되는부분을한다. 5.3.1. AT 절 AT 절은이름이있는데이터베이스연결을사용해 tbesql/cobol 문장을수행할때사용한다. AT 의세부내용은다음과같다. 문법 at_clause AT database_name AT :host_variable 60 Tibero tbesql/cobol 안내서

구성요소 구성요소 database_name 사용할데이터베이스의이름을명시한다. 여러개의데이터베이스접속을구 분하여관리하고싶을때 database_name 을사용한다. 데이터베이스의이름은 DECLARE DATABASE 를사용해미리선언되어있 어야한다. 만약선언되어있지않은이름을사용할경우에러가발생한다. :host_variable 사용할데이터베이스의이름이저장된호스트변수를명시한다. 데이터베이스의이름은미리선언되어있어야한다. 5.3.2. FOR 절 FOR 절은 tbesql/cobol 문장을반복해서수행할필요가있을때사용한다. FOR 절의세부내용은다음과같다. 문법 for_clause FOR integer :host_variable 구성요소 구성요소 integer :host_variable 반복횟수를명시한다. 반복횟수가저장된호스트변수를명시한다. 호스트변수는 int 등의숫자를저장할수있는타입이면된다. 5.3.3. DESCRIPTOR 이름 DESCRIPTOR 이름은 Dynamic SQL 을사용할때필요한 DESCRIPTOR 를가리키는이름이다. DESCRIPTOR 이름은프리컴파일러옵션즉 MODE, DYNAMIC 의값에따라다음과같이사용될수있다. 제 5 장 tbesql/cobol 문장 61

옵션값 ANSI ANSI 외 ansi_descriptor_name 이사용된다. normal_descriptor_name 이사용된다. DESCRIPTOR 이름의세부내용은다음과같다. 문법 descriptor_name normal_descriptor_name ansi_descriptor_name normal_descriptor_name identifier ansi_descriptor_name :host_variable string literal 구성요소 descriptor_name 구성요소 normal_descriptor_name ansi_descriptor_name MODE 가 TIBERO(ORACLE) 일때사용한다. MODE 가 ANSI(ISO) 일때사용한다. normal_descriptor_name 구성요소 identifier 서술자의이름을정의한식별자이다. ansi_descriptor_name 구성요소 :host_variable 서술자의이름이저장된호스트변수를명시한다. 호스트변수는 CHAR* 또는 CHAR ARRAY 타입등의문자열을저장할수있 는타입이다. 62 Tibero tbesql/cobol 안내서

구성요소 string literal 서술자의이름을작은따옴표 (' ') 로감싸서사용한다. 5.4. tbesql/cobol 문장의목록 본절에서는 Tibero에서제공하는 tbesql/cobol 문장을알파벳순으로한다. 단, 각 tbesql/cobol 문장의구성요소를할때, 키워드는특별한경우가아니면하지않는다. 다음은 tbesql/cobol문장을요약한목록이다. 실행문장 tbesql/cobol문장 ALLOCATE DESCRIPTOR CLOSE COMMIT CONNECT DEALLOCATE DESCRIPTOR DELETE EXECUTE EXECUTE DESCRIPTOR EXECUTE IMMEDIATE FETCH FETCH DESCRIPTOR GET DESCRIPTOR INSERT OPEN PREPARE ROLLBACK SAVEPOINT SELECT UPDATE 서술자에메모리를할당한다. 커서를닫고더이상사용하지않는다. 트랜잭션을커밋한다. Tibero의데이터베이스에접속한다. 서술자에할당된메모리를해제한다. 로우를삭제한다. 준비된 Dynamic SQL 문장을실행한다. 준비된 Dynamic SQL 문장을실행한다. (ANSI) Dynamic SQL 문장을바로실행한다. 커서를이용하여다음로우를읽는다. 커서를이용하여다음로우를읽는다. (ANSI) 지정한서술자에서원하는정보를가져온다. 로우를삽입한다. 커서를열고연관된 SQL 문장을실행한다. Dynamic SQL 문장을준비한다. 트랜잭션에롤백을수행한다. 저장점 (Savepoint) 을설정한다. SQL 질의를수행한다. 로우를갱신한다. 지시어 제 5 장 tbesql/cobol 문장 63

tbesql/cobol문장 DECLARE CURSOR DECLARE DATABASE DESCRIBE DESCRIBE DESCRIPTOR SET DESCRIPTOR WHENEVER SQL 문장과연관된커서를선언한다. 새로운데이터베이스접속을선언한다. 서술자를초기화한다. 서술자에호스트변수의정보를저장한다. 지정한서술자에사용자가입력해야할정보를쓴다. 에러가발생했을때, 해당에러에대한처리방법을지정한다. 5.4.1. ALLOCATE DESCRIPTOR ALLOCATE DESCRIPTOR 는서술자에메모리를할당할때사용하는문장이다. 단, 이문장은 ANSI 타입 의 Dynamic SQL 문장에만사용할수있다. ALLOCATE DESCRIPTOR 의세부내용은다음과같다. 문법 allocate_descriptor_statement EXEC SQL for_clause ALLOCATE DESCRIPTOR descriptor descriptor WITH MAX integer :host_variable string literal 구성요소 allocate_descriptor_statement 구성요소 for_clause descriptor WITH MAX integer 반복횟수를지정한다. 자세한내용은 5.3.2. FOR 절 을참고한다. 서술자의이름이저장된호스트변수나문자열을명시한다. 사용할호스트변수의최대개수를지정한다. ( 기본값 : 100) 64 Tibero tbesql/cobol 안내서

descriptor 구성요소 :host_variable 서술자의이름이저장된호스트변수를명시한다. 호스트변수는 CHAR* 또는 CHAR ARRAY 타입등의문자열을저장할수있 는타입이다. string literal 서술자의이름이저장된문자열을명시한다. 예제 다음은 ALLOCATE DESCRIPTOR 를사용하는예이다. EXEC SQL ALLOCATE DESSCRIPTOR 'IN-DESC' EXEC SQL ALLOCATE DESSCRIPTOR 'OUT-DESC' 5.4.2. CLOSE CLOSE 는커서를닫을때사용하는문장이다. 이문장은현재열려있는커서에만사용할수있다. 커서를 닫으면커서를생성할때할당되었던모든시스템리소스가반환된다. CLOSE 의세부내용은다음과같다. 문법 close_statement EXEC SQL cursor_name CLOSE cursor_name identifier 구성요소 close_statement 구성요소 cursor_name 닫으려는커서의이름을명시한다. cursor_name 제 5 장 tbesql/cobol 문장 65

구성요소 identifier 커서의이름을정의한식별자이다. 예제 다음은 CLOSE 를사용하는예이다. EXEC CLOSE EMP-CURSOR 5.4.3. COMMIT COMMIT 은현재진행중인트랜잭션을커밋하고트랜잭션에의해갱신된모든내용을데이터베이스에 반영할때사용하는문장이다. COMMIT 의세부내용은다음과같다. 문법 commit_statement EXEC SQL at_clause COMMIT WORK RELEASE 구성요소 구성요소 at_clause 커밋을실행할데이터베이스를명시한다. 데이터베이스의이름을직접명시할수도있고, 데이터베이스의이름이저장된 호스트변수를명시할수도있다. 자세한내용은 5.3.1. AT 절 을참고한다. WORK RELEASE 기존 ESQL 프로그램과의호환성을위한키워드이며특별한의미는없다. 모든리소스를반환하고데이터베이스접속을종료한다. 예제 다음은 COMMIT 을사용하는예이다. EXEC SQL COMMIT EXEC SQL COMMIT WORK RELEASE 66 Tibero tbesql/cobol 안내서

5.4.4. CONNECT CONNECT는데이터베이스에접속할때사용하는문장이다. 이문장을사용할때는사용자이름과패스워드를반드시명시해야한다. 데이터베이스관리자 (DBA: database administrator, 이하 DBA) 로접속할수도있다. CONNECT 의세부내용은다음과같다. 문법 connect_statement EXEC SQL CONNECT user_and_passwd at_clause using_clause user_and_passwd user_passwd user_id IDENTIFIED BY passwd user_passwd :host_variable user_id :host_variable passwd :host_variable using_clause USING db_alias 구성요소 connect_statement 구성요소 user_and_passwd at_clause 사용자이름과패스워드를명시한다. 접속할데이터베이스를명시한다. 데이터베이스의이름을직접명시할수도있고, 데이터베이스의이름이저장된 호스트변수를명시할수도있다. 자세한내용은 5.3.1. AT 절 을참고한다. using_clause 데이터베이스의별칭을명시한다. 제 5 장 tbesql/cobol 문장 67

user_and_passwd 구성요소 user_password 사용자이름과패스워드를명시한다. 사용자이름과패스워드의중간에슬래시 (/) 를포함해하나의문자열로표현한 다. ( 예 : 'tibero/tibero') user_id passwd 사용자이름을명시한다. 호스트변수이며, 문자열이직접올수없다. 패스워드를명시한다. 호스트변수이며, 문자열이직접올수없다. user_passwd 구성요소 :host_variable 사용자이름과패스워드를저장하고있는호스트변수이다. user_id 구성요소 :host_variable 사용자의계정을저장하고있는호스트변수이다. passwd 구성요소 :host_variable 패스워드를저장하고있는호스트변수이다. using_clause 구성요소 db_alias 데이터베이스의별칭을명시한다. 예제 다음은 CONNECT 를사용하는예이다. EXEC SQL CONNECT :USER IDENTIFIED BY :PASSWORD EXEC SQL CONNECT :USERPASS IN SYSDBA MODE 68 Tibero tbesql/cobol 안내서

5.4.5. DEALLOCATE DESCRIPTOR DEALLOCATE DESCRIPTOR 는 ALLOCATE DESCRIPTOR 를사용해할당된서술자의메모리를해제 할때사용하는문장이다. 단, 이문장은 ANSI 타입의 Dynamic SQL 문장에만사용할수있다. DEALLOCATE DESCRIPTOR 의세부내용은다음과같다. 문법 deallocate_descriptor_statement EXEC SQL DEALLOCATE DESCRIPTOR descriptor_name 구성요소 구성요소 descriptor_name 서술자의이름이저장된호스트변수혹은문자열을명시한다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선 언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR 를통해이미할당 되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 예제 다음은 DEALLOCATE DESCRIPTOR 를사용하는예이다. EXEC SQL DEALLOCATE DESSCRIPTOR 'IN-DESC' 5.4.6. DECLARE CURSOR DECLARE CURSOR는커서를선언할때사용하는문장이다. 이문장을사용해스크롤가능커서 (Scrollable Cursor) 를선언할수도있다. 커서를선언할때는커서의이름을반드시명시하여야하며, SELECT 문장과연관시켜야한다. Dynamic SQL 문장에대한커서인경우에는문장이름 (Statement Name) 과연관시킨다. 이때, 문장이름은 PREPARE를통해준비되어있어야한다. DECLARE CURSOR 의세부내용은다음과같다. 문법 제 5 장 tbesql/cobol 문장 69

declare_cursor_statement EXEC SQL at_clause DECLARE cursor_name SCROLL cursor_specification CURSOR FOR cursor_specification statement_name query_expression 구성요소 declare_cursor_statement 구성요소 at_clause 문장을실행할데이터베이스를명시한다. 데이터베이스의이름을직접명시할수도있고, 데이터베이스의이름이 저장된호스트변수를명시할수도있다. 자세한내용은 5.3.1. AT 절 을참고한다. cursor_name SCROLL cursor_specification statement_name 커서의이름을명시한다. 스크롤가능커서로선언한다. 커서로수행할문장을명시한다. 준비된문장의이름을명시한다. 사용될문장은 PREPARE를통해준비되어있어야한다. cursor_specification 구성요소 query_expression SELECT 문장을명시한다. INTO 절을포함할수없다. 예제 다음은 DECLARE CURSOR 를사용한예이다. EXEC SQL DECLARE EMP-CURSOR1 CURSOR FOR SELECT EMPNO, ENAME, SALARY FROM EMP EXEC SQL DECLARE EMP-CURSOR2 SCROLL CURSOR FOR 70 Tibero tbesql/cobol 안내서

SELECT EMPNO, ENAME, SALARY FROM EMP EXEC SQL DECLARE DYN-CUR CURSOR FOR DYN-STMT 5.4.7. DECLARE DATABASE DECLARE DATABASE는데이터베이스를선언할때사용하는문장이다. 여러개의데이터베이스접속을사용할때각각의접속은데이터베이스의이름으로관리된다. DECLARE DATABASE로선언한데이터베이스의이름을 CONNECT 문장이나 COMMIT 문장의 RELEASE를통해각각을구분하여관리할수있다. DECLARE DATABASE 의세부내용은다음과같다. 문법 declare_database_statement EXEC SQL DECLARE database_name DATABASE 구성요소 구성요소 database_name 선언할데이터베이스이름을명시한다. 예제 다음은 DECLARE DATABASE 를사용한예이다. EXEC SQL DECLARE D1 DATABASE EXEC SQL CONNECT :USERPASS AT D1 5.4.8. DELETE DELETE 는테이블또는뷰에서로우를삭제할때사용하는문장이다. DELETE 의세부내용은다음과같다. 문법 제 5 장 tbesql/cobol 문장 71

DELETE 의문법에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 특권 DELETE 를사용하려면, 대상이되는테이블또는뷰에대한 DELETE 객체특권을갖고있거나 DELETE ANY TABLE 시스템특권을갖고있어야한다. 구성요소 구성요소 FOR 입력배열변수와함께사용될경우 FOR 절을이용하여 DELETE 를실행할 입력배열변수의크기를정할수있다. FOR 절이포함되어있지않거나실행할배열의크기가입력배열변수의크 기보다크면, 배열전체에대하여 DELETE 를실행한다. CURREST OF DELETE 를커서와함께사용할수도있다. 현재커서가가리키는로우를삭 제하려면 WHERE 절에 CURRENT OF 와커서이름을포함시킨다. 이때, 커서는닫혀있지않아야한다. 예제 다음은 DELETE 를사용하는예이다. EXEC SQL DELETE FROM EMP EXEC SQL DELETE FROM EMP WHERE EMPNO = :EMPNO EXEC SQL FOR :CNT DELETE FROM EMP WHERE EMPNO = :EMPNO EXEC SQL DELETE FROM EMP WHERE CURRENT OF EMP-CURSOR 위의예에서알수있듯이 DELETE 문장은 EXEC SQL로시작하고 로끝난다는것을제외하면, 일반적인 SQL 문장의문법과크게다르지않다. 72 Tibero tbesql/cobol 안내서

5.4.9. DESCRIBE DESCRIBE 는호스트변수의서술자를초기화할때사용하는문장이다. 이문장에는 Dynamic SQL 문장 이사용되는데, 사용될문장은미리 PREPARE 를통해준비해야한다. DESCRIBE 의세부내용은다음과같다. 문법 describe_statement EXEC SQL INTO DESCRIBE BIND VARIABLES FOR statement_name SELECT LIST FOR descriptor_name 구성요소 구성요소 BIND VARIABLES FOR SELECT LIST FOR statement_name descriptor_name 입력으로사용되는호스트변수의서술자를초기화하고, 바인드변수를바인딩하기위해사용한다. 이부분을명시하지않으면 SELECT LIST FOR가디폴트이다. SELECT 문장의 SELECT 리스트의정보를위한서술자를초기화한다. 명시하지않을경우디폴트이다. 사용될문장의이름을명시한다. 사용될문장의이름은이미 PREPARE를통해준비되어있어야한다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 예제 다음은 DESCRIBE 를사용하는예이다. EXEC SQL PREPARE PSTMT FROM :QUERY-STR EXEC SQL DECLARE EMP-CUR FOR 제 5 장 tbesql/cobol 문장 73

SELECT EMPNO, ENAME, SAL, COMM FROM EMP WHERE DEPTNO = :DEPT-NO EXEC SQL DESCRIBE BIND VARIABLES FOR PSTMT INTO BIND-DESC EXEC SQL OPEN EMP-CUR USING BIND-DESC EXEC SQL DESCRIBE SELECT LIST FOR PSTMT INTO SELECT-DESC EXEC SQL FETCH EMP-CUR INTO SELECT-DESC 5.4.10. DESCRIBE DESCRIPTOR DESCRIBE DESCRIPTOR 는서술자에호스트변수의정보를저장할때사용하는문장이다. 단, 이문장 은 ANSI 타입의 Dynamic SQL 문장에만사용할수있다. DESCRIBE DESCRIPTOR 의세부내용은다음과같다. 문법 Ò Ö Ø Ø Ñ ÒØ ËÉÄ ÍËÁÆ Ë ÊÁ ËÉÄ ÁÆÈÍÌ ÇÍÌÈÍÌ Ø Ø Ñ ÒØ Ò Ñ Ë ÊÁÈÌÇÊ Ö ÔØÓÖ Ò Ñ 구성요소 구성요소 INPUT 서술자가입력과출력중에어느곳에사용될지지정한다. 생략이가능하며 기본값은 INPUT 이다. 74 Tibero tbesql/cobol 안내서

구성요소 사용자가바인드변수에값을직접입력하여, tbesql/cobol 라이브러리에 서사용될수있도록한다. OUTPUT 서술자가입력과출력중에어느곳에사용될지지정한다. 생략이가능하며 기본값은 INPUT 이다. 사용자가바인드변수의멤버를통해, tbesql/cobol 라이브러리가동작하 면서저장된결과값의메타데이터 (metadata) 를확인하고, 적합한대응을할 수있도록해준다. statement_name SQL descriptor_name 사용될문장의이름을명시한다. 사용될문장의이름은이미 PREPARE를통해준비되어있어야한다. 기존 ESQL 프로그램과의호환성을위한키워드이며특별한의미는없다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 예제 다음은 DESCRIBE DESCRIPTOR 를사용하는예이다. EXEC SQL DESCRIBE INPUT S USING DESCRIPTOR 'IN-DESC' EXEC SQL DESCRIBE OUTPUT S USING DESCRIPTOR 'OUT-DESC' 5.4.11. EXECUTE EXECUTE 는 Dynamic SQL 문장을실행할때사용하는문장이다. EXECUTE 의세부내용은다음과같다. 문법 제 5 장 tbesql/cobol 문장 75

execute_statement EXEC SQL EXECUTE statement_name USING using_param_clause, psm_statement using_param_clause identifier indicator :host_variable indicator 구성요소 execute_statement 구성요소 statement_name USING using_param_clause psm_statement 실행할문장의이름을명시한다. 실행할문장의이름은 PREPARE 문장을통해이미준비되어있어야한다. USING 절을이용하여입력변수를지정한다. 또는입력배열변수를사용할수도있다. 실행할 anonymous psm block 문장의내용을서술한다. using_param_clause 구성요소 identifier :host_variable indicator 입력변수를정의한식별자이다. 입력변수를명시한다. 입력변수의개수는하나이상이고, 준비된문장내에포함된입력변수의개수와같아야한다. 지시자변수를명시할때사용한다. 예제 다음은 EXECUTE 를사용하는예이다. 76 Tibero tbesql/cobol 안내서

EXEC SQL EXECUTE SQL-STMT EXEC SQL EXECUTE SQL-STMT USING :EMPNO, :DEPTNO EXEC SQL FOR :CNT EXECUTE SQL-STMT USING :EMPNO INDICATOR :EMPNO-IND 5.4.12. EXECUTE DESCRIPTOR EXECUTE DESCRIPTOR 는 Dynamic SQL 문장을실행할때사용하는문장이다. 단, 이문장은 ANSI 타 입의 Dynamic SQL 문장에만사용할수있다. EXECUTE DESCRIPTOR 의세부내용은다음과같다. 문법 ansi_execute_statement EXEC SQL EXECUTE statement_name ansi_using_and_into_clause ansi_using_and_into_clause USING SQL DESCRIPTOR descriptor_name INTO SQL DESCRIPTOR descriptor_name 구성요소 ansi_excute_statement 구성요소 statement_name 서술자의이름이저장된호스트변수혹은문자열을명시한다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로서술자이름 을문자열로가지고있어야한다. 제 5 장 tbesql/cobol 문장 77

ansi_using_and_into_clause 구성요소 USING INTO SQL descriptor_name 입력호스트변수의정보를가지고있는지시자를사용해야할경우명시한다. 문장수행결과가출력값을가지고있을경우사용할지시자를명시한다. 기존 ESQL 프로그램과의호환성을위한키워드이며특별한의미는없다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 예제 다음은 EXECUTE DESCRIPTOR 를사용하는예이다. EXEC SQL EXECUTE S USING DESCRIPTOR 'input_desc' INTO DESCRIPTOR 'output_desc' 5.4.13. EXECUTE IMMEDIATE EXECUTE IMMEDIATE 는 Dynamic SQL 문장을준비하지않고바로실행할때사용하는문장이다. 이문 장을통해실행할 SQL 문장은입력변수가포함되지않아야한다. EXECUTE IMMEDIATE 의세부내용은다음과같다. 문법 execute_immediate_statement EXEC SQL EXECUTE IMMEDIATE :host_variable string literal literal 구성요소 구성요소 :host_variable 실행할 Dynamic SQL 문장을호스트변수를사용해명시한다. 78 Tibero tbesql/cobol 안내서

구성요소 string literal 'literal' 실행할문장을문자열리터럴을사용해명시한다. 실행할문장을문자열을사용해명시한다. 예제 다음은 EXECUTE IMMEDIATE 를사용하는예이다. EXEC SQL EXECUTE IMMEDIATE :SQL-STMT EXEC SQL EXECUTE IMMEDIATE Z'SELECT EMPNO, ENAME, SALARY FROM EMP' 5.4.14. FETCH FETCH는커서가현재가리키고있는로우의데이터를읽어올때사용하는문장이다. 이문장을사용할때, 출력변수로배열변수를사용할수있다. 배열변수를사용할경우, 여러개의로우데이터를동시에읽어올수있다. FETCH 의세부내용은다음과같다. 문법 fetch_statement EXEC SQL FETCH cursor_name for_clause fetch_type_clause INTO fetch_target, USING DESCRIPTOR descriptor_name 제 5 장 tbesql/cobol 문장 79

fetch_type_clause NEXT PRIOR FIRST LAST CURRENT ABSOLUTE position_clause RELATIVE position_clause fetch_target identifier indicator :host_variable indicator 구성요소 fetch_statement 구성요소 for_clause 입력배열변수를사용할때 for_clause 를사용해동시에읽을로우의개수를 지정할수있다. for_clause 가포함되어있지않거나, for_clause 에지정된로우의개수가입 력배열변수의크기보다크면, 배열변수의크기만큼로우를읽는다. 자세한 내용은 5.3.2. FOR 절 을참고한다. fetch_type_clause cursor_name fetch_target USING DESCRIPTOR descriptor_name 스크롤커서일경우스크롤타입을명시한다. 커서의이름을명시한다. 사용될커서는열려있어야한다. 결과값을저장할호스트변수를명시한다. 서술자의이름을명시할경우서술자의이름앞에붙이는키워드이다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 80 Tibero tbesql/cobol 안내서

fetch_type_clause 구성요소 NEXT 현재커서가가리키고있는로우의다음로우에액세스를한다. PRIOR 옵션과반대이다. 이옵션은생략이가능하다. PRIOR 현재커서가가리키고있는로우의이전로우에액세스를한다. NEXT 옵션과반대이다. FIRST 맨처음에위치한로우에액세스를한다. LAST 옵션과반대이다. LAST 맨마지막에위치한로우에액세스를한다. FIRST 옵션과반대이다. CURRENT ABSOLUTE posi tion_clause RELATIVE posi tion_clause 현재로우에액세스를한다. 전체로우중에서 position_clause번째로우에액세스를한다. 현재커서가가리키고있는로우의다음 position_clause번째에위치한로우에액세스를한다. position_clause 의값이음수라면커서가현재위치에서앞으로이동한다. 예 를들어, 현재커서가 8 번째로우를가리키고있는데, 'FETCH RELATIVE - 3' 을실행한다면커서는 5 번째로우를가리키게된다. fetch_target 구성요소 identifier :host_variable indicator 출력변수를정의한식별자이다. 출력변수를명시한다. 출력변수의개수는하나이상이고, 준비된문장의결과로출력될 SELECT 리스트의컬럼개수와동일해야한다. 지시자변수를명시할때사용한다. 예제 다음은 FETCH 를사용하는예이다. EXEC SQL FETCH EMP-CURSOR INTO :EMPNO, :ENAME 제 5 장 tbesql/cobol 문장 81

EXEC SQL FETCH EMP-CURSOR INTO :EMPNO, :ENAME:ENAME-IND EXEC SQL FOR :CNT FETCH EMP-CURSOR INTO :EMPNO-ARRAY, :ENAME-ARRAY 5.4.15. FETCH DESCRIPTOR FETCH DESCRIPTOR 는커서가현재가리키고있는로우데이터를읽어올때사용하는문장이다. FETCH 와거의동일하게동작한다. 단, 이문장은 ANSI 타입의 Dynamic SQL 문장에만사용할수있다. FETCH DESCRIPTOR 의세부내용은다음과같다. 문법 ansi_fetch_statement EXEC SQL FETCH cursor_name for_clause fetch_type_clause INTO SQL DESCRIPTOR descriptor_name 구성요소 구성요소 for_clause 입력배열변수를사용할때 for_clause 를사용해동시에읽을로우의개수를 지정할수있다. for_clause 가포함되어있지않거나, for_clause 에지정된로우의개수가입 력배열변수의크기보다크면, 배열변수의크기만큼로우를읽는다. 자세한 내용은 5.3.2. FOR 절 을참고한다. fetch_type_clause cursor_name SQL descriptor_name FETCH의 fetch_type_clause와동일하다. 커서의이름을명시한다. 사용될커서는열려있는커서이어야한다. 기존 ESQL 프로그램과의호환성을위한키워드이며특별한의미는없다. 서술자의이름이저장된호스트변수또는문자열을적는다. 82 Tibero tbesql/cobol 안내서

구성요소 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 예제 다음은 FETCH DESCRIPTOR 를사용하는예이다. EXEC SQL FETCH C1 INTO DESCRIPTOR 'OUT-DESC' 5.4.16. GET DESCRIPTOR GET DESCRIPTOR 는지정한서술자에서원하는정보를가져올때사용하는문장이다. 단, 이문장은 ANSI 타입의 Dynamic SQL 문장에만사용할수있다. GET DESCRIPTOR 의세부내용은다음과같다. 문법 get_descriptor_statement EXEC SQL for_clause GET DESCRIPTOR descriptor_name value VALUE value count = COUNT get_item_clause, :host_variable integer get_item_clause :host_variable = item_name 제 5 장 tbesql/cobol 문장 83

item_name TYPE LENGTH INDICATOR DATA CHARACTER_SET_NAME OCTET_LENGTH RETURNED_LENGTH RETURNED_OCTET_LENGTH PRECISION SCALE NULLABLE NAME 구성요소 get_descriptor_statement 구성요소 for_clause 입력배열변수를사용할때 for_clause 를사용해동시에읽을로우 의개수를지정할수있다. for_clause 가포함되어있지않거나, for_clause 에지정된로우의개 수가입력배열변수의크기보다크면, 배열변수의크기만큼로우를 읽는다. 자세한내용은 5.3.2. FOR 절 을참고한다. descriptor_name 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. VALUE value get_item_clause count 정보를가져올호스트변수의순서를지정한다. 가져올정보의항목과정보를저장할호스트변수를명시한다. 사용된호스트변수의개수를알고자할경우, 그개수를저장할호스트변수를명시한다. 84 Tibero tbesql/cobol 안내서

value 구성요소 :host_variable integer 값이들어있는호스트변수를사용할때명시한다. 값을직접정수로입력할때사용한다. get_item_clause 구성요소 :host_variable item_name 해당항목을가져올호스트변수를명시한다. 값을가져올구체적인항목을명시한다. item_name 구성요소 TYPE LENGTH INDICATOR DATA CHARACTER_SET_NAME OCTET_LENGTH RETURNED_LENGTH RETURNED_OCTET_LENGTH PRECISION SCALE NULLABLE 데이터의타입을가져오고자할때사용한다. 데이터의최대길이를가져오고자할때사용한다. 데이터연관된지시자값을가져오고자할때사용한다. 데이터값을가져오고자할때사용한다. 데이터가저장된컬럼의문자세트를가져오고자할때사용한다. 데이터길이를 byte 단위로환산해가져오고자할때사용한다. FETCH를할때실제로받아올데이터길이를가져오고자할때사용한다. FETCH를할때실제로받아올데이터길이를 byte 단위로환산해가져오고자할때사용한다. 받아올데이터의정밀도를가져오고자할때사용한다. 받아올데이터의스케일을가져오고자할때사용한다. 해당컬럼의데이터가 NULL이될수있는지여부를알고자할때사용한다. - 이값이 1 이면, 해당컬럼은 NULL 값을가질수있다. - 이값이 0 이면, 해당컬럼은 NULL 값을가질수없는키이거나 NOT- NULL 제약조건을가지고있는컬럼이다. NAME 해당컬럼의이름을가져오고자할때사용한다. 예제 다음은 GET DESCRIPTOR 를사용하는예이다. 제 5 장 tbesql/cobol 문장 85

EXEC SQL GET DESCRIPTOR 'OUT-DESC' :INPUT-CNT = COUNT 5.4.17. INSERT INSERT는테이블또는뷰에로우를삽입할때사용하는문장이다. 전체컬럼또는일부컬럼에데이터를삽입할수있다. INSERT를사용할때, 입력변수로배열변수를사용할수도있으며, 지시자변수를함께사용할수있다. 또한입력할데이터의값을사용자가직접지정할수도있고, 부질의를통하여지정할수도있다. 부질의를이용하는경우, 부질의의결과로우모두가테이블이나뷰에삽입된다. INSERT 의세부내용은다음과같다. 문법 INSERT 의문법에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 특권 INSERT 를사용하려면, INSERT 의대상테이블또는뷰에대하여 INSERT 객체특권을갖거나 INSERT ANY TABLE 시스템특권을갖고있어야한다. 구성요소 구성요소 FOR 입력배열변수와함께사용될경우 FOR 절을이용하여삽입할데이터의개 수를지정할수있다. FOR 절이포함되어있지않거나 FOR 절에서지정한크기가배열입력변수 의크기보다크면, 전체배열변수에저장된데이터가테이블에삽입된다. 예제 다음은 INSERT 를사용하는예이다. EXEC SQL INSERT INTO EMP VALUES (34, James', 45000) EXEC SQL INSERT INTO EMP (EMPNO, ENAME) VALUES (:EMPNO, :ENAME) EXEC SQL FOR :CNT 86 Tibero tbesql/cobol 안내서

INSERT INTO EMP (EMPNO, ENAME) VALUES (:EMPNO-ARRAY,:ENAME-ARRAY :ENAME-IND-ARRAY) EXEC SQL INSERT INTO HIGH_EMP SELECT * FROM EMP WHERE SALARY > 50000 위의예에서알수있듯이 INSERT 문장은 EXEC SQL로시작하고 로끝난다는것을제외하면, 일반적인 SQL 문장의문법과크게다르지않다. 5.4.18. OPEN OPEN은커서를열때사용하는문장이다. 이문장을사용해열려고하는커서는이미선언되어있어야하며, SELECT 문장과연관되어있어야한다. 커서의선언은 DECLARE CURSOR를통하여실행된다. 커서를여는것과동시에연관된 SELECT 문장이실행되며, 커서는질의문장이반환한결과의제일처음에위치한로우를가리킨다. 커서는 SELECT 문장과연관되기도하지만, Dynamic SQL 문장과연관되기도한다. OPEN 의세부내용은다음과같다. 문법 open_statement EXEC SQL for_clause OPEN cursor_name normal_using_clause ansi_using_and_into_clause normal_using_clause USING using_param_clause, USING DESCRIPTOR descriptor_name 제 5 장 tbesql/cobol 문장 87

ansi_using_and_into_clause USING SQL DESCRIPTOR descriptor_name INTO SQL DESCRIPTOR descriptor_name 구성요소 open_statement 구성요소 for_clause cursor_name normal_using_clause ansi_using_and_into_clause 실행반복횟수를지정한다. 자세한내용은 5.3.2. FOR 절 을참고한다. 열려고하는커서의이름을명시한다. 일반적으로사용하는 OPEN 문장의형태이다. 이미정의된서술자를이용한다. ANSI 타입의 Dynamic SQL 문장에만사용된다. normal_using_clause 구성요소 USING 커서가 Dynamic SQL 문장과연관된경우 USING 절을이용하여 SE LECT 문장의입력변수에할당할값을지정할수있다. 입력변수로배열변수를사용할수도있으며, 서술자변수를함께사용 할수도있다. using_param_clause USING DESCRIPTOR descriptor_name 입력호스트변수의정보가필요할경우에사용한다. 입력호스트변수의정보를가져왔던서술자를사용할경우명시한다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 88 Tibero tbesql/cobol 안내서

ansi_using_and_into_clause 구성요소 USING INTO SQL descriptor_name 입력호스트변수의정보가들어있는서술자변수가필요할경우에사용한다. 출력호스트변수의정보가들어있는서술자변수가필요할경우에사용한다. 기존 ESQL 프로그램과의호환성을위한키워드이며특별한의미는없다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. 다음은 OPEN 을사용하는예이다. EXEC SQL OPEN EMP-CURSOR EXEC SQL OPEN EMP-CURSOR USING :EMPNO EXEC SQL FOR :CNT OPEN EMP-CURSOR USING :EMPNO INDICATOR :EMPNO-IND 5.4.19. PREPARE PREPARE는 Dynamic SQL 문장을준비할때사용하는문장이다. 준비된 SQL 문장은문장의이름을통해서로식별되며, 이후에 DECLARE CURSOR 또는 EXECUTE에서참조된다. SQL 문장을준비한다는것은단지문장을파싱 (Parsing) 한다는의미일뿐이며, 문장이실행된다는의미는아니다. 문장이실제로실행되는것은 EXECUTE 문장을통해서이다. SQL 문장에는하나이상의입력변수가포함될수있는데, 입력변수가포함될때, 입력변수의이름은별다른의미를갖지않으며, tbesql 프로그램에미리선언되어있을필요도없다. PREPARE 의세부내용은다음과같다. 문법 제 5 장 tbesql/cobol 문장 89

prepare_statement EXEC SQL at_clause PREPARE statement_name FROM :host_variable string literal select_statement execute_dml_statement 구성요소 구성요소 statement_name FROM 준비를실행할 SQL 문장의이름을명시한다. FROM 절뒤에는준비할 Dynamic SQL 문장이온다. SQL 문장자체가올수 도있으며, SQL 문장의문자열을저장한호스트변수가올수도있다. SELECT 문장이라면문장자체가올수있다. :host_variable string literal select_statement execute_dml_statement Dynamic SQL 문장을저장한호스트변수를명시한다. Dynamic SQL 문장을나타내는문자열을명시한다. SELECT 문장자체를명시한다. 실행할 INSERT, UPDATE, DELETE 문장자체를명시한다. 예제 다음은 PREPARE 를사용하는예이다. EXEC SQL PREPARE EMP-STMT FROM :SQL-STMT EXEC SQL PREPARE EMP-STMT FROM Z'UPDATE EMP SET SALARY = SALARY * 1.05' EXEC SQL PREPARE EMP-STMT FROM SELECT EMPNO, ENAME, SALARY FROM EMP WHERE DEPTNO = :DEPTNO 90 Tibero tbesql/cobol 안내서

5.4.20. ROLLBACK ROLLBACK은현재진행중인트랜잭션을롤백하고갱신된모든내용을취소할때사용하는문장이다. 롤백을실행하는것과동시에데이터베이스와의접속을끊을수도있으며, 미리설정된저장점까지부분롤백 (Partial Rollback) 을수행할수도있다. ROLLBACK 의세부내용은다음과같다. 문법 rollback_statement EXEC SQL at_clause ROLLBACK WORK RELEASE TO savepoint_name SAVEPOINT savepoint_name identifier 구성요소 rollback_statement 구성요소 at_clause 문장을실행할데이터베이스를명시한다. 데이터베이스의이름을직접명시할수도있고, 데이터베이스의이름이저장된 호스트변수를명시할수도있다. 자세한내용은 5.3.1. AT 절 을참고한다. WORK RELEASE TO SAVEPOINT savepoint_name 기존 ESQL 프로그램과의호환성을위한키워드이며특별한의미는없다. 모든리소스를반환하고데이터베이스와의접속을종료한다. 특정저장점까지부분롤백을수행하고자할때명시한다. 단지문법호환을위해지원하는부분이다. 이부분의명시여부는문장실행에어떤영향도없다. 부분롤백을수행할저장점의이름을명시한다. 저장점은롤백을실행하기전에프로그램내에이미설정되어있어야한다. 제 5 장 tbesql/cobol 문장 91

savepoint_name 구성요소 identifier 저장점의이름을정의한식별자이다. 예제 다음은 ROLLBACK 을사용하는예이다. EXEC SQL ROLLBACK EXEC SQL ROLLBACK TO SAVEPOINT SP1 EXEC SQL ROLLBACK WORK RELEASE 5.4.21. SAVEPOINT SAVEPOINT 는저장점을설정할때사용하는문장이다. 설정된저장점은특정지점까지부분롤백을하 고자할때사용된다. SAVEPOINT 의세부내용은다음과같다. 문법 savepoint_statement EXEC SQL SAVEPOINT savepoint_name 구성요소 구성요소 savepoint_name 설정할저장점에부여할이름을명시한다. 예제 다음은 SAVEPOINT 를사용하는예이다. EXEC SQL SAVEPOINT SP1 92 Tibero tbesql/cobol 안내서

5.4.22. SELECT SELECT 는테이블또는뷰에대해질의를수행하고, 질의를수행한결과로우의각데이터를출력변수에 저장할때사용하는문장이다. SELECT 의세부내용은다음과같다. 문법 SELECT 의문법에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 특권 SELECT 문장을사용해질의를수행하기위해서는, 대상테이블에대한 SELECT 객체특권이있거나 SELECT ANY TABLE 시스템권한을갖고있어야한다. 구성요소 구성요소 INTO 질의결과의컬럼의개수는 INTO 절에포함된출력변수의개수와같아야한다. INTO 절에는지시자변수와함께배열출력변수를사용할수있다. 출력변수는 모두스칼라변수이거나또는, 모두배열변수이어야하며, 이두가지가서로섞 여있을수없다. WHERE HAVING WHERE 절에는입력변수를포함할수있다. 이때, 지시자변수와함께사용될수있다. SELECT 문장내에서는배열입력변수를사용할수없다. HAVING 절에는입력변수를포함할수있다. 지시자변수및배열입력변수와관련된내용은 WHERE 절과동일하다. 예제 다음은 SELECT 를사용하는예이다. EXEC SQL SELECT EMPNO, ENAME, SALARY INTO :EMPNO, :ENAME, :SALARY FROM EMP EXEC SQL SELECT EMPNO, ENAME, DNAME INTO :EMPNO-ARRAY, :ENAME-ARRAY :ENAME-ARRAY-IND, :DNAME-ARRAY FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = :DEPTNO 제 5 장 tbesql/cobol 문장 93

위의예에서알수있듯이 SELECT 문장은 INTO 절을제외하면, 일반적인 SQL 문장의문법과크게다 르지않다. 5.4.23. SET DESCRIPTOR SET DESCRIPTOR는사용자가입력해야할정보를지정한서술자에기록하는문장이다. 사용자는이문장을통해데이터값이나데이터값의길이등을지정할수있다. 단, 이문장은 ANSI 타입의 Dynamic SQL 문장에만사용할수있다. SET DESCRIPTOR 의세부내용은다음과같다. 문법 set_descriptor_statement EXEC SQL for_clause SET DESCRIPTOR descriptor_name VALUE value COUNT set_item_clause REF = count set_item_clause, item_name = host_var 구성요소 set_descriptor_statement 구성요소 for_clause descriptor_name 반복횟수를지정한다. 자세한내용은 5.3.2. FOR 절 을참고한다. 서술자의이름이저장된호스트변수또는문자열을적는다. 호스트변수는 PIC X(n) 타입등문자열을저장할수있는타입으로이미선언되어있어야한다. 서술자는 ALLOCATE DESCRIPTOR를통해이미할당되어있어야한다. 자세한내용은 5.3.3. DESCRIPTOR 이름 을참고한다. VALUE value 몇번째출력호스트변수인지명시한다. 94 Tibero tbesql/cobol 안내서

구성요소 set_item_clause COUNT count 출력호스트변수의정보를입력하기위해서술한다. 출력호스트변수의개수를받아오기위해서술한다. 출력호스트변수의개수를받아올호스트변수를명시한다. set_item_clause 구성요소 REF INDICATOR, DATA, RETURNED_LENGTH 항목을지정할때만사용할수 있는키워드로, 속도와편리성을위해사용한다. 호스트변수의값이아닌호스트변수자체를지정하며, GET DESCRIPTOR 문장을따로실행하지않아도 FETCH 한후지정된항목의값이지정된호스 트변수에들어간다. item_name host_var GET DESCRIPTOR 와동일하다. 출력호스트변수의각정보를받아올호스트변수를지정한다. 예제 다음은 SET DESCRIPTOR 를사용하는예이다. EXEC SQL SET DESCRIPTOR 'OUTPUT-DESCRIPTOR' VALUE :OCCURS TYPE = :TYPE, LENGTH = :LEN END-EXEC 5.4.24. UPDATE UPDATE는테이블또는뷰의컬럼값을갱신할때사용하는문장이다. 일부컬럼또는전체컬럼에대해갱신을수행할수있다. 이문장을사용할때입력변수로배열변수를사용할수도있으며, 지시자변수를함께사용할수있다. UPDATE 의세부내용은다음과같다. 문법 UPDATE 의문법에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 특권 UPDATE 를사용해갱신을수행하려면, 대상테이블또는뷰에대한 UPDATE 객체특권을갖거나 UP DATE ANY TABLE 시스템특권을가지고있어야한다. 제 5 장 tbesql/cobol 문장 95

구성요소 구성요소 SET WHERE SET 절에입력배열변수가포함되어있다면, WHERE 절에도반드시같은크기의입력배열변수가포함되어야한다. WHERE 절에입력배열변수가포함되어있다면, SET 절에도반드시같은크기의입력배열변수가포함되어야한다. UPDATE 문장을커서와함께사용할수도있다. 현재커서가가리키는로우의컬럼 값을갱신하려면 WHERE 절에 CURRENT OF 와커서이름을포함시킨다. 커서를 사용하려면커서는이미열려있는상태이어야한다. FOR 입력배열변수를사용할때, FOR 절을이용하여삽입할데이터의개수를지정할 수있다. FOR 절이포함되어있지않거나 FOR 절에서지정한개수가입력배열변수의크기 보다크다면, 전체배열변수에저장된데이터에대하여갱신을수행한다. 예제 다음은 UPDATE 를사용하는예이다. EXEC SQL UPDATE EMP SET SALARY = SALARY * 1.05 EXEC SQL UPDATE EMP SET SALARY = SALARY * :RATIO WHERE DEPTNO = :DEPTNO EXEC SQL FOR :CNT UPDATE EMP SET SALARY = SALARY * :RATIO-ARRAY WHERE DEPTNO = :DEPTNO-ARRAY EXEC SQL UPDATE EMP SET SALARY = SALARY * 1.05 WHERE CURRENT OF EMP-CURSOR 위의예에서알수있듯이 UPDATE 문장은 EXEC SQL로시작하고 로끝난다는것을제외하면, 일반적인 SQL 문장의문법과크게다르지않다. 96 Tibero tbesql/cobol 안내서

5.4.25. WHENEVER WHENEVER는 tbesql/cobol 프로그램을실행하는도중, 예외상황이발생했을경우에대비하여수행할작업을선언할때사용하는문장이다. 발생가능한예외상황에는액세스할로우가없는경우와에러또는경고가발생한경우가있다. WHENEVER 문장의효과범위는 WHENEVER 문장이명시된위치부터다음 WHENEVER 문장이나타날때까지이다. 하지만문장이한번만명시되었다면효과범위는 WHENEVER 문장이명시된위치부터프로그램의마지막까지이다. WHENEVER 의세부내용은다음과같다. 문법 whenever_statement_cobol EXEC SQL WHENEVER condition condition_action_cobol condition SQLERROR SQLWARNING NOT FOUND NOTFOUND condition_action_cobol CONTINUE DO CONTINUE DO BREAK DO do_stmt STOP GO TO label GOTO 구성요소 whenever_statement_cobol 구성요소 condition 에러나경고또는결과로우가없는등의예외상황을명시한다. 제 5 장 tbesql/cobol 문장 97

구성요소 condition_action_cobol 예외상황이발생했을경우그에따른대처방법을명시한다. condition 구성요소 SQLERROR SQLWARNING NOT FOUND 에러가발생한경우이다. 경고가발생한경우이다. 질의결과로우가없거나커서를사용해읽을로우가더이상없는경우이다. 또는 NOTFOUND condition_action_cobol 구성요소 CONTINUE DO CONTINUE DO BREAK DO do_stmt STOP GOTO label 다음라인부터프로그램을계속진행한다. 루프내에서 CONTINUE를실행한다. 루프내에서 BREAK를실행한다. COBOL 프로그래밍언어로작성한에러처리문장을수행한다. 현재트랜잭션을롤백하고프로그램을정지한다. 해당 label이있는곳으로이동하여프로그램을진행한다. 예제 다음은 WHENEVER 를사용하는예이다. EXEC SQL WHENEVER NOT FOUND GOTO FETCH-END EXEC SQL WHENEVER SQLERROR DO PERFORM SQLERROR EXEC SQL WHENEVER SQLWARNING CONTINUE 98 Tibero tbesql/cobol 안내서

제 6 장 tbesql/cobol 프리컴파일러옵션 본장에서는 tbesql/cobol 프리컴파일러를동작시킬때사용할수있는옵션에대해한다. 6.1. 개요 tbesql/cobol 프리컴파일러옵션은프리컴파일러를동작시킬때, 프리컴파일러가추가적인기능을수 행하도록설정하기위해서사용된다. 우선먼저프리컴파일러를사용하려면, 다음과같이입력한다. [ 예 6.1] tbesql/cobol 프리컴파일실행 tbpcb test1.tbco 위예를보면 tbpcb 유틸리티를통해프리컴파일을실행하게된다. 'test1.tbco' 은프리컴파일을실행할대상파일의이름이다. 프리컴파일을실행할때, 대상파일의확장자가 '.tbco' 일경우확장자를생략하고사용해도무방하다. 여기서 'test1.tbco' 는 tbesql/cobol에서제공하는프리컴파일러의옵션중하나인 INAME에해당한다. 모든프리컴파일러의옵션중에서옵션의이름을생략할수있는것은 INAME 하나뿐이다. 따라서, INAME을생략하지않고, 다음과같이사용해도위의예와동일한의미를갖는다. tbpcb INAME=test1.tbco 다음은 INAME 과 INCLUDE 옵션을사용한예이다. [ 예 6.2] tbesql/cobol 프리컴파일러의옵션을사용한프리컴파일실행 tbpcb test1.tbco INCLUDE=/home/tibero/include 위의예는 tbesql/cobol에서제공하는프리컴파일러옵션을두개를함께사용한것이다. 앞서언급했듯이 'INAME=' 은생략할수있다. INCLUDE 옵션은 'test1.tbco' 안에서사용된각종 COPY, ESQL INCLUD 파일이같은디렉터리에있지않을경우프리컴파일을실행할때에러를발생하게된다. 따라서이런파일들이존재하는디렉터리를지정해줄때사용하는옵션이다. 제 6 장 tbesql/cobol 프리컴파일러옵션 99

6.2. tbesql/cobol 프리컴파일러옵션의지정 프리컴파일러옵션은명령프롬프트에서직접입력할수도있지만, 환경설정파일이나프로그램내부에서도지정할수있다. 옵션의종류에따라지정할수있는장소가다르다. 어떤곳에서도옵션을지정하지않았을경우디폴트값이적용된다. 옵션이적용되는순서는다음과같다. 1. 기본값 2. 환경설정파일 3. 명령프롬프트 4. 프로그램내부 하나의항목만을허용하는동일한한가지옵션에여러번에걸쳐다른항목이지정되었을경우, 항상마지막에지정된내용만유효하다. 또한, 옵션을프로그램내부에서지정할경우옵션의영향범위는 COBOL 프로그래밍언어의문법에서의변수의영향범위와는무관하다. 무조건프로그램의소스코드의진행순서에서가장마지막에지정된옵션이적용된다. INAME의경우는다른옵션과달리, 두번이상 INAME이나타날경우에러가발생한다. 6.2.1. 환경설정파일 옵션을지정할때, 환경설정파일을사용하는방법에는다음의두가지가있다. 기본환경설정파일 tbesql/cobol에서는기본적으로 tbpcb.cfg라는환경설정파일을 $TB_HOME/client/config 디렉터리에두고있다. 이환경설정파일을수정해서원하는옵션을지정할수있다. 만약별도의환경설정파일이지정되지않으면 tbpcb 유틸리티는자동으로이환경설정파일을먼저읽는다. 다음은 tbpcb.cfg 파일을사용하여프리컴파일러옵션을지정하는예이다. #INCLUDE=$TB_HOME/demo/chb/new_src/OV INCLUDE=$TB_HOME/client/include DYNAMIC=ANSI 위의예에서처럼 # 을이용해서행전체에대해주석처리를할수있다. 환경설정파일에서도하나의항목만허용하는옵션이두번이상나타났을경우마지막에지정된옵션이적용된다. 100 Tibero tbesql/cobol 안내서

사용자환경설정파일 사용자가환경설정파일을임의로생성하여사용할수도있다. 파일의위치와파일의이름등을사용자가임의로정할수있다. 이경우명령프롬프트를통해사용할환경설정파일을지정한다. 이렇게환경설정파일을지정하면, tbpcb.cfg 파일은사용되지않는다. 다음은사용자환경설정파일을지정하는예이다. tbpcb test1.tbco CONFIG=config1.cfg 6.2.2. 명령프롬프트 tbesql/cobol 프리컴파일러옵션은명령프롬프트에서지정할수도있다. 명령프롬프트에서는다음과같은형태로옵션을지정할수있다. [OPTION_NAME=value] 다음은명령프롬프트에서프리컴파일러옵션을지정하는예이다. tbpcb test1.tbco CHAR_MAP=STRING SELECT_ERROR=NO 6.2.3. 프로그램내부 프로그램내부에서도프리컴파일러옵션을지정할수있다. 이방법은프리컴파일을실행하는도중에옵션을변경하고자할때유용하게사용할수있다. 또한운영체제에따라입력할수있는글자길이의제한으로인해명령프롬프트에서옵션을지정할수없는경우가있다. 이러한경우, 환경설정파일을사용할수도있지만프로그램내부에서옵션을지정할수도있다. 프로그램내부에서는다음과같은형태로옵션을지정할수있다. EXEC TIBERO OPTION (OPTION_NAME=value) 프로그램내부에서프리컴파일러의옵션을지정할때, 한가지주의할점은프로그램내부에서지정한옵션은 COBOL 프로그래밍언어의문법에따른변수의영향범위와는전혀무관하다는것이다. 즉, EXEC TIBERO OPTION으로프로그램내부에준옵션값은소스프로그램에서그문장이후에나오는 tbesql/cobol 문장에만영향을미친다. 예를들면다음과같다.... EXEC TIBERO OPTION (HOLD_CURSOR=NO) 제 6 장 tbesql/cobol 프리컴파일러옵션 101

.../* 이부분에서는어떠한 COBOL 프로그래밍언어의문법이있더라도그영향범위와는무관하게 모든 tbesql/cobol 의 HOLD_CURSOR 옵션값은 NO 이다. */ EXEC TIBERO OPTION (HOLD_CURSOR=YES).../* 이부분에서는어떠한 COBOL 프로그래밍언어의문법이있더라도그영향범위와는무관하게 모든 tbesql/cobol 의 HOLD_CURSOR 옵션값은 YES 이다. */ 6.3. tbesql/cobol 프리컴파일러옵션의목록 본절에서는 Tibero 에서제공하는프리컴파일러옵션을알파벳순으로한다. 다음은 tbesql 프리컴파일러옵션을요약한목록이다. 옵션 CLOSE_ON_COMMIT CONFIG DYNAMIC HOLD_CURSOR INAME INCLUDE MODE ONAME PREFETCH RELEASE_CURSOR SELECT_ERROR SQLCHECK TYPE_CODE UNSFE_NULL USERID 커밋할때커서를닫을것인가를지정한다. 옵션이기록될환경설정파일을지정한다. Dynamic SQL 문장의타입을지정한다. 커서가닫힌후커서정보를유지할것인가를지정한다. 프리컴파일을실행할파일의이름을지정한다. COPY, ESQL INCLUDE 파일의경로를지정한다. 프로그램이전반적으로 Tibero의형식을따를것인가아니면 ANSI의기준을따를것인가를지정한다. 출력파일의이름지정한다. 프로그램의속도향상을위해몇개의로우를미리가져올지지정한다. 커서가닫힌후커서정보의해제여부를지정한다. 주어진수보다많은로우가결과로나왔을때에러를발생시킬것인가의여부를지정한다. SQL 문장의내용을어느범위까지검사할것인가를지정한다. Dynamic SQL 문장의방법 4를사용하는방법을지정한다. 지시자변수가없어도 NULL 값을허용할것인가를지정한다. SQLCHECK가 SEMANTICS으로지정되었을때, 서버에접속하기위한사용자정보를지정한다. 102 Tibero tbesql/cobol 안내서

6.3.1. CLOSE_ON_COMMIT CLOSE_ON_COMMIT 은커밋을할때커서를닫을것인가아니면닫지않을것인가를지정하는옵션이 다. CLOSE_ON_COMMIT 의세부내용은다음과같다. 문법 CLOSE_ON_COMMIT={YES NO} 항목 YES NO EXEC SQL COMMIT을실행할때에해당트랜잭션이처리되는동안에열려있던커서를자동으로닫는다. EXEC SQL CLOSE cursor_name을사용해서사용자가직접열린커서를닫아야한다. ( 기본값 ) 지정장소 환경설정파일, 명령프롬프트 6.3.2. CONFIG CONFIG 는옵션이기록될환경설정파일을지정하는옵션이다. CONFIG 의세부내용은다음과같다. 문법 CONFIG=filename 항목 filename 옵션이기록될환경설정파일의이름을명시한다. ( 기본값 : $TB_HOME/client/config 디렉터리의 tbpcb.cfg 파일 ) 지정장소 명령프롬프트 제 6 장 tbesql/cobol 프리컴파일러옵션 103

6.3.3. DYNAMIC DYNAMIC 은 Dynamic SQL 문장의타입을지정하는옵션이다. DYNAMIC 의세부내용은다음과같다. 문법 DYNAMIC={ANSI ISO TIBERO ORACLE} 항목 ANSI ISO TIBERO ANSI 타입의동적 SQL을사용하도록지정한다. 이옵션값이지정되었을경우 Tibero 타입의동적 SQL을사용하면프리컴파일러에서문법에러를발생한다. ANSI와같은결과를갖는다. Tibero 타입의동적 SQL을사용하도록지정한다. ( 기본값 ) 이옵션값이지정되었을경우, ANSI 타입의동적 SQL 을사용하면프리컴파일러에 서문법에러를발생한다. ORACLE TIBERO 와같은결과를갖는다. ANSI 타입과 ISO 타입은실제로동작방법이완전히일치한다. 또한 TIBERO 타입과 ORACLE 타입도 동작방법이같다. 지정장소 환경설정파일, 명령프롬프트 6.3.4. HOLD_CURSOR HOLD_CURSOR 는커서가닫힌후커서정보를유지할것인가를지정하는옵션이다. HOLD_CURSOR 의세부내용은다음과같다. 문법 HOLD_CURSOR={YES NO} 항목 YES NO 커서가닫힌후커서의정보를유지한다. 커서가닫힌후커서의정보를삭제한다. ( 기본값 ) 104 Tibero tbesql/cobol 안내서

지정장소 명령프롬프트, 프로그램내부 6.3.5. INAME INAME 은프리컴파일을실행할대상파일을지정하는옵션이다. INAME 의세부내용은다음과같다. 문법 INAME=filename 다음은 INAME 의항목에대한이다. 항목 filename 프리컴파일을실행할대상파일의이름을명시한다. ( 기본값은없음 ) 지정장소 명령프롬프트 사용법 파일의이름을지정할때 INAME= 부분과파일의확장자가 tbco 일경우.tbco 도생략할수있다. 따라서, 다음의예는모두같은의미이다. tbpcb INAME=test1.tbco tbpcb test1.tbco tbpcb test1 6.3.6. INCLUDE INCLUDE는 COPY, ESQL INCLUDE 파일이위치한경로를지정하는옵션이다. 프로그램소스내부에사용된 COPY, ESQL INCLUDE 파일이같은디렉터리에있지않은경우, 프리컴파일할때에러가발생한다. 따라서, COPY, ESQL INCLUDE 파일이존재하는디렉터리를지정해주어야하며, 그때이옵션을사용한다. INCLUDE 의세부내용은다음과같다. 문법 제 6 장 tbesql/cobol 프리컴파일러옵션 105

INCLUDE=pathname 항목 pathname COPY, ESQL INCLUDE 파일이존재하는디렉터리를명시한다. ( 기본값은없음 ) 지정장소 환경설정파일, 명령프롬프트 6.3.7. MODE MODE는 tbesql/cobol 프로그램이전반적으로 Tibero의형식을따를것인지아니면, ANSI의기준을따를것인지를지정하는옵션이다. 이옵션은여러가지옵션을한꺼번에지정해주는역할을한다. 이옵션으로 CLOSE_ON_COMMIT, DYNAMIC, TYPE_CODE 등의옵션값을한꺼번에지정할수있으며, 추가로다른조건을지정할수도있다. MODE 의세부내용은다음과같다. 문법 MODE={ANSI ISO TIBERO ORACLE} 항목 ANSI ISO TIBERO ANSI 타입의동적 SQL을사용하도록지정한다. 이옵션값이지정되었을경우 Tibero 타입의동적 SQL을사용하면프리컴파일러에서문법에러를발생한다. ANSI와같은결과를갖는다. Tibero 타입의동적 SQL을사용하도록지정한다. ( 기본값 ) 이옵션값이지정되었을경우, ANSI 타입의동적 SQL 을사용하면프리컴파일러에 서문법에러를발생한다. ORACLE TIBERO 와같은결과를갖는다. 다음은 MODE 옵션에지정된값에따라설정되는세부옵션이다. 옵션 CLOSE_ON_COMMIT DYNAMIC TYPE_CODE ANSI YES ANSI ANSI TIBERO NO TIBERO TIBERO ANSI 는 ISO 와, TIBERO 는 ORACLE 과동일한기능을한다. 106 Tibero tbesql/cobol 안내서

지정장소 환경설정파일, 명령프롬프트 6.3.8. ONAME ONAME 은프리컴파일러의결과물로나오는출력파일의이름을지정하는옵션이다. ONAME 의세부내용은다음과같다. 문법 ONAME=filename 항목 filename 원하는출력파일의이름을명시한다. 기본값은입력된파일이름에서확장자만.cob 로바꾼다. 지정장소 환경설정파일, 명령프롬프트 6.3.9. PREFETCH PREFETCH 는속도향상을위해몇개의로우를미리가져올지를지정하는옵션이다. PREFETCH 의세부내용은다음과같다. 문법 PREFETCH=integer 항목 integer 미리가져올로우의개수를지정한다. ( 기본값 : 1) 지정장소 환경설정파일, 명령프롬프트 제 6 장 tbesql/cobol 프리컴파일러옵션 107

6.3.10. RELEASE_CURSOR RELEASE_CURSOR 는커서가닫힌후커서에저장된정보의해제여부를지정하는옵션이다. RELEASE_CURSOR 의세부내용은다음과같다. 문법 RELEASE_CURSOR={YES NO} 항목 YES NO 커서가닫히면커서의정보를해제한다. 커서가닫혀도커서의정보를해제하지않는다. ( 기본값 ) 지정장소 명령프롬프트, 프로그램내부 6.3.11. SELECT_ERROR SELECT_ERROR 는호스트변수등으로인해주어진수행결과개수보다실제로질의를수행한결과가 더많이반환된경우, 에러를발생시킬것인가를지정하는옵션이다. SELECT_ERROR 의세부내용은다음과같다. 문법 SELECT_ERROR={YES NO} 항목 YES NO 더많은로우가반환되었을경우, 에러를발생시킨다. ( 기본값 ) 더많은로우가반환되어도에러를발생시키지않는다. 지정장소 명령프롬프트, 프로그램내부 사용법 다음은 tbesql/cobol 프로그램의예이다. 01 EMPNO PIC X(4). 01 PNO PIC X(4). 108 Tibero tbesql/cobol 안내서

EXEC SQL SELECT EMPNUM, PNUM INTO :EMPNO, :PNO FROM WORKS WHERE EMPNUM = 'E3' 위예에서만약질의를수행한결과가더많은로우를반환하는경우, SELECT_ERROR 옵션에지정된값에따라다음과같이나타나는결과가다르다. 항목 YES NO 결과 ERROR_ESQL_TOO_MANY_ROW_IN_SELECT 에러가발생한다. 수행된질의결과의첫번째로우를호스트변수에할당한다. 이때에러는발생하지않는다. 6.3.12. SQLCHECK SQLCHECK 는 tbesql/cobol 문장의내용을어느범위까지검사할것인가를지정하는옵션이다. SQLCHECK 의세부내용은다음과같다. 문법 SQLCHECK={SEMANTICS FULL SYNTAX} 항목 SEMANTICS SEMANTICS 로지정되면, 프리컴파일러는서버에접속을시도한다. 따라서 SEMAN TICS 로설정하기위해서는 USERID 옵션이반드시필요하다. 접속이성공하면프리컴파일러는 SQL 문장을서버로보내문법뿐만아니라 SQL 문장이참조하는스키마객체의내용까지검사하며, 컬럼의타입정보등을바탕으로올바른타입끼리호스트변수에바인딩되는지도검사한다. tbesql/cobol 문장뿐만아니라 DDL이나 PSM일경우에도문법과내용을모두검사한다. FULL SYNTAX SEMANTICS 와동일한의미를갖는다. tbpcb 유틸리티는서버에접속하지않고자체적으로 ESQL 문법과 SQL 문법을검사 한다. ( 기본값 ) 지정장소 명령프롬프트, 프로그램내부 제 6 장 tbesql/cobol 프리컴파일러옵션 109

6.3.13. TYPE_CODE TYPE_CODE 는 Dynamic SQL 문장을사용하는방법중에방법 4 를사용하는방법을지정하는옵션이다. TYPE_CODE 의세부내용은다음과같다. 문법 TYPE_CODE={ANSI ISO TIBERO ORACLE} 항목 ANSI ISO TIBERO ANSI 타입의동적 SQL을사용하도록지정한다. 이옵션값이지정되었을경우 Tibero 타입의동적 SQL을사용하면프리컴파일러에서문법에러를발생한다. ANSI와같은결과를갖는다. Tibero 타입의동적 SQL을사용하도록지정한다. ( 기본값 ) 이옵션값이지정되었을경우, ANSI 타입의동적 SQL 을사용하면프리컴파일러에 서문법에러를발생한다. ORACLE TIBERO 와같은결과를갖는다. ANSI 타입은 ISO 타입과동작방법이동일하며, TIBERO 타입은 ORACLE 타입과동작방법이동일하 다. 지정장소 환경설정파일, 명령프롬프트 6.3.14. UNSAFE_NULL UNSAFE_NULL 은지시자변수가없을때, NULL 값을허용할것인지의여부를지정하는옵션이다. NULL 데이터가예상되는경우에도편의상지시자변수사용을생략하고싶을때이옵션을사용한다. UNSAFE_NULL 의세부내용은다음과같다. 문법 UNSAFE_NULL={YES NO} 항목 YES NO NULL을허용한다. 지시자변수없이 NULL 데이터를호스트변수로받아도에러는발생하지않는다. NULL을허용하지않는다. ( 기본값 ) 110 Tibero tbesql/cobol 안내서

항목 지시자변수없이 NULL 데이터를호스트변수로받으면 1405 에러를발생한다. 1405 에러는가져온데이터가 NULL이나지시자변수가존재하지않아 tbesql/cobol 런타임라이브러리가개발자에게 NULL 값의존재여부를알려줄방법이없을경우발생되는에러이다. 지정장소 환경설정파일, 명령프롬프트 6.3.15. USERID USERID 는서버접속을할때필요한사용자계정의정보를지정하는옵션이다. 이옵션은 SQL 문장의내 용을검사하기위한접속정보일뿐이며, 실제데이터베이스를실행할때의접속정보와는무관하다. USERID 의세부내용은다음과같다. 문법 USERID=username/password 항목 username password 사용자의이름을명시한다. 사용자의패스워드를명시한다. 지정장소 명령프롬프트 사용법 SQLCHECK 를 SEMANTICS 나 FULL 로지정할경우반드시이옵션을사용해야한다. 제 6 장 tbesql/cobol 프리컴파일러옵션 111

색인 A ALLOCATE DESCRIPTOR, 64 ARRAY VARIABLE, 43 AT 절, 60 B BLOB, 8 C CHAR, 8, 9, 10 CLOB, 8 CLOSE, 65 CLOSE_ON_COMMIT - tbesql/cobol 프리컴파일러옵션, 103 COMMIT, 66 CONFIG - tbesql/cobol 프리컴파일러옵션, 103 CONNECT, 67 CURRENT OF 절, 35 D DATE, 8, 9, 10 DEALLOCATE DESCRIPTOR, 69 DECLARE CURSOR, 69 DECLARE DATABASE, 71 DECLARE 영역, 12, 21 DELETE, 32, 71 DESCRIBE, 73 DESCRIBE DESCRIPTOR, 74 DESCRIPTOR 이름, 61 DYNAMIC - tbesql/cobol 프리컴파일러옵션, 104 E Embedded SQL, 1 ESQL, 1 EXECUTE, 75 EXECUTE DESCRIPTOR, 77 EXECUTE IMMEDIATE, 78 F FETCH, 33, 46, 79 FETCH DESCRIPTOR, 82 FLOAT, 8 FOR UPDATE 절, 35 FOR 절, 55, 61 G GET DESCRITPOR, 83 H HOLD_CURSOR - tbesql/cobol 프리컴파일러옵션, 104 I INAME - tbesql/cobol 프리컴파일러옵션, 105 INCLUDE - tbesql/cobol 프리컴파일러옵션, 105 INDICATOR, 17 INSERT, 30, 86 INTEGER, 8 INTO 절, 28 L LOCK, 35 M MODE - tbesql/cobol 프리컴파일러옵션, 106 N NUMBER, 8, 9, 10 O ONAME - tbesql/cobol 프리컴파일러옵션, 107 OPEN, 33, 87 P Precision, 2 Precompile, 5 색인 113

Precompiler, 5 PREFETCH - tbesql/cobol 프리컴파일러옵션, 107 PREPARE, 89 R RAW, 8, 9 RAWID, 9, 10 RELEASE_CURSOR - tbesql/cobol 프리컴파일러옵션, 108 ROLLBACK, 91 ROWID, 8, 13 S SAVEPOINT, 92 Scale, 2 Scrollable Cursors, 38 SELECT, 28, 93 SELECT_ERROR - tbesql/cobol 프리컴파일러옵션, 108 SET DESCRIPTOR, 94 SET 절, 31 SQLCA, 25 SQLCHECK - tbesql/cobol 프리컴파일러옵션, 109 STRUCTURAL ARRAY VARIABLE, 56 STRUCTURAL INDICATOR, 19 T tbertl 라이브러리, 24 tbesql/cobol Statement, 1, 59 tbesql/cobol 문장, 1, 59 ALLOCATE DESCRIPTOR, 64 AT 절, 60 CLOSE, 65 COMMIT, 66 CONNECT, 67 DEALLOCATE DESCRIPTOR, 69 DECLARE CURSOR, 69 DECLARE DATABASE, 71 DELETE, 71 DESCRIBE, 73 DESCRIBE DESCRIPTOR, 74 DESCRIPTOR 이름, 61 EXECUTE, 75 EXECUTE DESCRIPTOR, 77 EXECUTE IMMEDIATE, 78 FETCH, 79 FETCH DESCRIPTOR, 82 FOR 절, 61 GET DESCRITPOR, 83 INSERT, 86 OPEN, 87 PREPARE, 89 ROLLBACK, 91 SAVEPOINT, 92 SELECT, 93 SET DESCRIPTOR, 94 UPDATE, 95 WHENEVER, 97 tbesql/cobol 프리컴파일러옵션, 99 CLOSE_ON_COMMIT, 103 CONFIG, 103 DYNAMIC, 104 HOLD_CURSOR, 104 INAME, 105 INCLUDE, 105 MODE, 106 MODE 옵션의세부설정, 106 ONAME, 107 PREFETCH, 107 RELEASE_CURSOR, 108 SELECT_ERROR, 108 SQLCHECK, 109 TYPE_CODE, 110 UNSAFE_NULL, 110 USERID, 111 tbesql/cobol 프리컴파일러옵션의목록, 102 tbesql/cobol문장의목록, 63 tbesql/c의데이터타입, 9 tbpcb, 99 Tibero, xi Tibero의데이터타입, 7 TIME, 8, 9, 10 TIMESTAMP, 8, 9, 10 TYPE_CODE - tbesql/cobol 프리컴파일러옵션, 110 114 Tibero tbesql/cobol 안내서

U UNSAFE_NULL - tbesql/cobol 프리컴파일러옵션, 110 UPDATE, 31, 95 USERID - tbesql/cobol 프리컴파일러옵션, 111 V VARCHAR, 8, 9, 10, 14 W WHENEVER, 25, 97 WHERE 절, 29, 31, 32 ㄱ 구조체, 4, 16 구조체배열변수, 56 구조체타입의지시자, 19 ㄴ 날짜형, 7 내장 SQL, 1 내재형, 7 ㄷ 대용량객체형, 7 데이터타입의대응, 9 ㅁ 문자형, 7 ㅂ 배열변수, 4, 43, 44 ㅇ 입 / 출력변수, 12 입력배열변수, 43 입력변수, 3, 15, 29 ㅈ 잠금, 35 정밀도, 2, 8 주석, 22 지시어, 59 지시자, 17 ㅊ 출력배열변수, 43 출력변수, 3, 15, 28 ㅋ 커서, 5, 33, 46 ㅍ 표데이터타입의변환, 10 프리컴파일, 5 프리컴파일러, 5 프리컴파일러옵션프리컴파일러옵션의지정장소와영향범위, 100 프리컴파일러옵션지정방법명령프롬프트, 101 프로그램내부, 101 환경설정파일, 100 ㅅ 상태변수, 25 숫자형, 7 스케일, 2, 8 스크롤가능커서, 38, 69 실행문장, 59 색인 115