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 : 심화문제
실행결과