90
Proc*C 기기 Style System 기기기

Proc*C 기초

  • Upload
    aspen

  • View
    81

  • Download
    6

Embed Size (px)

DESCRIPTION

Proc*C 기초. Style System 김도형. 강의목표. Pro*C/C++ 에 대한 개념을 이해 할수 있다 Embedded SQL 을 사용할 수 있다 Cursor 를 사용할 수 있다 Embedded PL/SQL 을 사용할 수 있다 Procedure 를 호출 할 수 있다 Error Handling 을 할 수 있다 개인적으로 Pro*C/C++ 를 공부할수 있는 토대를 마련할 수 있다. 강의에서 다루지 않는 내용. Dynamic Cursor Savepoint Large Object: LOB - PowerPoint PPT Presentation

Citation preview

Page 1: Proc*C  기초

Proc*C 기초

Style System

김도형

Page 2: Proc*C  기초

강의목표

Pro*C/C++ 에 대한 개념을 이해 할수 있다Embedded SQL 을 사용할 수 있다

Cursor 를 사용할 수 있다Embedded PL/SQL 을 사용할 수 있다

Procedure 를 호출 할 수 있다Error Handling 을 할 수 있다개인적으로 Pro*C/C++ 를 공부할수 있는

토대를 마련할 수 있다

Page 3: Proc*C  기초

강의에서 다루지 않는 내용

Dynamic CursorSavepointLarge Object: LOBCollectionPro*C++Compile OptionMulti ThreadHost Array

Page 4: Proc*C  기초

Pro*C 란

Oracle 사에서 C/C++ 를 기반으로하여 내장 SQL 문을 사용할 수 있도록 개조된 언어

Pro*C 로 작성된 Source Code 는 Oracle Pro*C/C++ Precompiler 에 의해 보통의 C/C++ Source Code 로 해석 입력 : 내장 SQL 을 포함하는 .pc 파일출력 : 오라클 라이브러리를 호출하는 .c 혹은

.cpp 파일

Page 5: Proc*C  기초

Pro*C/C++ Precompiler 에 대해

High Level Language Source 에 내장 SQL문을 사용 가능하게 하는 Programming Tool

Page 6: Proc*C  기초

Oracle Pro*C/C++ Precompiler 를 사용하는 이유Application Program 에 강력하고 유연한 SQL

문의 사용이 가능간편한 Interface 에의한 Application 으로 부터

Oracle 에의 직접 Access 가 가능C/C++ 를 사용할수 있는 곳이라면 어떤 장르의

Program 에도 적용 가능제공되는 Runtime Indicator 에 의해 Oracle 의

세밀한 감시및 조정이 가능 , 즉 Application 의 성능 향상을 꾀할수 있음

Compile Option 에 따라 내장 SQL 의 의미 분석도 가능 , 즉 SQL 의 Syntax Error 를 제거 할 수 있음

Page 7: Proc*C  기초

Window 에서의 Pro*C 의 설치 (1/4)

Oracle Programmer Component 를 설치하여야 Pro*C/C++ 를 사용할수 있음

Page 8: Proc*C  기초

Window 에서의 Pro*C 의 설치 (2/4)

bin\proc.exe 을 확인

Page 9: Proc*C  기초

Window 에서의 Pro*C 의 설치 (3/4)

precomp\public\oraca.h, precomp\public\sqlca.h 을 확인

Page 10: Proc*C  기초

Window 에서의 Pro*C 의 설치 (4/4)

precomp\lib\msvc\oraSQL9.LIB 을 확인

Page 11: Proc*C  기초

Visual C++ 의 환경 설정 (1/11)

Project Name 에 proctest( 프로젝트명 ) 를 입력

Project 생성

Page 12: Proc*C  기초

Visual C++ 의 환경 설정 (2/11)

새로운 Source File 을 추가

추가 File 종류를 C Source 로 proctest.pc 를 추가

Page 13: Proc*C  기초

Visual C++ 의 환경 설정 (3/11)

