Transcript [] Proc

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\ora
SQL9.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\publ
ic : header file의 경로를 입력
 DEBUG 정보 형식 : Editor
Continue용 Program DB를
선택
Visual C++의 환경 설정 (6/11)
 최적화 : 無効(/Od)를 선택
 C:\oracle\ora92\precomp\l
ib\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”를 추가
 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 형
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 : 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에 질의를 수행
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 : 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 */
...
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
{ ...
}
...
}
내장 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를 호출
EXEC SQL EXECUTE
BEGIN
emp_actions.raise_salary(:emp_id, :increase);
END;
END-EXEC;
 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 : 심화문제
실행결과