960 likes | 1.33k Views
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
E N D
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 • Collection • Pro*C++ • Compile Option • Multi Thread • Host Array
Pro*C란 • Oracle사에서 C/C++를 기반으로하여 내장SQL문을 사용할 수 있도록 개조된 언어 • Pro*C로 작성된 Source Code는 Oracle Pro*C/C++ Precompiler에 의해 보통의 C/C++ Source Code로 해석 • 입력 : 내장 SQL을 포함하는 .pc 파일 • 출력 : 오라클 라이브러리를 호출하는 .c 혹은 .cpp 파일
Pro*C/C++ Precompiler에 대해 • High Level Language Source에 내장 SQL문을 사용 가능하게 하는 Programming Tool
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를 제거 할 수 있음
Window에서의 Pro*C의 설치(1/4) Oracle Programmer Component를 설치하여야 Pro*C/C++를 사용할수 있음
bin\proc.exe을 확인 Window에서의 Pro*C의 설치(2/4)
precomp\public\oraca.h, precomp\public\sqlca.h 을 확인 Window에서의 Pro*C의 설치(3/4)
precomp\lib\msvc\oraSQL9.LIB을 확인 Window에서의 Pro*C의 설치(4/4)
Visual C++의 환경 설정 (1/11) Project Name에 proctest(프로젝트명)를 입력 Project 생성
Visual C++의 환경 설정 (2/11) 새로운 Source File을 추가 추가 File 종류를 C Source로 proctest.pc를 추가
Visual C++의 환경 설정 (3/11) 추가 File 종류를 C Source로 proctest.c를 추가 Proctest.pc를 Compile 대상에서 제외 시킴
Visual C++의 환경 설정 (4/11) Build로 부터 제외:はい를 선택 Build에서 제외 된것을 확인
Visual C++의 환경 설정 (5/11) 추가 INCLUDE DIRECTORY : C:\oracle\ora92\precomp\public : header file의 경로를 입력 DEBUG 정보 형식 : Editor Continue용 Program DB를 선택 Project 환경설정
Visual C++의 환경 설정 (6/11) C:\oracle\ora92\precomp\lib\msvc : Library file의 경로를 입력 최적화 : 無効(/Od)를 선택
Visual C++의 환경 설정 (7/11) oraSQL9.LIB : Library file Name 입력 DEBUG 정보 생성 : はい(/ DEBUG)를 선택
Visual C++의 환경 설정 (8/11) Text Editor의 설정 Proc proctest.pc : proc 프로젝트명.pc 을 입력
Visual C++의 환경 설정 (9/11) C/C++ File Extension : “;*.pc”를 추가 Pc를 입력후 적용을 클릭
Visual C++의 환경 설정 (10/11) • Test Source Code의 입력 Proctest.pc
Visual C++의 환경 설정 (11/11) Project의 Rebuild Ctrl+Alt+F7 실행결과(Ctrl+F5)
내장 SQL : Host 변수 • Host(Source) Program과 Oracle간의 Data의 통신에 사용됨 • 출력 호스트 변수 (Oracle -> Host Program) • (예) SELECT에서 리턴된 데이타를 받기 위해 사용되는 변수 • 입력 호스트 변수 (Host Program-> Oracle) • (예) INSERT에서 입력할 데이타를 받기 위해 사용되는 변수 • 내장 SQL에 사용될 때는 변수명 앞에 콜론을 붙여 사용 • Ex) :host_variable • DECLARE SECTION 절에 정의 • Ex) EXEC SQL BEGIN DECLARE SECTION; int host_variable; EXEC SQL END DECLARE SECTION;
내장 SQL : Host 변수 : VARCHAR 형 • VARCHAR을 이용해서 가변 길이 문자열을 취급할수 있음 • Precompiler에 의한 VARCHAR의 해석 • VARCHAR username[20]; • ↓ • struct • { • unsigned short len; • unsigned char arr[20]; • } username;
내장 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 です。
내장 SQL : Host 변수 : INDICATOR 변수 • 입력 Host 변수에 사용시 • -1 : 해당 Column에 NULL이 설정됨. Host 변수의 값은 무시됨 • >=0 : Host 변수의 값이 해당 Column에 설정됨 • 출력 Host변수에 사용시 • -1 : NULL. Host변수 값 사용 불가(값 보장 못함) • 0 : 정상. Host 변수 값 사용 가능 • >0 : Host 변수 크기 부족으로 정확한 값이 셋팅되지 못함. INDICATOR 변수의 값은 원래의 크기를 나타냄. • -2 : Host 변수 크기 부족으로 정확한 값이 셋팅되지 못함. 원래의 크기를 알수 없음.
내장 SQL : Host 변수 : 실습 • 실행결과
내장 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;
내장 SQL : CURSOR • 질의 결과가 복수의 Record인 경우, 한 Record씩의 처리가 가능하도록 함 -> 복수의 질의 결과에 CURSOR을 사용하지 않으면 Runtime Error가 발생함 • CURSOR와 관련된 명령어들 • DECLARE CURSOR • OPEN • FETCH • CLOSE
내장 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할 필요가 있음
내장 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한 후
내장 SQL : CURSOR: CLOSE • FETCH가 끝난 CURSOR의 Resource(Memory 등)를 System에 반환함 • Ex) EXEC SQL CLOSE emp_cursor; • CLOSE후의 CURSOR로 부터의 FETCH는 허용되지 않음 • 필요에 의해 CURSOR의 재 사용이 가능함->입력 Host 변수에 값 할당후 재 OPEN등.
내장 SQL : CURSOR: 실습 • 실행결과
내장 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를 사용
내장 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를 생략할 수 있음
내장 SQL : UPDATE, DELETE • UPDATE • Table또는 View의 값을 변경 • Ex) EXEC SQL UPDATE emp SET sal = :salary, comm = :commission WHERE empno = :emp_number; • DELETE • Table또는 View로 부터 Record를 삭제 • Ex) EXEC SQL DELETE FROM emp WHERE deptno = :dept_number ;
내장 SQL : INSERT : 실습 • 실행결과
내장 SQL : UPDATE: 실습 실행결과
내장 SQL : DELETE: 실습 실행결과
내장 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>
내장 SQL : WHENEVER : <condition> • SQLWARNING : 경고 메시지가 발생한 경우 • SQLERROR :에러가 발생한 경우 • NOT FOUND WHERE : 절의 조건을 만족하는 행을 발견할 수 없거나,SELECT INTO나 FETCH가 어떤 행도 반환하지 않은 경우
내장 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 : 프로그램 수행을 종료하고, 트랜잭션은 롤백됨.