추가 File 종류를 C Source 로 proctest.c 를 추가

Proctest.pc 를 Compile 대상에서 제외 시킴

Page 14: Proc*C  기초

Visual C++ 의 환경 설정 (4/11)

Build 로 부터 제외 : はい를 선택

Build 에서 제외 된것을 확인

Page 15: Proc*C  기초

Visual C++ 의 환경 설정 (5/11)

추가 INCLUDE DIRECTORY : C:\oracle\ora92\precomp\public : header file 의 경로를 입력

DEBUG 정보 형식 : Editor Continue 용 Program DB 를 선택

Project 환경설정

Page 16: Proc*C  기초

Visual C++ 의 환경 설정 (6/11)

C:\oracle\ora92\precomp\lib\msvc : Library file 의 경로를 입력

최적화 : 無効 (/Od) 를 선택

Page 17: Proc*C  기초

Visual C++ 의 환경 설정 (7/11)

oraSQL9.LIB : Library file Name 입력

DEBUG 정보 생성 : はい (/ DEBUG) 를 선택

Page 18: Proc*C  기초

Visual C++ 의 환경 설정 (8/11)

Text Editor 의 설정

Proc proctest.pc : proc 프로젝트명 .pc 을 입력

Page 19: Proc*C  기초

Visual C++ 의 환경 설정 (9/11)

C/C++ File Extension : “;*.pc” 를 추가

Pc 를 입력후 적용을 클릭

Page 20: Proc*C  기초

Visual C++ 의 환경 설정 (10/11)

Test Source Code 의 입력Proctest.pc

Page 21: Proc*C  기초

Visual C++ 의 환경 설정 (11/11)

Project 의 Rebuild Ctrl+Alt+F7

실행결과 (Ctrl+F5)

Page 22: Proc*C  기초

내장 SQL : Host 변수

Host(Source) Program 과 Oracle 간의 Data 의 통신에 사용됨 출력 호스트 변수 (Oracle -> Host Program)

( 예 ) SELECT 에서 리턴된 데이타를 받기 위해 사용되는 변수 입력 호스트 변수 (Host Program -> Oracle)

( 예 ) INSERT 에서 입력할 데이타를 받기 위해 사용되는 변수내장 SQL 에 사용될 때는 변수명 앞에 콜론을 붙여 사용

Ex) :host_variableDECLARE SECTION 절에 정의

Ex) EXEC SQL BEGIN DECLARE SECTION; int host_variable; EXEC SQL END DECLARE SECTION;

Page 23: Proc*C  기초

내장 SQL : Host 변수

Page 24: Proc*C  기초

내장 SQL : Host 변수 : VARCHAR 형VARCHAR 을 이용해서 가변 길이

문자열을 취급할수 있음Precompiler 에 의한 VARCHAR 의 해석

VARCHAR username[20];

struct{ unsigned short len; unsigned char arr[20];} username;

Page 25: Proc*C  기초

내장 SQL : Host 변수 : INDICATOR 변수출력 Host 변수의 상태를 나타내거나 , 입력 Host

변수의 값을 설정함2 Bytes 정수로 정의됨 ex)short comm_ind; SQL 구문중 Host 변수 직후에 콜론과 함께 사용함

:host_variable INDICATOR :indicator_variable :host_variable:indicator_variable(INDICATOR Keyword

생략가능 )출력 Host 변수에서 INDICATOR 변수를 추가하지

않았을경우 Compile Option 에 따라서 Select 문의 결과가 NULL 을 포함한 Record 가 반환되면 Error 가 발생됨 -> 반드시 사용할것을 권장 ORA-01405: フェッチした列の値が NULL です。

Page 26: Proc*C  기초

내장 SQL : Host 변수 : INDICATOR 변수입력 Host 변수에 사용시

-1 : 해당 Column 에 NULL 이 설정됨 . Host 변수의 값은 무시됨

>=0 : Host 변수의 값이 해당 Column 에 설정됨출력 Host 변수에 사용시

