Proc*C 기초 Style System 김도형.

Slides:



Advertisements
Similar presentations
CUBRID 소개 (Object 개념) 서비스 사업부 / 기술지원팀. 목차 구조 일반적 특징 객체지향 특징 ORDB 개념을 이용한 스키마 ORDB 개념을 이용한 질의.
Advertisements

1 SQL 정보보호학과 양 계 탁. 2 SQL 개요 SQL 개요 3 Database u 연관된 데이터들의 집합 u 데이터를 쉽게 관리하는 프로그램 종 류종 류 관계형 데이터베이스 객체지향형 데이터베이스 계층형 데이터베이스 네트워크 데이터베이스 데이터를 2 차원적인 테.
Oracle DB 구조 및 트랜잭션 관리 이경화 Database 의 구조 Program Global Area (PGA) Instance Database Buffer Cache Redo Log Buffer Library Cache Shared.
1 Orange Part I WareValley. 2 Orange 기능 Development Tool Schema Browser Query Builder SQL Tool PL/SQL Tool Description Tool Table Editor Loader File Editor.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL 언어 SQL.
제 3장 오라클 소개 오라클 소개 오라클 설치 방법 오라클 구조 제 3 장 오라클 개요.
Allow reverse scans allow reverse scnas. allow reverse scans allow reverse scnas.
소리가 작으면 이어폰 사용 권장!.
데이터 모델링 방법론 2003년 03월.
DRIMS-Cloud 소개.
PL/SQL.
C++ Espresso 제1장 기초 사항.
데이터베이스 시스템.
Database Laboratory, Hong Ik University
Oracle Embedded SQL Pro*C : Chap 5 Copyright by SunYoung Kim
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
관계 대수와 SQL.
오라클 데이터베이스 성능 튜닝.
Database & Internet Computing Laboratory 한 양 대 학 교
제 5 장 인덱스 생성 및 관리.
SQL*Plus - Oracle ISQL -
SELECT 문 사원 테이블의 모든 정보를 출력하는 예제 1. 비교 연산자 SELECT 문의 형태
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
JDBC 프로그래밍 이수지 이동주 1.
10장 예외 처리 프로그래밍 언어론 10.6 Pascal과 C의 에러 처리 10.1 설계 주제 10.2 PL/I의 예외 처리
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
10장. 데이터베이스 보안과 권한 관리 데이터베이스 보안과 권한 관리
데이터베이스 담당교수 신정식 Chapter 4 SQL(1).
TUXEDO 프로그래밍 가이드.
Toad for Oracle 설치 방법.
Chapter 01 데이터베이스 시스템.
11장. 데이터베이스 서버 구축과 운영.
오라클 데이터베이스 성능 튜닝.
kHS 데이터베이스 테이블 및 인덱스 kHS.
기초 T-SQL.
MySQL 기본 사용법.
트랜잭션과 잠금 트랜잭션 처리 메커니즘을 자세히 이해한다. 트랜잭션의 종류를 파악한다.
14장 뷰.
Chapter 05 데이터베이스 프로그래밍.
4.2 SQL 개요 SQL 개요 SQL은 IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 1986년에 ANSI(미국 표준 기구)에서 SQL.
ER-Win 사용 방법.
2장. 관계 데이터 모델과 제약조건 관계 데이터 모델은 지금까지 제안된 데이터 모델들 중에서 가장 개념이 단순한 데이터 모델의 하나 IBM 연구소에 근무하던 E.F. Codd가 1970년에 관계 데이터 모델을 제안함 관계 데이터 모델을 최초로 구현한 가장 중요한 관계 DBMS.
뷰와 저장 프로시저 뷰의 개념을 이해한다. 뷰의 정의와 관리 방법을 이해한다. 뷰를 사용함으로써 생기는 장점을 알아본다.
9장 테이블 생성 및 변경, 삭제하기(DDL).
UniSQL/X 실습과제 (1) ■ 실습 기간: ~
SQL.
YOU Youngseok 트랜잭션(Transaction) YOU Youngseok
01 데이터베이스 개론 데이터베이스의 등장 배경 데이터베이스의 발전 과정 데이터베이스의 정의 데이터베이스의 특징
4장. 데이터베이스와 테이블 MySQL 데이터베이스 테이블의 생성 테이블 데이터 처리(삽입, 변경, 삭제) 작업
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
13장 무결성 제약조건.
SQL Query in the SSMS : DB, Table
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
JSP 게시판 구현.
데이터베이스 (Database) SQL 추가 기능: 주장, 뷰, 프로그래밍 기법 문양세 강원대학교 IT대학 컴퓨터과학전공.
오라클 쿼리 문제 EMP (사원 테이블) DEPT (부서 테이블) 컬럼명 설명 EMPNO 사원번호 ENAME 사원명 JOB
기본적인 SELECT문 작성.
8장 테이블의 생성 및 변경 정인기.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
06. SQL 명지대학교 ICT 융합대학 김정호.
C언어 개론.
뇌를 자극하는 Windows Server 장. 데이터베이스 서버.
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
제5장 디버깅과 추적 문봉근.
Stored program 장종원
Presentation transcript:

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++를 사용할수 있음