-1 : NULL. Host 변수 값 사용 불가 ( 값 보장 못함 ) 0 : 정상 . Host 변수 값 사용 가능>0 : Host 변수 크기 부족으로 정확한 값이 셋팅되지

못함 . INDICATOR 변수의 값은 원래의 크기를 나타냄 . -2 : Host 변수 크기 부족으로 정확한 값이 셋팅되지

못함 . 원래의 크기를 알수 없음 .

Page 27: Proc*C  기초

내장 SQL : Host 변수 : 실습

Page 28: Proc*C  기초

내장 SQL : Host 변수 : 실습

실행결과

Page 29: Proc*C  기초

내장 SQL : DECLARE 문

Host 변수와 Cursor 변수를 선언Host 변수의 선언 EXEC SQL BEGIN DECLARE SECTION; int host_variable; EXEC SQL END DECLARE SECTION;Cursor 변수의 선언 EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, empno, sal FROM emp WHERE deptno = :dept_number;

Page 30: Proc*C  기초

내장 SQL : CURSOR

질의 결과가 복수의 Record 인 경우 , 한 Record 씩의 처리가 가능하도록 함 -> 복수의 질의 결과에 CURSOR 을 사용하지 않으면 Runtime Error 가 발생함

CURSOR 와 관련된 명령어들 DECLARE CURSOR OPEN FETCH CLOSE

Page 31: Proc*C  기초

내장 SQL : CURSOR : OPEN

DECLARE CURSOR 문의 정의된 커서의 질의를 실행하여 Result Set 을 생성함EX) EXEC SQL OPEN emp_cursor;

OPEN 가 실행되어도 Result Set 을 사용할 수는 없음

OPEN 에 의해 CURSOR 는 Result Set 의 처음 Record 의 바로 앞을 가리킴

한번 OPEN 된 CURSOR 는 다시 OPEN 하지 않는 이상 Result Set 을 변경하지 않음

통상 , CURSOR 를 다시 OPEN 하기전에는 CLOSE 할 필요가 있음

Page 32: Proc*C  기초

내장 SQL : CURSOR : FETCH

Result Set 으로 부터 하나의 Record 를 추출하여 , INTO 구 이후에 정의되어 있는 출력 Host 변수에 설정함

Ex) EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary;

FETCH 하기전에 OPEN 되어 있어야 함 최초로 FETCH 되면 최초 Record 의 바로 앞에 있던 CURSOR 가 첫번째

Record 로 이동 ( 현재 행이라 불리움 ) 보통의 커서는 이전 Record 로 되돌아 갈수 없음 . 이전 Record 로 되돌아

가기 위해서는 CURSOR 를 CLOSE 하고 재 OPEN 하여야 함 Result Set 이 비었거나 , 더이상 남아있는 Record 가 없는 경우 , 「データ

が見つかりません」 Error 가 발생 ( 출력 Host 변수의 내용은 보장불가 ) -> 보통 WHENEVER NOT FOUND 절로 검출하여 Program 의 흐름을 제어

다음 경우 , FETCH 는 Error 가 됨 CURSOR 를 OPEN 하기 전 「データが見つかりません」인 경우 CURSOR 를 CLOSE 한 후

Page 33: Proc*C  기초

내장 SQL : CURSOR : CLOSE

FETCH 가 끝난 CURSOR 의 Resource(Memory 등 ) 를 System 에 반환함Ex) EXEC SQL CLOSE emp_cursor;

CLOSE 후의 CURSOR 로 부터의 FETCH 는 허용되지 않음

필요에 의해 CURSOR 의 재 사용이 가능함 -> 입력 Host 변수에 값 할당후 재 OPEN 등 .

Page 34: Proc*C  기초

내장 SQL : CURSOR : 실습

Page 35: Proc*C  기초

내장 SQL : CURSOR : 실습

실행결과

Page 36: Proc*C  기초

내장 SQL : SELECT

Data Base 에 질의를 수행Ex) EXEC SQL SELECT ename, job, sal + 2000 INTO :emp_name, :job_title, :salary FROM emp WHERE empno = :emp_number;

Oracle 은 INTO 절의 출력 Host 변수에 값을 설정함

추출 Column 수와 INTO 절의 출력 Host 변수의 갯수는 일치 하여야함

질의가 복수의 Record 를 반환하는 경우에는 반드시 CURSOR 를 사용

Page 37: Proc*C  기초

내장 SQL : INSERT

Table 또는 View 에 하나의 Record 를 추가 Ex) EXEC SQL INSERT INTO emp (empno, ename, sal, deptno) VALUES

(:emp_number, :emp_name, :salary, :dept_number);VALUES 절에는정수 , Host 변수 , SQL 식 , SQL 함수

( USER 、 SYSDATE 등) , 또는 사용자 정의 PL/SQL 함수 등이 올수 있음

VALUES 절의 요소의 갯수와 INTO 절의 Column 의 갯수는 일치 하여야함

Table 에 정의 되어 있는 순서대로 , VALUES 절의 값들이 하나도 빠짐없이 존재하는 경우에는 INTO 절의 Column List 를 생략할 수 있음

Page 38: Proc*C  기초

내장 SQL : UPDATE, DELETE

UPDATETable 또는 View 의 값을 변경

Ex) EXEC SQL UPDATE emp

SET sal = :salary, comm = :commission

WHERE empno = :emp_number;

DELETETable 또는 View 로 부터 Record 를 삭제

Ex) EXEC SQL DELETE FROM emp

WHERE deptno = :dept_number ;

Page 39: Proc*C  기초

내장 SQL : INSERT : 실습

Page 40: Proc*C  기초

내장 SQL : INSERT : 실습

Page 41: Proc*C  기초

내장 SQL : INSERT : 실습

실행결과

Page 42: Proc*C  기초

내장 SQL : UPDATE : 실습

Page 43: Proc*C  기초

내장 SQL : UPDATE : 실습

Page 44: Proc*C  기초

내장 SQL : UPDATE : 실습

실행결과

Page 45: Proc*C  기초

내장 SQL : DELETE : 실습

Page 46: Proc*C  기초

내장 SQL : DELETE : 실습

Page 47: Proc*C  기초

내장 SQL : DELETE : 실습

실행결과

Page 48: Proc*C  기초

내장 SQL : WHENEVER

보통 , Precompile 된 Program 은 Oracle Error 및 경고를 무시하고 , 될수 있으면 처리를 계속함

자동으로 조건 Check 및 Error 처리를 실행 하기 위해서 WHENEVER 문을 사용

WHENEVER 사용예 Ex) EXEC SQL WHENEVER <condition> <action>;

WHENEVER 을 이용해서 , Oracle Error, SQLERROR, SQLWARNING 및 NOT FOUND 가 발생했을때의 처리를 지정함 <condition>

상기의 처리는 다음 명령문의 계속적인 실행 , 처리 루틴의 호출 , goto, Prorgam 의 종료등이 있음 <action>

Page 49: Proc*C  기초

내장 SQL : WHENEVER : <condition>

SQLWARNING : 경고 메시지가 발생한 경우

SQLERROR : 에러가 발생한 경우NOT FOUND WHERE : 절의 조건을 만족하는 행을 발견할 수 없거나 , SELECT INTO 나 FETCH 가 어떤 행도 반환하지 않은 경우

Page 50: Proc*C  기초

내장 SQL : WHENEVER : <action>

CONTINUE : 가능하면 Program 은 다음 문장을 수행함 . 디폴트 동작으로 WHENEVER 를 쓰지 않은 경우와 같음 . WHENEVER 문의 영향을 종료시키기 위해 사용 .

DO : Error 처리 함수를 수행 . Error 처리 함수 수행 후 실패한 SQL 문의 다음 문장으로 제어가 넘어감 .

DO BREAK : 실제적인 “ break” 문 . Loop 에서 사용 . <condition> 이 성립하면 Loop 를 빠짐 .