Window에서의 Pro*C의 설치(2/4) bin\proc.exe을 확인

Window에서의 Pro*C의 설치(3/4) precomp\public\oraca.h, precomp\public\sqlca.h 을 확인

Window에서의 Pro*C의 설치(4/4) precomp\lib\msvc\oraSQL9.LIB 을 확인

Visual C++의 환경 설정 (1/11) Project 생성 Project Name에 proctest(프로젝트명)를 입력

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) Project 환경설정 추가 INCLUDE DIRECTORY : C:\oracle\ora92\precomp\public : header file의 경로를 입력 DEBUG 정보 형식 : Editor Continue용 Program DB를 선택

Visual C++의 환경 설정 (6/11) 최적화 : 無効(/Od)를 선택 C:\oracle\ora92\precomp\lib\msvc : Library file의 경로를 입력

Visual C++의 환경 설정 (7/11) oraSQL9.LIB : Library file Name 입력 DEBUG 정보 생성 : はい(/ DEBUG)를 선택

Visual C++의 환경 설정 (8/11) Proc proctest.pc : proc 프로젝트명.pc 을 입력 Text Editor의 설정

Visual C++의 환경 설정 (9/11) C/C++ File Extension : “;*.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 변수

내장 SQL : Host 변수 : 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 변수 -1 : 해당 Column에 NULL이 설정됨. Host 변수의 값은 무시됨 >=0 : Host 변수의 값이 해당 Column에 설정됨 출력 Host변수에 사용시 -1 : NULL. Host변수 값 사용 불가(값 보장 못함) 0 : 정상. Host 변수 값 사용 가능 >0 : Host 변수 크기 부족으로 정확한 값이 셋팅되지 못함. INDICATOR 변수의 값은 원래의 크기를 나타냄. -2 : Host 변수 크기 부족으로 정확한 값이 셋팅되지 못함. 원래의 크기를 알수 없음.

내장 SQL : 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 : CURSOR : 실습 실행결과

내장 SQL : SELECT Data Base에 질의를 수행 Oracle은 INTO절의 출력 Host변수에 값을 설정함 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 DELETE 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 : INSERT : 실습

내장 SQL : INSERT : 실습 실행결과

내장 SQL : UPDATE : 실습

내장 SQL : UPDATE : 실습

내장 SQL : UPDATE : 실습 실행결과

내장 SQL : DELETE : 실습

내장 SQL : DELETE : 실습

내장 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 : 프로그램 수행을 종료하고, 트랜잭션은 롤백됨.

내장 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;

내장 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 */ 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 { ...

내장 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);

내장 SQL : WHENEVER : 실습

내장 SQL : WHENEVER : 실습

내장 SQL : WHENEVER : 실습 실행결과(2번 실행시킨 경우)

내장 SQL : SQLCA SQLCA은 구조체 SQLCA의 멤버변수들은, SQL문이 실행될때마다 Oracle에 의해 갱신됨. 항상 가장 최근에 실행된 SQL의 실행결과의 Error, 경고, 상태 정보등을 보유 SQLCA를 사용하기 위해서는 아래의 정의를 기술해야함 EXEC SQL INCLUDE SQLCA; 또는 #include <sqlca.h>