DO CONTINUE : 실제적인 “ continue” 문 . Loop 에서 사용 . <condition> 이 성립하면 다음 Loop 를 반복

GOTO label_name : label_name 로 제어 이동 . 실제적인 “ goto” 문 . label_name 의 길이 제한은 없으나 31 번째까지만 의미가 있음 .

STOP : 프로그램 수행을 종료하고 , 트랜잭션은 롤백됨 .

Page 51: Proc*C  기초

내장 SQL : WHENEVER : Scope

WHENEVER 문은 선언문이므로 , 위치에 영향을 받음 . 즉 , WHENEVER문은 Program 의 최초의 SQL 문 보다 먼저 선언 되어야 함 .

한번 선언된 WHENEVER 문은 같은 <condition> 으로 새로운 WHENEVER 문이 선언되기 전까지 유효함 .

Ex)step1:EXEC SQL WHENEVER SQLERROR STOP;EXEC SQL CONNECT :username IDENTIFIED BY :password;...goto step3;step2:EXEC SQL WHENEVER SQLERROR CONTINUE;EXEC SQL UPDATE emp SET sal = sal * 1.10;...step3:EXEC SQL DROP INDEX emp_index;...

Page 52: Proc*C  기초

내장 SQL : WHENEVER : DO

...EXEC SQL WHENEVER SQLERROR DO

handle_insert_error("INSERT error");EXEC SQL INSERT INTO emp (empno, ename,

deptno)VALUES

(:emp_number, :emp_name, :dept_number);EXEC SQL WHENEVER SQLERROR DO

handle_delete_error("DELETE error");EXEC SQL DELETE FROM dept WHERE deptno

= :dept_number;...handle_insert_error(char *stmt){ switch(sqlca.sqlcode) { case -1: /* duplicate key value */ ... break; case -1401: /* value too large */ ... break;

default: /* do something here too */ ... break; }}handle_delete_error(char *stmt){ printf("%s¥n¥n", stmt); if (sqlca.sqlerrd[2] == 0) { /* no rows deleted */ ... } else { ... } ...}

Page 53: Proc*C  기초

내장 SQL : WHENEVER : DO BREAK / DO CONTINUE#include <sqlca.h>#include <stdio.h>main(){ char *uid = "scott/tiger"; struct { char ename[12]; float sal; float

comm; } emp;

EXEC SQL WHENEVER SQLERROR GOTO whoops;

EXEC SQL CONNECT :uid; EXEC SQL DECLARE c CURSOR FOR

SELECT ename, sal, comm FROM EMP ORDER BY ENAME ASC;

EXEC SQL OPEN c;

EXEC SQL WHENEVER NOT FOUND DO BREAK;

EXEC SQL WHENEVER SQLERROR DO CONTINUE;

while (1) { EXEC SQL FETCH c INTO :emp;

printf("%s %7.2f %9.2f¥n", emp.ename, emp.sal, emp.comm);

}

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL CLOSE c; exit(EXIT_SUCCESS);whoops: printf("%.*s¥n", sqlca.sqlerrm.sqlerrml,

sqlca.sqlerrm.sqlerrmc); exit(EXIT_FAILURE);}

Page 54: Proc*C  기초

내장 SQL : WHENEVER : 실습

Page 55: Proc*C  기초

내장 SQL : WHENEVER : 실습

Page 56: Proc*C  기초

내장 SQL : WHENEVER : 실습

실행결과 (2 번 실행시킨 경우 )

Page 57: Proc*C  기초

내장 SQL : SQLCA

SQLCA 은 구조체SQLCA 의 멤버변수들은 , SQL 문이

실행될때마다 Oracle 에 의해 갱신됨 . 항상 가장 최근에 실행된 SQL 의 실행결과의

Error, 경고 , 상태 정보등을 보유SQLCA 를 사용하기 위해서는 아래의 정의를

기술해야함EXEC SQL INCLUDE SQLCA; 또는#include <sqlca.h>

Page 58: Proc*C  기초

내장 SQL : SQLCA

struct sqlca{ char sqlcaid[8]; /* "SQLCA" 문자 스트링 */ long sqlabc; /* slqca 구조체의 길이 */ long sqlcode; /* 에러코드 */ struct { unsigned short sqlerrml; /* 에러 메시지 길이 */ char sqlerrmc[70]; /* 에러 메시지 내용 */ } sqlerrm; char sqlerrp[8]; /* reserved */ long sqlerrd[6]; /* sqlerrp[0] : reserved sqlerrp[1] : reserved sqlerrd[2] : 수행된 행의 개수

Page 59: Proc*C  기초

내장 SQL : SQLCA

sqlerrd[3] : reserver sqlerrd[4] : 파싱 에러 옵셋 sqlerrd[5] : reserved */ char sqlwarn[8]; /* sqlwarn[0] : 경고 플래그 sqlwarn[1] : 문자스트링이 절단된 경우 sqlwarn[2] : 안쓰임 . sqlwarn[3] : SELECT 문에서 필드 개수와

INTO 문의 호스트 변수 개수가일치하지 않음 sqlwarn[4] : DELETE 또는 UPDATE 문에서

where 절이 없음 . sqlwarn[5] : reserved sqlwarn[6] : 안쓰임 . sqlwarn[7] : 안쓰임 . */ char sqlext[8]; /* reserved */};

Page 60: Proc*C  기초

내장 SQL : SQLCA

sqlcode : 최후에 실행된 SQL 문의 상태코드가 저장됨 .

값의 의미 0 : 성공>0 : SQL 은 실행되었지만 , 열외가 발생한 경우 .

WHERE 절에 만족하는 행이 없는 경우 , 또는 SELECT INTO 또는 FETCH 문에서 반환된 행이 없는 경우

<0 : Database, System, Network 또는 Application 의 Error 가 원인으로 SQL 이 실행되지 못함 . 치명적 Error. 대부분의 경우 Transaction 은 Rollback 됨 .

Page 61: Proc*C  기초

내장 SQL : SQLCA

Sqlerrm : 직전에 실행된 SQL 이 Error인 경우 Error Message 가 저장됨

필드의 의미 sqlerrml : sqlerrmc 에 저장되어 있는 문자열의

길이sqlerrmc : sqlcode 내에 저장되어 있는 Error

Code 에 대한 Text Message 가 저장됨 . 문자열은 NULL 로 종료하지 않으므로 sqlerrml에서 길이를 확인할 필요가 있음

Ex) sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml]='₩0'; printf("%s", sqlca.sqlerrm.sqlerrmc);

Page 62: Proc*C  기초

내장 SQL : SQLCA : 실습

Page 63: Proc*C  기초

내장 SQL : SQLCA : 실습

실행결과 (2 번 실행시킨 경우 )

Page 64: Proc*C  기초

내장 SQL : CONNECT

Data 를 질의하거나 조작하기전에 Pro*C/C++ Program 을 Database 에 접속시켜야함

Database 에 Login 하기위해 CONNECT 을 사용함Ex) EXEC SQL CONNECT :username IDENTIFIED

BY :password ;EXEC SQL CONNECT :usr_pwdusername 및 password 는 문자형 Host 변수임Host 변수 usr_pwd 는 /(slash) 로 구분된 Username,

Password 를 포함

Page 65: Proc*C  기초

내장 SQL : CONNECT

원격에서 오라클 서버를 접속하려면 , 먼저 tnsname.ora 파일을 편집

tnsname.ora 는 C:\oracle\ora92\network\ADMIN 에 위치함 .(Version 에 따라 차이가 있음 )Ex)

BATCH_UT =( DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))

(CONNECT_DATA = (SERVICE_NAME = VPMS))

)

Page 66: Proc*C  기초

내장 SQL : CONNECT

EX)char username[10] = "scott";

char password[10] = "tiger";

char db_string[20] = “BATCH_UT";

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :db_string;

Page 67: Proc*C  기초

내장 SQL : CONNECT

Page 68: Proc*C  기초

내장 SQL : COMMIT