내장 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] : 수행된 행의 개수

내장 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 */ };

내장 SQL : SQLCA sqlcode : 최후에 실행된 SQL문의 상태코드가 저장됨. 값의 의미 0 : 성공 >0 : SQL은 실행되었지만, 열외가 발생한 경우. WHERE절에 만족하는 행이 없는 경우, 또는 SELECT INTO 또는 FETCH문에서 반환된 행이 없는 경우 <0 : Database, System, Network 또는 Application의 Error가 원인으로 SQL이 실행되지 못함. 치명적 Error. 대부분의 경우 Transaction은 Rollback됨.

내장 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);

내장 SQL : SQLCA : 실습

내장 SQL : SQLCA : 실습 실행결과(2번 실행시킨 경우)

내장 SQL : CONNECT Data를 질의하거나 조작하기전에 Pro*C/C++ Program을 Database에 접속시켜야함 Database에 Login하기위해 CONNECT을 사용함 Ex) EXEC SQL CONNECT :username IDENTIFIED BY :password ; EXEC SQL CONNECT :usr_pwd username 및password는 문자형 Host 변수임 Host 변수 usr_pwd는 /(slash)로 구분된 Username, Password를 포함

내장 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)) )

내장 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;

내장 SQL : CONNECT

내장 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을 종료함

내장 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됨에 주의

내장 SQL : COMMIT

내장 SQL : ROLLBACK ROLLBACK문을 사용하면 Database에 대한 현재까지의 변경을 취소할수 있음 TO SAVEPOINT절을 사용하면 현재의 Transaction의 처음이 아닌 중간까지 되돌리는 것이 가능함 불완전한 Transaction을 원래대로 되돌리는 것이 가능하기 때문에 Database의 정합성을 확보할수 있음 ROLLBACK되면 수행되는 작업들 현재 Transaction내에서 Database에 대해 발생했던 변경이 전부 취소됨 모든 SAVEPOINT가 삭제됨 현재 Transaction이 종료됨 모든 Record및 Table의 Lock이 해제됨 모든 Cursor를 해제함

내장 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를 기술 해야 함

내장 SQL : ROLLBACK

내장 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)

내장 PL/SQL : 실습

내장 PL/SQL : 실습

내장 PL/SQL : 실습 proc plsql.pc SQLCHECK=SEMANTICS userid=scott/tiger@BATCH_UT

내장 PL/SQL : 실습 실행결과

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

내장 PL/SQL : 실제 사용 예

내장 PL/SQL : Stored PL/SQL Call 다음 예는 raise_salary라는 이름의 Stored Procedure를 호출 EXEC SQL EXECUTE BEGIN raise_salary(:emp_id, :increase); END; END-EXEC; 다음 예는 emp_actions이란 Package에 속하는 raise_salary란 이름의 Stored Procedure를 호출 emp_actions.raise_salary(:emp_id, :increase); Parameter는 IN, OUT 두종류가 있음 내장 PL/SQL이 포함된 Program을 PreCompile하는 경우에는 SQLCHECK=SEMANTICS Compile Option을 사용해야 함

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

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

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

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

내장 PL/SQL : Stored PL/SQL Call : 실습 실행결과

내장 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

내장 PL/SQL : 심화문제 File emp.data의 내용 9369,JANG,CLERK,7902,2008/12/17,800,,20 9499,BAE,SALESMAN,7698,2008/02/20,1600,300,30 9521,HWANG,SALESMAN,7698,2008/02/22,1250,500,30 9566,PARK,MANAGER,7839,2008/04/02,2975,,20 9654,KIM,SALESMAN,7698,2008/09/28,1250,1400,30 9698,MOON,MANAGER,7839,2008/05/01,2850,,30 9782,CHOI,MANAGER,7839,2008/06/09,2450,,10 9788,HAN,ANALYST,7566,2008/04/19,3000,,20 9844,LEE,SALESMAN,7698,2008/09/08,1500,0,30 9876,RYU,CLERK,7788,2008/05/23,1100,,20

내장 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) )

내장 PL/SQL : 심화문제 실행결과