Program 에서 COMMIT 또는 ROLLBACK 을 사용하지 않으면 , Program 은 전체가 하나의 Transaction임 (단 , Program 에서 DDL 을 사용하면 Auto COMMIT 됨 )

COMMIT 을 사용해서 Database 의 변경을 확정 반영COMMIT 하기 전에 다른 User 는 변경된 Data 에

접근할 수 없고 , 변경 전 상태의 Data만 열람할수 있음COMMIT 되면 수행되는 작업들

현재의 Transaction 에서 변경된 사항을 Database 에 반영 변경 사항을 다른 User 가 열람할수 있게 함모든 SAVEPOINT 를 삭제함 모든 Record 및 Table 의 lock 을 해제함모든 Cursor 를 해제함 Transaction 을 종료함

Page 69: Proc*C  기초

내장 SQL : COMMIT

COMMIT 문은 Host 변수및 Program 의 흐름에 영향을 주지 않음

Program 을 종료하기 전에 COMMIT 할 필요가 있음 . 그렇지 않으면 변경되었던 Data 는 Rollback 됨

다음 예제는 Transaction 을 COMMIT 하고 , Database의 연결을 해제함 Ex) EXEC SQL COMMIT WORK RELEASE;

RELEASE Keyword 를 사용하므로써 , Program 에서 사용했던 Oracle Resource(Lock, Cursor 등 ) 를 전부 해제하고 , Database 와의 연결을 종료함 .

DDL 문은 실행되기 전과 후에 Auto COMMIT 되므로 , DDL 문 다음에 COMMIT 을 기술할 필요는 없음 . 따라서 , DDL 문의 실행이 성공하거나 실패하거나 결과에 관계없이 그전까지 Transaction 은 COMMIT 됨에 주의

Page 70: Proc*C  기초

내장 SQL : COMMIT

Page 71: Proc*C  기초

내장 SQL : ROLLBACK

ROLLBACK 문을 사용하면 Database 에 대한 현재까지의 변경을 취소할수 있음

TO SAVEPOINT 절을 사용하면 현재의 Transaction 의 처음이 아닌 중간까지 되돌리는 것이 가능함

불완전한 Transaction 을 원래대로 되돌리는 것이 가능하기 때문에 Database 의 정합성을 확보할수 있음

ROLLBACK 되면 수행되는 작업들 현재 Transaction 내에서 Database 에 대해 발생했던 변경이

전부 취소됨모든 SAVEPOINT 가 삭제됨 현재 Transaction 이 종료됨모든 Record 및 Table 의 Lock 이 해제됨모든 Cursor 를 해제함

Page 72: Proc*C  기초

내장 SQL : ROLLBACK

ROLLBACK 문은 Host 변수및 Program 의 흐름에 영향을 주지 않음 ROLLBACK TO SAVEPOINT 문이 수행되면 일어나는 작업들

지정된 SAVEPOINT 이후의 Database 의 변경은 전부 취소됨 지정된 SAVEPOINT 이후의 모든 SAVEPOINT 는 삭제됨 지정된 SAVEPOINT 이후에 일어난 모든 Record Lock, Table Lock 은

해제됨 다음 예제는 Transaction 을 Rollback 하고 Oracle 과의 연결을 해제함

Ex) EXEC SQL ROLLBACK WORK RELEASE; RELEASE Keyword 를 사용하므로써 , Program 에서 사용했던 Oracle

Resource(Lock, Cursor 등 ) 를 전부 해제하고 , Database 와의 연결을 종료함 .

WHENEVER SQLERROR GOTO 문으로 Error 처리 Routine 으로 분기한경우 , 그 Routine 의 ROLLBACK 문에서 Error 가 발생하면 무한 Loop 에 빠질 우려가 있음 . 무한 Loop 를 방지하기 위해 ROLLBACK 문 전에 WHENEVER SQLERROR CONTINUE 를 기술 해야 함

Page 73: Proc*C  기초

내장 SQL : ROLLBACK

Page 74: Proc*C  기초

내장 PL/SQL : PL/SQL BLOCK

Pro*C/C++ 에서는 PL/SQL Block 도 사용 가능SQL 문을 사용할 수 있는 곳이라면 어디라도

PL/SQL Block 을 사용할 수 있음PL/SQL Block 을 사용하기 위해서는 Keyword

EXEC SQL EXECUTE 및 END-EXEC; 사이에 PL/SQL Block 을 포함 시켜야함

Ex)

Page 75: Proc*C  기초

내장 PL/SQL : 실습

Page 76: Proc*C  기초

내장 PL/SQL : 실습

Page 77: Proc*C  기초

내장 PL/SQL : 실습

proc plsql.pc SQLCHECK=SEMANTICS userid=scott/tiger@BATCH_UT

Page 78: Proc*C  기초

내장 PL/SQL : 실습

실행결과

Page 79: Proc*C  기초

내장 PL/SQL : 내장 SQL 의 비교

내장 SQL 내장 PL/SQL

Page 80: Proc*C  기초

내장 PL/SQL : 실제 사용 예

Page 81: Proc*C  기초

내장 PL/SQL : Stored PL/SQL Call 다음 예는 raise_salary 라는 이름의 Stored Procedure 를 호출

EXEC SQL EXECUTEBEGIN

raise_salary(:emp_id, :increase);END;

END-EXEC; 다음 예는 emp_actions 이란 Package 에 속하는 raise_salary

란 이름의 Stored Procedure 를 호출EXEC SQL EXECUTE

BEGINemp_actions.raise_salary(:emp_id, :increase);

END;END-EXEC;

Parameter 는 IN, OUT 두종류가 있음 내장 PL/SQL 이 포함된 Program 을 PreCompile 하는 경우에는

SQLCHECK=SEMANTICS Compile Option 을 사용해야 함

Page 82: Proc*C  기초

내장 PL/SQL : Stored PL/SQL Call : 실습

Page 83: Proc*C  기초

내장 PL/SQL : Stored PL/SQL Call : 실습

Page 84: Proc*C  기초

내장 PL/SQL : Stored PL/SQL Call : 실습

Page 85: Proc*C  기초

내장 PL/SQL : Stored PL/SQL Call : 실습

Page 86: Proc*C  기초

내장 PL/SQL : Stored PL/SQL Call : 실습

실행결과

Page 87: Proc*C  기초

내장 PL/SQL : 심화문제

주어진 emp.data 파일의 내용을 EMP table 에 추가

emp.data 파일 형식은 CSV 의 Text File내장 SQL 및 내장 PL/SQL 어느쪽을

사용해도 무방Hint :

C function : fopen, fgets, fclose, strtok, strstr, strcpy, strncpy, strcat, strcmp, strlen, sizeof

SQL : TO_DATE

Page 88: Proc*C  기초

내장 PL/SQL : 심화문제

File emp.data 의 내용9369,JANG,CLERK,7902,2008/12/17,800,,209499,BAE,SALESMAN,7698,2008/02/20,1600,300,309521,HWANG,SALESMAN,7698,2008/02/22,1250,500,

309566,PARK,MANAGER,7839,2008/04/02,2975,,209654,KIM,SALESMAN,7698,2008/09/28,1250,1400,309698,MOON,MANAGER,7839,2008/05/01,2850,,309782,CHOI,MANAGER,7839,2008/06/09,2450,,109788,HAN,ANALYST,7566,2008/04/19,3000,,209844,LEE,SALESMAN,7698,2008/09/08,1500,0,309876,RYU,CLERK,7788,2008/05/23,1100,,20

Page 89: Proc*C  기초

내장 PL/SQL : 심화문제

Table EMP 의 구조TABLE SCOTT.EMP( EMPNO NUMBER(4,0) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4,0), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2,0), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO) USING INDEX, CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)

REFERENCES SCOTT.DEPT (DEPTNO))

Page 90: Proc*C  기초

내장 PL/SQL : 심화문제

실행결과