[oracle] [pro-c] Pro*C 프로그램 개요

Pro*C 프로그램 개요

 

<그림1> Embedded SQL Program 의 생성

 Pro*C는 PreCompiler로 SOURCE에 포함되어 있는 Embedded SQL문을 SQLLIB의 Function으로 
SOURCE코드를 생성시켜 C SOURCE로 변환해 주는 프리 컴파일러이다. 
  • 3GL언어에서 SQL문(4GL언어)을 사용하여 보다 편하게 ORACLE을 직접 Access할 수 있도록 한다.
  • 어떤 SQL문장이든 수행가능하다.
  • 데이타베이스 테이블을 다이나믹하게 CREATE, ALTER, DROP한다.
  • Row를 SELECT, INSERT, UPDATE, DELETE 한다.
  • 트랜잭션을 COMMIT, ROLLBACK 한다.
  • PL/SQL을 실행 할 수 있다.
    Pro*C의 기초
     
    Embedded SQL 문
    어플리케이션에서 SQL문과 C문장과 C변수와 SQL문장의 구조를 모두 자유롭게 사용할
    수 있다. 호스트 프로그램에서 SQL문장을 사용할 경우 “EXEC SQL”이란 키워드를
    사용하여 SQL문을 시작하고 문장의 마지막에는 세미콜론(“;”)으로 종결되도록 한다.
    EXEC SQL로 시작하여 ‘;’로 종료하는 것이 Embedded SQL이다.
     
     
    선언(Declarative)
    명령 설명
    ARRAYLEN PL/SQL에서 호스트 array를 사용
    BEGIN DECLARE SECTION
     
    END DECLARE SECTION
     
    ANSI모드에서 호스트 변수를 사용하기 위한 명령
     
    DECLARE Oracle object의 이름 부여
    INCLUDE 현재위치에 파일 대치
    TYPE 데이터 타입의 동일화
    VAR 변수의 동일화
    WHENEVER
     
    Runtime에러 핸들링
     
     
     
    실행(Executable)
    ALLOCATE CURSOR변수에 영역할당 문장
    ALTER
    ANALYZE
    AUDIT
    COMMENT
    CONNECT
    CREATE
    DROP
    GRANT
    NOAUDIT
    RENAME
    REVOKE
    TRUNCATE
    CLOSE
    오라클의 정의, 오라클에 접속제어 문장
    DELETE
    FETCH
    INSERT
    LOCK TABLE
    OPEN
    SELECT
    UPDATE
    EXPLAIN PLAN
    데이터 조작 및 데이타 추출 문
    COMMIT
    ROLLBACK
    SAVEPOINT
    SET TRANSACTION
    트랜잭션 제어문
    DESCRIBE
    EXECUTE
    PREPARE
    Dynamic SQL사용을 위한 문
    ALTER SESSION
    SET ROLE
    세션 제어문
     
     
    Table 2-1 Embedded SQL문
     
    Embedded SQL의 사용
    SQL문들은 C문장과 자유롭게 혼용하여 사용할 수 있다. 다만 위의 SQL문들의 앞에 “EXE SQL”이라는 단어를 먼저 쓰고 문장의 마지막에 세미콜론(“;”)을 사용하면 된다. Pro*C 프리컴파일러는 “EXE SQL”로 시작하는 문장을 ORACLE 런타임 라이브러리 SQLLIB를 CALL하는 문장으로 변환해 준다. ROLLBACK WORK; : Interactive EXEC SQL ROLLBACK WORK : Embedded SQL 위의 두 문장은 똑같은 결과를 나타낸다. 첫번째 문장은 Interactive SQL환경에서 사용하고 (SQL*Plus) 두번째 문장은 Pro*C 프로그램에서 사용한다.
    Static 대 Dynamic SQL문
    대부분의 응용프로그램은 static SQL문과 고정된 트랜잭션을 사용하지만 프로그램에 따라서 Dynamic SQL을 사용할 수 도 있다. STATIC SQL문은 각 SQL문들이 실행되어지기 전에 어떤 SQL명령이 수행되고, 또 어떤 데이타베이스 테이블이 변경되는지, 어떤 컬럼이 UPDATE되는지 알고 있다. 반면에 DYNAMIC SQL은 어플리케이션 프로그램이 실행되는 시점에서 SQL문장을 만들어 실행하게 프로그램 해야 할 경우 사용한다. 이것은 실행되는 시점에서만 어떤 SQL이 수행되는지 알 수 있다.
     
    Embedded PL/SQL블럭의 사용
    Pro*C 컴파일러는 Embedded PL/SQL문장을 Embedded SQL문장과 같이 다룬다. PL/SQL은 모든 데이터 조작과 트랜잭션 제어SQL문을 사용할 수 있기 때문에 Embedded PL/SQL에서는 ORACLE의 데이타를 유연하고 안전하게 사용할 수 있다.
     
    호스트변수와 Indicator변수
    호스트변수는 오라클과 프로그램사이의 데이타나 상태를 주고 받는데 사용되는 변수이다. 호스트변수는 Pro*C프로그램 어디서나 사용가능하나. 단 SQL문 내에서는 콜론(‘:’)을 앞에 붙여 사용한다. 호스트변수에는 C의 Struct 가지는 것이 있다. (VARCHAR 타입) Indicator변수는 short integer형으로 호스트변수에 콜론으로 붙여 호스트변수의 상태나 값을 얻고자 할 경우 사용한다.
     
    HOST VARIABLE
    호스트변수는 오라클 데이타베이스와 어플리케이션 프로그램사이에 데이터 통신을 담당한다.
    호스트변수는 오라클과 어플리케이션이 공유하쫍부 늴분으로 같이 참조할 수 있다.
    호스트변수를 사용하여 오라클에 데이타를 전달하고, 또 오라클 데이타베이스에서 데이터 또는 
    상태정보를 프로그램으로 받을 수 있다.
    Embedded SQL문장에서 HOST변수는 콜론(“:”)을 변수 앞에 붙여서 사용한다.
    
 
 
Pro*C에서 변수의 사용
1. 데이터의 Type

데이타 타입

C변수 타입 설명
char single charactor
 
char[n]
 
n-charactor array(string)
 
Int
 
integer
 
Short
 
small integer
 
Long
 
large integer
 
Float
 
floating-point number(usually single precision)
 
Double
 
floating-point number(always double precision)
 
VARCHAR[n]
 
variable-length string
 
 
<table 3-1>호스트 변수를 위한 C데이타 타입

 

  • C와 Oracle 데이타 타입 호환성
Internal Type(Oracle) C Type 설명
VARCHAR2(Y)(Y:1~2000)
 
char
 
single charactor
 
CHAR(X)(X:1~255)
char[n]
VARCHAR[n]
int
short
float
n-byte charactor array
n-byte variable-length charactor array
integer
small integer
 
NUMBER
NUMBER(P,S)
int
short
long
float
double
char
char[n]
VARCHAR[n]
integer
small integer
large integer
floating-point number
double-precision floating-point number
single character
n-byte character array
n-byte variable-length character array
DATE
char[n]
VARCHAR[n]
n-byte character array
n-byte variable-length character array
LONG
char[n]
VARCHAR[n]
n-byte character array
n-byte variable-length character array
RAW(X)
unsigned char[n]
VARCHAR[n]
n-byte character array
n-byte variable-length character array
LONG LAW
unsigned char[n]
VARCHAR[n]
n-byte character array
n-byte variable-length character array
ROWID
unsigned char[n]
VARCHAR[n]
n-byte character array
n-byte variable-length character array
MLSLABEL
unsigned char[n]
VARCHAR[n]
n-byte character array
n-byte variable-length character array
Notes:
  • X : 1~255 사이의 값 default 1 Y : 1~2000사이의 값 P : 2~38 , S : -84~127사이의 값
<table 3-2> C와 Oracle 데이타 타입 호환성
 
  • 2. Internal Data Type - 오라클 데이타 타입
문자 데이타 타입
- char와 varchar2 datatype은 alphanumeric data로 저장.
- database character set은 database를 생성할때 만들어지며 변경할 수 없다.
ⓛ char datatype
  • - fixed-length character strings. - table을 생성할때 칼럼길이가 정의되며 1~255 bytes.(default 1) - table의 row를 insert나 update할때 char 칼럼은 고정된 length를 가짐. - 정해진 값보다 짧은 값이 입력되면 정해진 length만큼 이후는 blank가 채워짐. - trailing blank를 가진 정해진 값보다 긴 값이 입력되면 고정된 길이 내에서 trailing blank가 잘림. 정해진 길이보다 긴 값이 입력되면 오라클은 에러를 return.

② Varchar2 datatype

  • - variable-length character strings. - maximum 칼럼 length는 1~2000 bytes. - 입력된 길이 만큼만 저장됨.

③ Varchar datatype

  • - varchar2 datatype 과 현재는 동일함. - 향후 오라클에서는 다른 용도로 사용계획. (varchar2를 사용하는 것이 향후에 유리)
  • 3. 어떻게 데이타 타입을 정할 것인가?

Semantics 비교

  • ANSI처럼 trailing blank 가 중요한 역할을 하지 않을때는 char사용. trailing blank 가 중요한 역할을 담당할때는 varchar2 사용. 효과적인 데이터 저장을 위해서는 varchar2 가 유리. char datatype은 blank-pad를 하고 trailing blank를 fix 된 칼럼 길이 만큼 blank를 채워 저장. varchar2는 blank를 저장하지 않음.
    • blank-pad : 'a'='a ', non-pad 'a '>'a' Future Compatibility
    char와 varchar2 datatype은 지원이 되지만 varchar datatype는 향후 어떤 용도로 사용될지 모르기 때문에 사용하지 않는것이 좋다.

Number 데이타 타입

  • fixed floating-point number로 저장. number (precision, scale)
    • precision-scale= 왼쪽정수의 수,scale은 오른쪽 소수이하의 수. (단,scale이 +일 경우) 38digits 까지 저장가능.
    scale은 -84~127사이 ① Internal numeric format
    • variable-length format. 38digits 까지 저장가능. 지수가 1bytes 일때 가수는 20bytes까지 가능. (38digit/2)+1=20bytes 4.12×10E2 일때 지수 1 bytes 차지 4,1,2 2bytes 차지. (3digits /2)=1.5 1+1=2bytes 지수의 범위는 -130~125 사이

Date 데이타타입

  • point-in-time value 으로 저장. Jan 1,4712 BC ~ Dec 31,4712 AD (AD가 default) 기본형태는 DD-MON-YY 기본 형태에서 벗어나는 날짜를 사용할때는 TO_DATE function을 사용. TO_DATE ('November 13,1992', 'MONTH DD,YYYY') ⓛ Julian date 01-01-4712 BC부터 원하는 날까지의 날수 계산시 사용. format mask “J" 사용. TO_DATE 와 TO_CHAR fuction을 사용하여 date datatype과 상호 convert가능. select to_char (hiredate, 'J') from emp; (date type인 hiredate를 julian date로 convert) insert into emp (hiredate) values (to_date(2448921, 'J')); (julian date인 2448921을 date datatype으로 변환하여 hiredate 칼럼에 insert.)

Long 데이타타입

  • variable-length character data 2 gigabytes 까지의 data 저장. long data는 text data 이고 다른 시스템으로 옮길때 convert되어짐. 주로 comment 등에 사용되어지는 datatype. 사용자가 특별히 지정하지 않으면 80 bytes 만 출력. 하나의 테이블에는 오직 하나의 long datatype 만 존재. not (null)을 제외한 다른 제약조건은 지정할 수 없음. 조건절에서 사용되어 다른 것과 비교될수 없으며 인덱스를 만들수 없음. select 문 내에서 where의 조건, group by, order by등의 각종 함수를 사용할 수 없음. 계산식에서 사용될 수 없음.

RAW and Long RAW

  • RAW와 long raw datatype은 다른 시스템으로 상호 convert 되지 않는 data 에 사용. long raw 는 graphics,sound,documents,arrays of binary data를 저장하는데 사용. long raw는 2Gbytes 까지 저장이 가능하고, raw는 255bytes까지 저장. long raw는 인덱스가 불가능하고 raw 는 인덱스가 가능. raw나 long raw와 char 상호 자동 convert 되며 binary data는 hexadecimal form 으로 표현. * long raw의 경우는 2Gbytes나 되기 때문에 인덱스를 한다면 많은 시간과 시스템 부하를 초래.

ROWID and ROWID datatype

  • 실제 row가 존재하는 테이블에는 rowid가 없으며 인덱스에만 rowid가 존재. non-clustered table 에 존재하는 각 row는 physical 한 address에 대한 unique 한 rowid가 존재. clustered table의 경우에는 같은 data block에 존재하는 다른 table의 row는 같은 rowid 를 가질수 있음. row에 할당된 rowid는 import나 export utility를 사용하여 import나 export 되지 않는 한 변경되지 않음. table 로부터 row를 삭제할 때 그 row에 할당된 rowid는 다음에 insert되는 row에 할당됨. rowid는 database 에 저장되지도 않고, database data도 아님.

MLSLABEL datatype

  • trusted oracle에서 제공. 이 datatype 은 binary format의 operating system label을 저장할때 사용. data dictionary에 있는 binary label에 대한 map을variable-length tag 형태로 저장. (row당 2~5bytes) binary label 대신 representative tag로 저장되는 것은 binary operating system label이 매우 크기 때문. (space 사용에 효과적.)
  • 4. DATA conversion

여러 function 을 이용하여 오라클은 자동으로 datatype을 convert한다.

 

RULE 1: Assignment

  • assignment에 의하여 오라클은 자동으로 다음을 convert 한다. varchar2 or char to number number to varchar2 varchar2 or char to date · date to varchar2 · varchar2 or char to rowid · rowid to varchar2 · varchar2 or char to label · label to varchar2 · varchar2 or char to hex   ② RULE 2 : Expression evaluation - expression evaluation에 의하여 오라클은 자동으로 다음을 convert한다. · varchar2 or char to number · varchar2 or char to date   variable :=expression 의 경우 오라클은 먼저 rule2를 사용하여 expression을 계산. 성공적으로 계산이 되면 하나의 value값이 나오고 datatype을 가짐. 이 다음에 rule1을 사용하여 이 value 값을 assignment's target에 할당하려고 함. * char to number conversion은 character string이 유효숫자를 가질 때만 가능. char to date 역시 character string이 date 기본 format인 DD-MON-YY를 가질 때 가능.
  • 5. 데이타 타입의 동격화(Datatype Equivalencing)

예를 들어 VARCHAR변수가 있다. 이 변수는 C의 Structure구조로 되어 있기 때문에 Embedded SQL을 제외하고 일반 C언어에서 VARCHAR로 선언된 호스트 변수를 참조하려면 구조체(Structure)형식으로 참조를 해야만 한다. VARCHAR경우에는 내부적으로 아래와 같이 구성되어 있다.

  • typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; /* VARCHAR형으로 선언된 호스트 변수의 실제모습 */ VARCHAR user_name[20]; struct { unsigned short len; /* 호스트 변수의 길이 저장 */ unsigned char arr[1]; /* 호스트 변수 데이타 저장 */ } user_name;

그렇기 때문에 VARCHAR형으로 선언된 호스트 변수는 실제 데이타가 있는 부분(arr[])과 호스트변수가 포함하는 문자열의 길이(len)을 포함한다. 실제로 이 호스트 변수를 참조하는 방법은

  • strcpy((char *) user_name.arr, "EDU"); user_name.len = strlen(user_name.arr);

VARCHAR로 선언된 호스트 변수를 데이타베이스에 사용 시 출력용일 때 : SELECT INTO문에서는 구조체내의 arr과 len에는 데이타 베이스의 값이 저장되어 출력된다. 사용자는 참조만 하면 된다. 입력용일 때 : 조건절(WHERE절)에서 사용, INSERT, UPDATE에서 사용하여 정확한 답을 얻으려면 길이(LEN)를 지정해 주어야만 한다. 우리가 Pro*C프로그램에서 자주 부딪치는 부분중의 하나이다. 이런 문제 해결을 위해서 데이타 타입의 동격화가 있다. (Data Equivalencing) STRING으로 동격화 시켜주는 것이다. 데이타 타입의 동격화의 문법과 예는 아래에 있다.

  • 데이타 타입의 동격화(Datatype Equivalencing)의 사용

데이타 타입 동격화는 오라클이 입력 데이터의 해석 방법을 프로그래머가 원하는 데로 변경시키는 것이다.

  • EXEC SQL VAR 호스트 변수명 IS 외부데이타타입[(길이:길이, 소숫점이하 길이)]]; EXEC SQL BEGIN DECLARE SECTION; char emp_name[11]; EXEC SQL VAR emp_name IS STRING(11); char emp_job[11]; EXEC SQL VAR emp_job IS STRING(11); char emp_ename[100][11]; EXEC SQL VAR emp_ename IS STRING(11); /* ARRAY 변수 정의 */ EXEC SQL END DECLARE SECTION;

선언된 하나 하나의 호스트 변수마다 동격화를 시킬 수 있고, Pro*C에서는 user defined datatype으로 외부 테이타타입으로 한번에 변경시킬 수 있다.

  • EXEC SQL TYPE 사용자정의타입 IS 외부데이타타입 [(길이)] [REFERENCE]; typedef char asciz[350]; EXEC SQL BEGIN DECLARE SECTION; EXEC SQL TYPE asciz IS STRING(350) REFERENCE; asciz catalog_cd[100]; /* ARRAY 변수 정의 */ asciz factor_cd1; asciz factor_cd2; asciz factor_cd3; asciz factor_cd4; asciz factor_cd5; EXEC SQL END DECLARE SECTION;
  • 6. PreProcessor의 사용

C에서 사용된 문법으로 PreProcessor시에 참조되어 포함 또는 포함되지 않는 값들을 나타낸다.

  • #define : 매크로를 정의한다. #include : 현위치에 문장 다음에 나오는 화일을 대치시킨다. #ifdef : 뒤에 따라오는 상수가 이전에 정의되어 있으면 문장 이후에 나오는 source코드를 포함하여 컴파일한다. #ifndef : 뒤에 따라오는 상수가 이전에 정의되지 않았으며 문장 이후에 나오는 source 코드들을 컴파일에 포함시키지 않는다. #endif : #ifdef, #ifndef의 끝을 나타낸다. #elif : #ifdef, #ifndef의 다음 조건을 나타낸다. <예> #define NAME_LEN 20 #define PASS_LEN 20 VARCHAR uname[NAME_LEN]; VARCHAR passwd[PASS_LEN];
  • 7. 구조체 변수의 사용

Pro*C 2.0이상에서는 구조체 형식의 호스트 변수를 사용할 수 있다. 이렇게 사용함으로써 일일이 호스트 변수를 열거하지 않아도 된다. 선언

  • #define UNAME_LEN 20 struct { VARCHAR emp_name[UNAME_LEN] float salary; float commission; } emprec;

사용(SELECT .. INTO)

  • EXEC SQL SELECT ename, sal, comm INTO :emprec FROM EMP WHERE EMPNO = :emp_number;
  • 8. Array 호스트 변수의 사용

데이타베이스를 ACCESS속도를 향상시킨다.

  • char emp_name[10][50]; int emp_number[50]; double salary[50];

예를 들어 300건의 자료를 테이블에 INSERT할 경우 ARRAY를 사용하지 않으면 300번의 INSERT가 발생하게 된다. 만약 ARRAY를 사용하면 1번의 INSERT문만 실행시키면 된다.

  • int hi_lo_scores[25][25];

쉽게 프로그래밍 할 수 있다.

  • ARRAY변수의 선언

위와 같이 선언하면 된다. 아래와 같은 2차원 array는 허용되지 않는다.

  • char emp_name[20][50]; int emp_number[50]; double salary[50]; EXEC SQL SELECT ENAME, EMPNO, SAL INTO :emp_name, :emp_number, :salary FROM EMP WHERE SAL > 1000;

INSERT, UPDATE, DELETE문장의 입력 변수에 호스트 Array를 사용할 수 있고, SELECT나 FETCH의 INTO절의 출력 변수에 사용할 수 있다. 호스트변수를 사용하는 것과 ARRAY호스트 변수를 사용하는 것은 기본적으로 같으나, 한가지 다른점은 ARRAY변수를 사용할 경우, 선택적으로 “FOR”절을 사용해야 한다. 그리고 호스트변수와 ARRAY변수를 같은 문장에 사용하여서는 안된다. SELECT ... INTO문에서의 사용

  • SELECT ... INTO 문에서 사용시에는 리턴되는 데이타의 최대갯수를 알고 있어야 하고 그 최대 갯수 만큼의 ARRAY를 선언해야 한다. 위의 예에서 50개보다 많은 ROW가 리턴된다면 50개 이상의 데이타는 구할 수 없게 된다. 다시 SELECT .. INTO문을 실행한다면 또 다시 처음 50개의 ROW만 구해질 것이다. 동시에 ORACLE에러가 발생한다. ORA-02112: PCC: SELECT ... INTO return too many rows;

FETCH ... INTO 문에서의 사용

  • int emp_number[20]; float salary[20]; EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT empno, sal FROM emp; EXEC SQL OPEN emp_cursor; EXEC SQL WHENEVER NOT FOUND do break; while(1) { EXEC SQL FETCH emp_cursor INTO :emp_number, :salary; /* fetch된 row의 작업 */ .... } FETCH된 ROW의 갯수 sqlca.sqlerrd[2]에 저장되어 있다. 이 값은 각 fetch되는 cursor에 누적된 값이다. EXEC SQL OPEN cursor1; EXEC SQL OPEN cursor2; EXEC SQL FETCH cursor1 INTO :array_of_20; sqlca.sqlerrd[2]의 값 : 20 EXEC SQL FETCH cursor2 INTO :array_of_20; sqlca.sqlerrd[2]의 값 : 20 40이 아님. EXEC SQL FETCH cursor1 INTO :array_of_20; sqlca.sqlerrd[2]의 값 : 40 EXEC SQL FETCH cursor2 INTO :array_of_30; sqlca.sqlerrd[2]의 값 : 50

INSERT문에서의 사용

  • 호스트 ARRAY를 INSERT문의 입력변수로 사용할 수 있다. char emp_name[20][50]; int emp_number[50]; float salary[50]; EXEC SQL INSERT INTO EMP (ENAME, EMPNO, SAL) VALUES(:emp_name, :emp_number, :salary); 위에서는 한번의 INSERT문으로 50개의 ROW가 EMP테이블에 추가되었다. ARRAY의 데이타 전체가 유효하지 않다면 “FOR”절을 사용하여 데이타를 선택적으로 INSERT할 수 있다.

UPDATE문에서의 사용

  • 호스트ARRAY를 UPDATE문의 입력변수로 사용할 수 있다. int emp_number[50]; float salary[50]; EXEC SQL UPDATE emp SET sal = :salary WHERE EMPNO = :emp_number; ARRAY호스트 변수 중 유효하지 않은 것이 존재하면 "FOR"절을 사용하여 유효한 것만 UPDATE시킬 수 있다.

DELETE문에서의 사용

  • int emp_number[50]; EXEC SQL DELETE FROM emp WHERE empno = :emp_number;

Indicator Array변수의 사용

  • int emp_number[50]; int dept_number[50]; float commission[50]; short ind_comm[50]; EXEC SQL INSERT INTO emp (empno, deptno, comm) VALUES (:emp_number, :dept_number, :commission INDICATOR :ind_comm); Indicator변수의 array와 호스트변수의 array는 같아야 한다.

FOR절의 사용

  • INSERT, EXECUTE, FETCH, DELETE, OPEN, UPDATE 등에서 ARRAY호스트 변수를 사용할 경우 선택적으로 "FOR"절을 사용할 수 있다. 특히 INSERT, DELETE, UPDATE문에서는 유용하다. char emp_name[100]; short salary [100]; int rows_to_insert; rows_to_insert = 25; EXEC SQL FOR :rows_to_insert INSERT INTO emp (ename, salary) VALUES (:emp_name, :salary); /* 100개의 row중에 25개만 insert했다. */ "FOR"절은 UPDATE와 INSERT가 동시에 발생되는 TRANSACTION에서는 구현하기가 쉽다. ARRAY호스트 변수를 사용하면서 선택적으로 INSERT, UPDATE해야 하는 프로그램에서는 "FOR"절이 유용하게 사용된다.
  • 9. Structure Array 의 사용
  • 호스트 변수로 Structure Array를 사용할 수 있다. struct { char emp_name[11]; int emp_number; int dept_number; } emp_rec[3]; ....... EXEC SQL SELECT ename, empno, deptno INTO :emp_rec[1] FROM emp; .....
  • 10. Indicator변수의 사용
  • INDICATOR변수는 2바이트 정수형으로 선언되어야 하고 SQL문장에서는 ":"을 앞에 붙여 호스트변수의 바로 뒤에 기술한다. INDICATOR변수는 컬럼의 상태를 가지고 있다. -1 : 선택된 컬럼이 NULL이다. EXEC SQL BEGIN DECLARE SECTION; int emp_number; float salary, commission; short comm_ind; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT SAL, COMM INTO :salary, :commission:ind_comm FROM EMP WHERE EMPNO = :emp_number; if(ind_comm == -1 ) /* commission 컬럼이 NULL이다. */ pay = salary; else pay = salary + commission;

호스트 Indicator Structure변수의 사용

  • Indicator변수를 구조체 형식으로 사용할 수 있다. struct { char s_name[32]; int s_id; char grad_date[9]; } student_rec; struct { short s_name_ind; short s_id; short grade_date_ind; } student_rec_ind; EXEC SQL SELECT S_NAME, S_ID, GRADE_DATE INTO :student_rec:student_red_ind FROM STUDENT_LIST WHERE S_ID = '95034024';

중첩된 Structure구조의 변수는 사용하지 못한다.

 
SQL문 기본

데이타베이스에서 데이타를 질의한다.(Select)
데이타를 입력(Insert), 수정(Update), 삭제(Delete)한다.
데이타 구조를 생성(Create), 수정(Alter), 삭제(Drop)한다
데이타 액세스를 조절한다(Grant)

  • 1. SQL문의 종류
     

SQL문의 종류에는

  • DDL(Data Definition Language테이블/데이타의 구조를 조작하는 명령) DML(Data Manupulation Language : 데이타를 조작하는 명령) Session Control(세션을 제어하는 명령) System Control(시스템을 제어하는 명령) Transaction Control(트랜잭션을 제어하는 명령)

등이 있다. (아래 표 참고)

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

Data Definition Data Manupulation System Control
ALTER
ANALYZE
AUDIT
COMMENT
CREATE
DROP
GRANT
NOAUDIT
RENAME
REVOKE
TRUNCATE
DELETE
EXPLAIN PLAN
INSERT
LOCK TABLE
SELECT
UPDATE
ALTER SYSTEM
Transaction Control
COMMIT
ROLLBACK
SAVEPOINT
SET TRANSACTION
Session Control
ALTER SESSION
SET ROLE
Table 2-1. SQL문 종류

ALTER : 데이타베이스를 변경할 때 사용 ANALYZE : 데이타베이스의 통계자료를 생성시에 사용 AUDIT: SQL문을 auditing하기 위해 지정하는 명령. COMMENT : table, view, snapshot 또는 column에 관한 comment를 데이터 딕셔너리에 입력할 때 사용 CREATE : table, index, view, snapshot, cluster, database, database link 등과 같은 database object를 생성시에 사용 DROP : database object삭제하는 명령. RENAME : table, view, sequence, private synonym의 이름을 변경하는 명령. NOAUDIT :AUDIT에 의해 선택된 SQL문의 audit를 정지시키는 명령. REVOKE : object의 권한을 취소하는 명령. TRUNCATE : 테이블이나 cluster의 모든 row를 삭제하는 명령. DELETE : 테이블이나 view의 base테이블의 row를 삭제하는 명령 EXPLAIN PLAN : SQL문의 실행계획을 결정하는 명령. INSERT : 테이블, VIEW의 BASE테이블에 ROW를 추가하는 명령. LOCK TABLE : 1개 또는 여러 개의 테이블을 LOCK하는 명령. SELECT : 테이블, VIEW, SNAPSHOT에서 ROW를 구해오는 명령. UPDATE : TABLE, VIEW의 BASE TABLE의 존재하는 ROW의 값을 변경하는 명령. ALTER SESSION : 유저가 권한이 있는 세션을 제어하는 명령. SET ROLE : 현재의 세션의 ROLE을 ENABLE/DISABEL시키는 명령. ALTER SYSTEM : 오라클 인스턴스를 변경하는 명령. COMMIT: 현재의 트랜잭션을 종료하고, 트랜잭션 도중 변경되어진 데이타를 확정하는 명령. ROLLBACK : 현재의 트랜잭션을 취소하고 변경되어진 데이타를 변경전의 데이타로 복구. SAVEPOINT : 트랜잭션에서 나중에 ROLLBACK할 위치를 지정하는 명령. SET TRANSACTION : 현재의 트랜잭션에서 트랜잭션을 READ-ONLY로 하거나 READ-WRITE로 설정, 트랜잭션에서 사용될 ROLLBACK SEGMENT를 지정한다. TIP> SQLPLUS에서 HELP를 보는 방법

  • SQL>HELP [명령어] 하면 된다.
  • 2. 기본적인 SQL문

SELECT 한개 혹은 여려개의 테이블에서 ROW를 리턴한다. INSERT 테이블에 새로운 ROW를 추가한다. UPDATE 테이블의 ROW를 수정한다. DELETE 테이블에서 ROW를 삭제한다. 다음 SQL문들은 Embeddec SQL문에서 CURSOR를 정의하고 조작하는데 사용된다.

  • DECLARE CURSOR를 선언한다. ALLOCATE CURSOR변수에 메모리를 할당한다. OPEN QUERY를 사용가능하게 수행하여 active set을 생성한다. FETCH active set에서 각 ROW를 가져온다. CLOSE CURSOR를 종료한다.

SELECT 문 SELECT문에서 사용되는 예약어들은

  • INTO, FROM, WHERE , CONNECT BY, START WITH,GROUP BY,HAVING,ORDER BY, FOR UPDATE OF 등이 있다.
  • EXEC SQL SELECT ename, job, sal + 2000 INTO :emp_name, :job_title, :salary FROM emp WHERE empno = :emp_number;

INSERT문

  • EXEC SQL INSERT INTO emp (empno, ename, sal, deptno) VALUES ( :emp_number, :emp_name, :salary, :dept_number);

subquery의 사용

  • subquery는 INSERT문장이나 CREATE TABLE문장 뒤에서, UPDATE문의 컬럼을 명시하는 것으로 사용가능하다. EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno) SELECT empno, ename, sal, deptno from emp WHERE job = :job_title;

UPDATE문의 사용

  • EXEC SQL UPDATE emp SET sal = :salary, comm = :commission WHERE empno = :emp_number; UPDATE문에서도 subquery를 사용할 수 가 있는데 SET절에서 컬럼 뒤에 사용한다. EXEC SQL UPDATE emp SET sal = (SELECT AVG(sal) *1.1 FROM emp WHERE deptno = 20) WHERE empno = :emp_number;

DELETE문

  • EXEC SQL DELETE emp WHERE empno = :emp_number; INSERT를 제외한 SELECT, UPDATE, DELETE에서는 WHERE절을 사용가능한데, 이 WHERE절은 테이블의 특정한 ROW를 찾는 검색조건이다.
  • 3. CURSOR의 사용

여러 개의 ROW를 query할 경우 사용한다. CURSOR의 사용은 DECALRE, OPEN, FETCH, CLOSE의 4개의 명령으로 사용 가능하다. 처음에 DECALRE문으로 CURSOR를 선언한다. 커서의 선언은 명시적으로 SQL QUERY문에 커서의 이름을 대응시키는 것이다.

  • EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, empno, sal FROM emp WHERE deptno = :dept_number;

CURSOR명에는 하이픈(“-“)이 들어가는 안되고, 길이는 상관이 없는데 처음 31자는 의미가 있어야 한다. ANSI모드에서는 18자로 제한되어 있다. CURSOR를 정의한 SELECT문장에는 INTO절은 사용하지 않는다. 실제적으로 CURSOR를 실행하는 부분은 OPEN이다.

  • EXEC SQL OPEN emp_cursor;

커서를 DECLARE하기 전에 먼저 OPEN을 하면 OPEN에서 에러가 발생된다. 커서는 OPEN시점에서 실제적으로 QUERY를 수행하여 데이타를 추출한다. OPEN이 되었다면 데이타는 FETCH문으로 어플리케이션 프로그램으로 가져온다.

  • EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary;

이 FETCH문장은 더 이상 가져올 데이타가 없을 때까지 실행되어야 하니까, LOOP한에 위치하게 된다..

  • while(1){ EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary; if(sqlca.sqlcode == 1403) { printf("No Data Found !\n"); break; } else if(sqlca.sqlcode != 0 ) { printf(" Oracle Error Detected!!: %d\n%s\n", sqlca.sqlcode,sqlca.sqlerrmc); break; } printf("%s:%s:%d\n",emp_name, emp_number, salary); }

더 이상 데이타가 존재하지 않으면 CLOSE를 사용하여 커서를 FREE시켜야 한다.

  • EXEC SQL CLOSE emp_cursor;

이렇게 함으로써 커서가 점유하고 있던 resource를 데이타베이스에게 되돌려 준다. 위의 cursor의 사용을 그림으로 한다. 커서의 사용은 위의 그림과 같이 동작된다. 이 커서가 다시 사용된다면 CLOSE하지 말고 DECLARE에서 사용된 호스트 변수에 원하는 값을 다시 부여하고 OPEN부터 다시 수행시켜 PARSING의 부하를 줄일 수 있다. 커서는 재사용 될 수 있다.

  • EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, job FROM emp WHERE empname = :emp_number; while(1) { scanf(emp_number,"%s"); if(strcmp(deptno,"0")==0) break; EXEC SQL OPEN emp_cursor while(1) { EXEC SQL FETCH emp-cursor INTO :emp_name, :job_title; if(sqlca.sqlcode == 1403) break; if(sqlca.sqlcode != 0) { printf("ORACLE Error !!1 %d",sqlca.sqlcode); break; } printf("%s%s\n",emp_name, job_title); } } EXEC SQL CLOSE emp_cursor;
  • 4. 내부커서, 외부커서

오라클은 SQL문을 수행하기 위하여 PGA(Program Global Area)작업영역을 사용한다. PGA는 SQL문장 수행에 필요한 정보들을 저장하는 CURSOR에 의해 각 SQL문을 제어 하도록 구성되어 있다. 커서에는 내부 커서와 외부커서가 있다. 모든 DDL과 DML에 대해 내부적으로 커서를 생성시킨다. 그러나 다중처리 단위를 여러 번 수행시키고자 한다면 외부커서를 선언하여 사용해야만 한다. 내부커서

  • 오라클은 SQL문장에 대해서 무조건 내부 커서를 생성하며 이 커서는 보관 커서를 지정하지 않는 이상 DECLARE/OPEN/FETCH/CLOSE 작업을 매번 자동적으로 수행된다. 또한 한개의 ROW를 추출하는 문장이나 다중처리로 추출하는 경우도 마찬가지로 작동된다.

외부커서

  • 앞에서 살펴본 프로그래머가 커서를 선언하여 OPEN/FETCH/CLOSE를 하는 커서를 말한다.

HOLD_CURSOR의 사용 루프내에서 사용되어질 프로그램에 대해서는 파싱은 한번만 하면 된다. 그렇게 하기 위해서는 프로그래머가 임의적으로 HOLD_CURSOR, RELEASE_CURSOR옵션을 지정해 주어야만 내부커서를 보관할 수 있다. 만약 이렇게 보관시켜야 할 커서의 숫자가 10개가 넘어간다면 MAXOPENCURSOR 옵션을 늘려 주어야 한다. 이 옵션은 기본적으로 10개로 잡혀있다.

 
 
Dynamic SQL의 사용
보통의 어플리케이션 프로그램에서는 SQL문이 확정된 후 프로그램에 적용한다. 
그러나, 다이나믹 SQL의 사용하는 경우는 사용자의 입력에 의거해서 SQL문이 작성되거나 
다른 STATIC SQL문의 결과에 의해서 SQL문이 생성되는 경우 다이나믹SQL을 사용하게 된다.
  • 비교될 컬럼이 변경되는 경우(WHERE절), 참조할 테이블이 변경되어야 하는 경우, INSERT, UPDATE시의 컬럼이 변경되는 경우

이 있다.

 
Method
 
SQL문
 
1
 
QUERY문이 아니면서 호스트 변수가 없는 경우
 
2
 
QUERY문이 아니면서 호스트 변수가 정해지지 않은 경우
 
3
 
호스트 변수와 SELECT컬럼이 정해진 QUERY문인 경우
 
4
 
호스트 변수와 SELECT컬럼이 정해지지 않은 QUERY문인 경우
  • < Method 1 >

이 방법은 Dynamic SQL문을 작성하고 “EXECUTE IMMEDIATE”를 사용하여 즉시 실행한다. SQL문은 QUERY문이 아니어야 하고 - (SELECT문)- 입력용 호스트 변수가 존재하지 않아야 한다. Method 1은 SQL문이 매번 실행될 때마다 PARSING을 한다.

  • 'DELETE FROM EMP WHERE DEPTNO = 20' 'GRANT SELECT ON EMP TO scott'
  • < Method 2 >

이 방법은 Dynamic SQL문을 작성한 후 “PREPARE”와 “EXECUTE” 명령에 의해 실행한다. SQL문은 QUERY문이 아니어야 하고, 여기에서 사용된 호스트변수는 프리컴파일 시점에서는 데이타 타입과 위치는 정해져 있어야 한다.

  • 'INSERT INTO EMP (ENAME, JOB) VALUES (:emp_name, :job_title)' 'DELETE FROM EMP WHERE EMPNO = :emp_number

이 방법에서는 SQL문은 단 한번만 PARSING하게 되고 호스트 변수의 값을 달리하고 여러번 실행시킬 수 있다. CREATE나 GRANT같은 DDL 문은 PREPAREd된 후에 실행 할 수 있다.

  • < Method 3 >

이 방법은 Dynamic SQL문을 작성한 후 “PREPARE”, “DECALRE”, "OPEN", "FETCH", "CLOSE" 와 같은 커서 명령으로 실행한다. SELECT-LIST와 입력 호스트변수의 데이타타입과 위치는 프리컴파일 시점에서는 정해져야 한다. 이 방법은 query문이어야 한다.

  • 'SELECT DEPTNO, MIN(SAL), MAX(SAL) FROM EMP GROUP BY DEPTNO' 'SELECT ENAME, EMPNO FROM EMP WHERE DEPTNO = :dept_number'
  • < Method 4 >

이 방법은 실행 시점까지 SELECT-LIST와 호스트변수의 데이타 타입과 갯수, 위치를 모를 경우 사용하는 방법이다.

  • 'INSERT INTO EMP () VALUES ()' 'SELECT FROM EMP WHERE DEPTNO = 20'

위의 네가지 방법 모두 Dynamic SQL문을 charactor string에 저장하고, "EXEC SQL"과 ";"는 생략한다. Method 2와 3은 입력 호스트변수의 위치와 데이타타입을 프리컴파일 시점까지 정해져 있어야 한다. Method 4는 가장 유연성이 좋다. 반면에 복잡한 코딩이 들어가도 Dynamic SQL의 개념을 알고 있어야 하기 때문에 잘 사용하지 않는다. 보통 Method 4는 Method 1, 2, 3으로 해결 할 수 없는 경우에 사용한다. 만약 프리컴파일 옵션을 DBMS=V6나 DBMS=V6_CHAR인 경우 SQL문을 배열에 저장하기 전에 BLANK를 채워줘야 한다. 그렇게 함으로서 변수를 CLEAR해 준다. 특히 배열을 다른 SQL문에서 다시 사용할 경우에는 특히 중요하다. 항상 SQL문을 저장하기 전에 호스트 스트링을 초기화 해야 한다. 오라클에서는 NULL-TERNIMATE는 스트링의 마지막이라고 인식하지 못하고 SQL문의 일부로 인식하기 때문에 사용하여서는 안된다. 만일 프리컴파일 옵션을 DBMS=V7로 했을 경우, 스트링의 값은 "PREPARE", 또는 "EXECUTE IMMEDIATE"하기 전에 NULL-TERNIMATE로 끝을 맺어줘야 한다. DBMS옵션의 값을 개의치 않을 경우에는 다이나믹 SQL문을 저장할 변수로 VARCHAR를 쓸 경우, VARCHAR의 length를 "PREPARE"나 "EXECUTE IMMEDIATE"를 실행하기 전에 정확하게 SET해주어야 한다.>

  • 1. Method 1

결과값이 단순히 SUCCESS나 FAILURE인 간단하고 호스트변수를 사용하지 않는 다이나믹 SQL문일 경우 사용한다. 이 방법은 "EXECUTE IMMEDIATE"를 사용하여 다이나믹 SQL문을 실행시킨다.

  • EXEC SQL EXECUTE IMMEDIATE {:host_string | string_literal }; char sql_stmt[132]; .... for (;;) { printf("Enter SQL statement: "); gets(sql_stmt); if(*sql_stmt == '

    [oracle] [pro-c] Pro*C 프로그램 개요

    Pro*C 프로그램 개요

     

    <그림1> Embedded SQL Program 의 생성

     Pro*C는 PreCompiler로 SOURCE에 포함되어 있는 Embedded SQL문을 SQLLIB의 Function으로 
    SOURCE코드를 생성시켜 C SOURCE로 변환해 주는 프리 컴파일러이다. 
    
    • 3GL언어에서 SQL문(4GL언어)을 사용하여 보다 편하게 ORACLE을 직접 Access할 수 있도록 한다.
    • 어떤 SQL문장이든 수행가능하다.
    • 데이타베이스 테이블을 다이나믹하게 CREATE, ALTER, DROP한다.
    • Row를 SELECT, INSERT, UPDATE, DELETE 한다.
    • 트랜잭션을 COMMIT, ROLLBACK 한다.
    • PL/SQL을 실행 할 수 있다.
      Pro*C의 기초
       
      Embedded SQL 문
      어플리케이션에서 SQL문과 C문장과 C변수와 SQL문장의 구조를 모두 자유롭게 사용할
      수 있다. 호스트 프로그램에서 SQL문장을 사용할 경우 “EXEC SQL”이란 키워드를
      사용하여 SQL문을 시작하고 문장의 마지막에는 세미콜론(“;”)으로 종결되도록 한다.
      EXEC SQL로 시작하여 ‘;’로 종료하는 것이 Embedded SQL이다.
       
       
      선언(Declarative)
      명령 설명
      ARRAYLEN PL/SQL에서 호스트 array를 사용
      BEGIN DECLARE SECTION
       
      END DECLARE SECTION
       
      ANSI모드에서 호스트 변수를 사용하기 위한 명령
       
      DECLARE Oracle object의 이름 부여
      INCLUDE 현재위치에 파일 대치
      TYPE 데이터 타입의 동일화
      VAR 변수의 동일화
      WHENEVER
       
      Runtime에러 핸들링
       
       
       
      실행(Executable)
      ALLOCATE CURSOR변수에 영역할당 문장
      ALTER
      ANALYZE
      AUDIT
      COMMENT
      CONNECT
      CREATE
      DROP
      GRANT
      NOAUDIT
      RENAME
      REVOKE
      TRUNCATE
      CLOSE
      오라클의 정의, 오라클에 접속제어 문장
      DELETE
      FETCH
      INSERT
      LOCK TABLE
      OPEN
      SELECT
      UPDATE
      EXPLAIN PLAN
      데이터 조작 및 데이타 추출 문
      COMMIT
      ROLLBACK
      SAVEPOINT
      SET TRANSACTION
      트랜잭션 제어문
      DESCRIBE
      EXECUTE
      PREPARE
      Dynamic SQL사용을 위한 문
      ALTER SESSION
      SET ROLE
      세션 제어문
       
       
      Table 2-1 Embedded SQL문
       
      Embedded SQL의 사용
      SQL문들은 C문장과 자유롭게 혼용하여 사용할 수 있다. 다만 위의 SQL문들의 앞에 “EXE SQL”이라는 단어를 먼저 쓰고 문장의 마지막에 세미콜론(“;”)을 사용하면 된다. Pro*C 프리컴파일러는 “EXE SQL”로 시작하는 문장을 ORACLE 런타임 라이브러리 SQLLIB를 CALL하는 문장으로 변환해 준다. ROLLBACK WORK; : Interactive EXEC SQL ROLLBACK WORK : Embedded SQL 위의 두 문장은 똑같은 결과를 나타낸다. 첫번째 문장은 Interactive SQL환경에서 사용하고 (SQL*Plus) 두번째 문장은 Pro*C 프로그램에서 사용한다.
      Static 대 Dynamic SQL문
      대부분의 응용프로그램은 static SQL문과 고정된 트랜잭션을 사용하지만 프로그램에 따라서 Dynamic SQL을 사용할 수 도 있다. STATIC SQL문은 각 SQL문들이 실행되어지기 전에 어떤 SQL명령이 수행되고, 또 어떤 데이타베이스 테이블이 변경되는지, 어떤 컬럼이 UPDATE되는지 알고 있다. 반면에 DYNAMIC SQL은 어플리케이션 프로그램이 실행되는 시점에서 SQL문장을 만들어 실행하게 프로그램 해야 할 경우 사용한다. 이것은 실행되는 시점에서만 어떤 SQL이 수행되는지 알 수 있다.
       
      Embedded PL/SQL블럭의 사용
      Pro*C 컴파일러는 Embedded PL/SQL문장을 Embedded SQL문장과 같이 다룬다. PL/SQL은 모든 데이터 조작과 트랜잭션 제어SQL문을 사용할 수 있기 때문에 Embedded PL/SQL에서는 ORACLE의 데이타를 유연하고 안전하게 사용할 수 있다.
       
      호스트변수와 Indicator변수
      호스트변수는 오라클과 프로그램사이의 데이타나 상태를 주고 받는데 사용되는 변수이다. 호스트변수는 Pro*C프로그램 어디서나 사용가능하나. 단 SQL문 내에서는 콜론(‘:’)을 앞에 붙여 사용한다. 호스트변수에는 C의 Struct 가지는 것이 있다. (VARCHAR 타입) Indicator변수는 short integer형으로 호스트변수에 콜론으로 붙여 호스트변수의 상태나 값을 얻고자 할 경우 사용한다.
       
      HOST VARIABLE
      호스트변수는 오라클 데이타베이스와 어플리케이션 프로그램사이에 데이터 통신을 담당한다.
      호스트변수는 오라클과 어플리케이션이 공유하쫍부 늴분으로 같이 참조할 수 있다.
      호스트변수를 사용하여 오라클에 데이타를 전달하고, 또 오라클 데이타베이스에서 데이터 또는 
      상태정보를 프로그램으로 받을 수 있다.
      Embedded SQL문장에서 HOST변수는 콜론(“:”)을 변수 앞에 붙여서 사용한다.
      
     
     
    Pro*C에서 변수의 사용
    1. 데이터의 Type

    데이타 타입

    C변수 타입 설명
    char single charactor
     
    char[n]
     
    n-charactor array(string)
     
    Int
     
    integer
     
    Short
     
    small integer
     
    Long
     
    large integer
     
    Float
     
    floating-point number(usually single precision)
     
    Double
     
    floating-point number(always double precision)
     
    VARCHAR[n]
     
    variable-length string
     
     
    <table 3-1>호스트 변수를 위한 C데이타 타입

     

    • C와 Oracle 데이타 타입 호환성
    Internal Type(Oracle) C Type 설명
    VARCHAR2(Y)(Y:1~2000)
     
    char
     
    single charactor
     
    CHAR(X)(X:1~255)
    char[n]
    VARCHAR[n]
    int
    short
    float
    n-byte charactor array
    n-byte variable-length charactor array
    integer
    small integer
     
    NUMBER
    NUMBER(P,S)
    int
    short
    long
    float
    double
    char
    char[n]
    VARCHAR[n]
    integer
    small integer
    large integer
    floating-point number
    double-precision floating-point number
    single character
    n-byte character array
    n-byte variable-length character array
    DATE
    char[n]
    VARCHAR[n]
    n-byte character array
    n-byte variable-length character array
    LONG
    char[n]
    VARCHAR[n]
    n-byte character array
    n-byte variable-length character array
    RAW(X)
    unsigned char[n]
    VARCHAR[n]
    n-byte character array
    n-byte variable-length character array
    LONG LAW
    unsigned char[n]
    VARCHAR[n]
    n-byte character array
    n-byte variable-length character array
    ROWID
    unsigned char[n]
    VARCHAR[n]
    n-byte character array
    n-byte variable-length character array
    MLSLABEL
    unsigned char[n]
    VARCHAR[n]
    n-byte character array
    n-byte variable-length character array
    Notes:
    
    • X : 1~255 사이의 값 default 1 Y : 1~2000사이의 값 P : 2~38 , S : -84~127사이의 값
    <table 3-2> C와 Oracle 데이타 타입 호환성
     
    • 2. Internal Data Type - 오라클 데이타 타입
    문자 데이타 타입
    - char와 varchar2 datatype은 alphanumeric data로 저장.
    - database character set은 database를 생성할때 만들어지며 변경할 수 없다.
    ⓛ char datatype
    
    • - fixed-length character strings. - table을 생성할때 칼럼길이가 정의되며 1~255 bytes.(default 1) - table의 row를 insert나 update할때 char 칼럼은 고정된 length를 가짐. - 정해진 값보다 짧은 값이 입력되면 정해진 length만큼 이후는 blank가 채워짐. - trailing blank를 가진 정해진 값보다 긴 값이 입력되면 고정된 길이 내에서 trailing blank가 잘림. 정해진 길이보다 긴 값이 입력되면 오라클은 에러를 return.

    ② Varchar2 datatype

    • - variable-length character strings. - maximum 칼럼 length는 1~2000 bytes. - 입력된 길이 만큼만 저장됨.

    ③ Varchar datatype

    • - varchar2 datatype 과 현재는 동일함. - 향후 오라클에서는 다른 용도로 사용계획. (varchar2를 사용하는 것이 향후에 유리)
    • 3. 어떻게 데이타 타입을 정할 것인가?

    Semantics 비교

    • ANSI처럼 trailing blank 가 중요한 역할을 하지 않을때는 char사용. trailing blank 가 중요한 역할을 담당할때는 varchar2 사용. 효과적인 데이터 저장을 위해서는 varchar2 가 유리. char datatype은 blank-pad를 하고 trailing blank를 fix 된 칼럼 길이 만큼 blank를 채워 저장. varchar2는 blank를 저장하지 않음.
      • blank-pad : 'a'='a ', non-pad 'a '>'a' Future Compatibility
      char와 varchar2 datatype은 지원이 되지만 varchar datatype는 향후 어떤 용도로 사용될지 모르기 때문에 사용하지 않는것이 좋다.

    Number 데이타 타입

    • fixed floating-point number로 저장. number (precision, scale)
      • precision-scale= 왼쪽정수의 수,scale은 오른쪽 소수이하의 수. (단,scale이 +일 경우) 38digits 까지 저장가능.
      scale은 -84~127사이 ① Internal numeric format
      • variable-length format. 38digits 까지 저장가능. 지수가 1bytes 일때 가수는 20bytes까지 가능. (38digit/2)+1=20bytes 4.12×10E2 일때 지수 1 bytes 차지 4,1,2 2bytes 차지. (3digits /2)=1.5 1+1=2bytes 지수의 범위는 -130~125 사이

    Date 데이타타입

    • point-in-time value 으로 저장. Jan 1,4712 BC ~ Dec 31,4712 AD (AD가 default) 기본형태는 DD-MON-YY 기본 형태에서 벗어나는 날짜를 사용할때는 TO_DATE function을 사용. TO_DATE ('November 13,1992', 'MONTH DD,YYYY') ⓛ Julian date 01-01-4712 BC부터 원하는 날까지의 날수 계산시 사용. format mask “J" 사용. TO_DATE 와 TO_CHAR fuction을 사용하여 date datatype과 상호 convert가능. select to_char (hiredate, 'J') from emp; (date type인 hiredate를 julian date로 convert) insert into emp (hiredate) values (to_date(2448921, 'J')); (julian date인 2448921을 date datatype으로 변환하여 hiredate 칼럼에 insert.)

    Long 데이타타입

    • variable-length character data 2 gigabytes 까지의 data 저장. long data는 text data 이고 다른 시스템으로 옮길때 convert되어짐. 주로 comment 등에 사용되어지는 datatype. 사용자가 특별히 지정하지 않으면 80 bytes 만 출력. 하나의 테이블에는 오직 하나의 long datatype 만 존재. not (null)을 제외한 다른 제약조건은 지정할 수 없음. 조건절에서 사용되어 다른 것과 비교될수 없으며 인덱스를 만들수 없음. select 문 내에서 where의 조건, group by, order by등의 각종 함수를 사용할 수 없음. 계산식에서 사용될 수 없음.

    RAW and Long RAW

    • RAW와 long raw datatype은 다른 시스템으로 상호 convert 되지 않는 data 에 사용. long raw 는 graphics,sound,documents,arrays of binary data를 저장하는데 사용. long raw는 2Gbytes 까지 저장이 가능하고, raw는 255bytes까지 저장. long raw는 인덱스가 불가능하고 raw 는 인덱스가 가능. raw나 long raw와 char 상호 자동 convert 되며 binary data는 hexadecimal form 으로 표현. * long raw의 경우는 2Gbytes나 되기 때문에 인덱스를 한다면 많은 시간과 시스템 부하를 초래.

    ROWID and ROWID datatype

    • 실제 row가 존재하는 테이블에는 rowid가 없으며 인덱스에만 rowid가 존재. non-clustered table 에 존재하는 각 row는 physical 한 address에 대한 unique 한 rowid가 존재. clustered table의 경우에는 같은 data block에 존재하는 다른 table의 row는 같은 rowid 를 가질수 있음. row에 할당된 rowid는 import나 export utility를 사용하여 import나 export 되지 않는 한 변경되지 않음. table 로부터 row를 삭제할 때 그 row에 할당된 rowid는 다음에 insert되는 row에 할당됨. rowid는 database 에 저장되지도 않고, database data도 아님.

    MLSLABEL datatype

    • trusted oracle에서 제공. 이 datatype 은 binary format의 operating system label을 저장할때 사용. data dictionary에 있는 binary label에 대한 map을variable-length tag 형태로 저장. (row당 2~5bytes) binary label 대신 representative tag로 저장되는 것은 binary operating system label이 매우 크기 때문. (space 사용에 효과적.)
    • 4. DATA conversion

    여러 function 을 이용하여 오라클은 자동으로 datatype을 convert한다.

     

    RULE 1: Assignment

    • assignment에 의하여 오라클은 자동으로 다음을 convert 한다. varchar2 or char to number number to varchar2 varchar2 or char to date · date to varchar2 · varchar2 or char to rowid · rowid to varchar2 · varchar2 or char to label · label to varchar2 · varchar2 or char to hex   ② RULE 2 : Expression evaluation - expression evaluation에 의하여 오라클은 자동으로 다음을 convert한다. · varchar2 or char to number · varchar2 or char to date   variable :=expression 의 경우 오라클은 먼저 rule2를 사용하여 expression을 계산. 성공적으로 계산이 되면 하나의 value값이 나오고 datatype을 가짐. 이 다음에 rule1을 사용하여 이 value 값을 assignment's target에 할당하려고 함. * char to number conversion은 character string이 유효숫자를 가질 때만 가능. char to date 역시 character string이 date 기본 format인 DD-MON-YY를 가질 때 가능.
    • 5. 데이타 타입의 동격화(Datatype Equivalencing)

    예를 들어 VARCHAR변수가 있다. 이 변수는 C의 Structure구조로 되어 있기 때문에 Embedded SQL을 제외하고 일반 C언어에서 VARCHAR로 선언된 호스트 변수를 참조하려면 구조체(Structure)형식으로 참조를 해야만 한다. VARCHAR경우에는 내부적으로 아래와 같이 구성되어 있다.

    • typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; /* VARCHAR형으로 선언된 호스트 변수의 실제모습 */ VARCHAR user_name[20]; struct { unsigned short len; /* 호스트 변수의 길이 저장 */ unsigned char arr[1]; /* 호스트 변수 데이타 저장 */ } user_name;

    그렇기 때문에 VARCHAR형으로 선언된 호스트 변수는 실제 데이타가 있는 부분(arr[])과 호스트변수가 포함하는 문자열의 길이(len)을 포함한다. 실제로 이 호스트 변수를 참조하는 방법은

    • strcpy((char *) user_name.arr, "EDU"); user_name.len = strlen(user_name.arr);

    VARCHAR로 선언된 호스트 변수를 데이타베이스에 사용 시 출력용일 때 : SELECT INTO문에서는 구조체내의 arr과 len에는 데이타 베이스의 값이 저장되어 출력된다. 사용자는 참조만 하면 된다. 입력용일 때 : 조건절(WHERE절)에서 사용, INSERT, UPDATE에서 사용하여 정확한 답을 얻으려면 길이(LEN)를 지정해 주어야만 한다. 우리가 Pro*C프로그램에서 자주 부딪치는 부분중의 하나이다. 이런 문제 해결을 위해서 데이타 타입의 동격화가 있다. (Data Equivalencing) STRING으로 동격화 시켜주는 것이다. 데이타 타입의 동격화의 문법과 예는 아래에 있다.

    • 데이타 타입의 동격화(Datatype Equivalencing)의 사용

    데이타 타입 동격화는 오라클이 입력 데이터의 해석 방법을 프로그래머가 원하는 데로 변경시키는 것이다.

    • EXEC SQL VAR 호스트 변수명 IS 외부데이타타입[(길이:길이, 소숫점이하 길이)]]; EXEC SQL BEGIN DECLARE SECTION; char emp_name[11]; EXEC SQL VAR emp_name IS STRING(11); char emp_job[11]; EXEC SQL VAR emp_job IS STRING(11); char emp_ename[100][11]; EXEC SQL VAR emp_ename IS STRING(11); /* ARRAY 변수 정의 */ EXEC SQL END DECLARE SECTION;

    선언된 하나 하나의 호스트 변수마다 동격화를 시킬 수 있고, Pro*C에서는 user defined datatype으로 외부 테이타타입으로 한번에 변경시킬 수 있다.

    • EXEC SQL TYPE 사용자정의타입 IS 외부데이타타입 [(길이)] [REFERENCE]; typedef char asciz[350]; EXEC SQL BEGIN DECLARE SECTION; EXEC SQL TYPE asciz IS STRING(350) REFERENCE; asciz catalog_cd[100]; /* ARRAY 변수 정의 */ asciz factor_cd1; asciz factor_cd2; asciz factor_cd3; asciz factor_cd4; asciz factor_cd5; EXEC SQL END DECLARE SECTION;
    • 6. PreProcessor의 사용

    C에서 사용된 문법으로 PreProcessor시에 참조되어 포함 또는 포함되지 않는 값들을 나타낸다.

    • #define : 매크로를 정의한다. #include : 현위치에 문장 다음에 나오는 화일을 대치시킨다. #ifdef : 뒤에 따라오는 상수가 이전에 정의되어 있으면 문장 이후에 나오는 source코드를 포함하여 컴파일한다. #ifndef : 뒤에 따라오는 상수가 이전에 정의되지 않았으며 문장 이후에 나오는 source 코드들을 컴파일에 포함시키지 않는다. #endif : #ifdef, #ifndef의 끝을 나타낸다. #elif : #ifdef, #ifndef의 다음 조건을 나타낸다. <예> #define NAME_LEN 20 #define PASS_LEN 20 VARCHAR uname[NAME_LEN]; VARCHAR passwd[PASS_LEN];
    • 7. 구조체 변수의 사용

    Pro*C 2.0이상에서는 구조체 형식의 호스트 변수를 사용할 수 있다. 이렇게 사용함으로써 일일이 호스트 변수를 열거하지 않아도 된다. 선언

    • #define UNAME_LEN 20 struct { VARCHAR emp_name[UNAME_LEN] float salary; float commission; } emprec;

    사용(SELECT .. INTO)

    • EXEC SQL SELECT ename, sal, comm INTO :emprec FROM EMP WHERE EMPNO = :emp_number;
    • 8. Array 호스트 변수의 사용

    데이타베이스를 ACCESS속도를 향상시킨다.

    • char emp_name[10][50]; int emp_number[50]; double salary[50];

    예를 들어 300건의 자료를 테이블에 INSERT할 경우 ARRAY를 사용하지 않으면 300번의 INSERT가 발생하게 된다. 만약 ARRAY를 사용하면 1번의 INSERT문만 실행시키면 된다.

    • int hi_lo_scores[25][25];

    쉽게 프로그래밍 할 수 있다.

    • ARRAY변수의 선언

    위와 같이 선언하면 된다. 아래와 같은 2차원 array는 허용되지 않는다.

    • char emp_name[20][50]; int emp_number[50]; double salary[50]; EXEC SQL SELECT ENAME, EMPNO, SAL INTO :emp_name, :emp_number, :salary FROM EMP WHERE SAL > 1000;

    INSERT, UPDATE, DELETE문장의 입력 변수에 호스트 Array를 사용할 수 있고, SELECT나 FETCH의 INTO절의 출력 변수에 사용할 수 있다. 호스트변수를 사용하는 것과 ARRAY호스트 변수를 사용하는 것은 기본적으로 같으나, 한가지 다른점은 ARRAY변수를 사용할 경우, 선택적으로 “FOR”절을 사용해야 한다. 그리고 호스트변수와 ARRAY변수를 같은 문장에 사용하여서는 안된다. SELECT ... INTO문에서의 사용

    • SELECT ... INTO 문에서 사용시에는 리턴되는 데이타의 최대갯수를 알고 있어야 하고 그 최대 갯수 만큼의 ARRAY를 선언해야 한다. 위의 예에서 50개보다 많은 ROW가 리턴된다면 50개 이상의 데이타는 구할 수 없게 된다. 다시 SELECT .. INTO문을 실행한다면 또 다시 처음 50개의 ROW만 구해질 것이다. 동시에 ORACLE에러가 발생한다. ORA-02112: PCC: SELECT ... INTO return too many rows;

    FETCH ... INTO 문에서의 사용

    • int emp_number[20]; float salary[20]; EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT empno, sal FROM emp; EXEC SQL OPEN emp_cursor; EXEC SQL WHENEVER NOT FOUND do break; while(1) { EXEC SQL FETCH emp_cursor INTO :emp_number, :salary; /* fetch된 row의 작업 */ .... } FETCH된 ROW의 갯수 sqlca.sqlerrd[2]에 저장되어 있다. 이 값은 각 fetch되는 cursor에 누적된 값이다. EXEC SQL OPEN cursor1; EXEC SQL OPEN cursor2; EXEC SQL FETCH cursor1 INTO :array_of_20; sqlca.sqlerrd[2]의 값 : 20 EXEC SQL FETCH cursor2 INTO :array_of_20; sqlca.sqlerrd[2]의 값 : 20 40이 아님. EXEC SQL FETCH cursor1 INTO :array_of_20; sqlca.sqlerrd[2]의 값 : 40 EXEC SQL FETCH cursor2 INTO :array_of_30; sqlca.sqlerrd[2]의 값 : 50

    INSERT문에서의 사용

    • 호스트 ARRAY를 INSERT문의 입력변수로 사용할 수 있다. char emp_name[20][50]; int emp_number[50]; float salary[50]; EXEC SQL INSERT INTO EMP (ENAME, EMPNO, SAL) VALUES(:emp_name, :emp_number, :salary); 위에서는 한번의 INSERT문으로 50개의 ROW가 EMP테이블에 추가되었다. ARRAY의 데이타 전체가 유효하지 않다면 “FOR”절을 사용하여 데이타를 선택적으로 INSERT할 수 있다.

    UPDATE문에서의 사용

    • 호스트ARRAY를 UPDATE문의 입력변수로 사용할 수 있다. int emp_number[50]; float salary[50]; EXEC SQL UPDATE emp SET sal = :salary WHERE EMPNO = :emp_number; ARRAY호스트 변수 중 유효하지 않은 것이 존재하면 "FOR"절을 사용하여 유효한 것만 UPDATE시킬 수 있다.

    DELETE문에서의 사용

    • int emp_number[50]; EXEC SQL DELETE FROM emp WHERE empno = :emp_number;

    Indicator Array변수의 사용

    • int emp_number[50]; int dept_number[50]; float commission[50]; short ind_comm[50]; EXEC SQL INSERT INTO emp (empno, deptno, comm) VALUES (:emp_number, :dept_number, :commission INDICATOR :ind_comm); Indicator변수의 array와 호스트변수의 array는 같아야 한다.

    FOR절의 사용

    • INSERT, EXECUTE, FETCH, DELETE, OPEN, UPDATE 등에서 ARRAY호스트 변수를 사용할 경우 선택적으로 "FOR"절을 사용할 수 있다. 특히 INSERT, DELETE, UPDATE문에서는 유용하다. char emp_name[100]; short salary [100]; int rows_to_insert; rows_to_insert = 25; EXEC SQL FOR :rows_to_insert INSERT INTO emp (ename, salary) VALUES (:emp_name, :salary); /* 100개의 row중에 25개만 insert했다. */ "FOR"절은 UPDATE와 INSERT가 동시에 발생되는 TRANSACTION에서는 구현하기가 쉽다. ARRAY호스트 변수를 사용하면서 선택적으로 INSERT, UPDATE해야 하는 프로그램에서는 "FOR"절이 유용하게 사용된다.
    • 9. Structure Array 의 사용
    • 호스트 변수로 Structure Array를 사용할 수 있다. struct { char emp_name[11]; int emp_number; int dept_number; } emp_rec[3]; ....... EXEC SQL SELECT ename, empno, deptno INTO :emp_rec[1] FROM emp; .....
    • 10. Indicator변수의 사용
    • INDICATOR변수는 2바이트 정수형으로 선언되어야 하고 SQL문장에서는 ":"을 앞에 붙여 호스트변수의 바로 뒤에 기술한다. INDICATOR변수는 컬럼의 상태를 가지고 있다. -1 : 선택된 컬럼이 NULL이다. EXEC SQL BEGIN DECLARE SECTION; int emp_number; float salary, commission; short comm_ind; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT SAL, COMM INTO :salary, :commission:ind_comm FROM EMP WHERE EMPNO = :emp_number; if(ind_comm == -1 ) /* commission 컬럼이 NULL이다. */ pay = salary; else pay = salary + commission;

    호스트 Indicator Structure변수의 사용

    • Indicator변수를 구조체 형식으로 사용할 수 있다. struct { char s_name[32]; int s_id; char grad_date[9]; } student_rec; struct { short s_name_ind; short s_id; short grade_date_ind; } student_rec_ind; EXEC SQL SELECT S_NAME, S_ID, GRADE_DATE INTO :student_rec:student_red_ind FROM STUDENT_LIST WHERE S_ID = '95034024';

    중첩된 Structure구조의 변수는 사용하지 못한다.

     
    SQL문 기본
    
    데이타베이스에서 데이타를 질의한다.(Select)
    데이타를 입력(Insert), 수정(Update), 삭제(Delete)한다.
    데이타 구조를 생성(Create), 수정(Alter), 삭제(Drop)한다
    데이타 액세스를 조절한다(Grant)
    
    
    • 1. SQL문의 종류
       

    SQL문의 종류에는

    • DDL(Data Definition Language테이블/데이타의 구조를 조작하는 명령) DML(Data Manupulation Language : 데이타를 조작하는 명령) Session Control(세션을 제어하는 명령) System Control(시스템을 제어하는 명령) Transaction Control(트랜잭션을 제어하는 명령)

    등이 있다. (아래 표 참고)

    Data Definition Data Manupulation System Control
    ALTER
    ANALYZE
    AUDIT
    COMMENT
    CREATE
    DROP
    GRANT
    NOAUDIT
    RENAME
    REVOKE
    TRUNCATE
    DELETE
    EXPLAIN PLAN
    INSERT
    LOCK TABLE
    SELECT
    UPDATE
    ALTER SYSTEM
    Transaction Control
    COMMIT
    ROLLBACK
    SAVEPOINT
    SET TRANSACTION
    Session Control
    ALTER SESSION
    SET ROLE
    Table 2-1. SQL문 종류

    ALTER : 데이타베이스를 변경할 때 사용 ANALYZE : 데이타베이스의 통계자료를 생성시에 사용 AUDIT: SQL문을 auditing하기 위해 지정하는 명령. COMMENT : table, view, snapshot 또는 column에 관한 comment를 데이터 딕셔너리에 입력할 때 사용 CREATE : table, index, view, snapshot, cluster, database, database link 등과 같은 database object를 생성시에 사용 DROP : database object삭제하는 명령. RENAME : table, view, sequence, private synonym의 이름을 변경하는 명령. NOAUDIT :AUDIT에 의해 선택된 SQL문의 audit를 정지시키는 명령. REVOKE : object의 권한을 취소하는 명령. TRUNCATE : 테이블이나 cluster의 모든 row를 삭제하는 명령. DELETE : 테이블이나 view의 base테이블의 row를 삭제하는 명령 EXPLAIN PLAN : SQL문의 실행계획을 결정하는 명령. INSERT : 테이블, VIEW의 BASE테이블에 ROW를 추가하는 명령. LOCK TABLE : 1개 또는 여러 개의 테이블을 LOCK하는 명령. SELECT : 테이블, VIEW, SNAPSHOT에서 ROW를 구해오는 명령. UPDATE : TABLE, VIEW의 BASE TABLE의 존재하는 ROW의 값을 변경하는 명령. ALTER SESSION : 유저가 권한이 있는 세션을 제어하는 명령. SET ROLE : 현재의 세션의 ROLE을 ENABLE/DISABEL시키는 명령. ALTER SYSTEM : 오라클 인스턴스를 변경하는 명령. COMMIT: 현재의 트랜잭션을 종료하고, 트랜잭션 도중 변경되어진 데이타를 확정하는 명령. ROLLBACK : 현재의 트랜잭션을 취소하고 변경되어진 데이타를 변경전의 데이타로 복구. SAVEPOINT : 트랜잭션에서 나중에 ROLLBACK할 위치를 지정하는 명령. SET TRANSACTION : 현재의 트랜잭션에서 트랜잭션을 READ-ONLY로 하거나 READ-WRITE로 설정, 트랜잭션에서 사용될 ROLLBACK SEGMENT를 지정한다. TIP> SQLPLUS에서 HELP를 보는 방법

    • SQL>HELP [명령어] 하면 된다.
    • 2. 기본적인 SQL문

    SELECT 한개 혹은 여려개의 테이블에서 ROW를 리턴한다. INSERT 테이블에 새로운 ROW를 추가한다. UPDATE 테이블의 ROW를 수정한다. DELETE 테이블에서 ROW를 삭제한다. 다음 SQL문들은 Embeddec SQL문에서 CURSOR를 정의하고 조작하는데 사용된다.

    • DECLARE CURSOR를 선언한다. ALLOCATE CURSOR변수에 메모리를 할당한다. OPEN QUERY를 사용가능하게 수행하여 active set을 생성한다. FETCH active set에서 각 ROW를 가져온다. CLOSE CURSOR를 종료한다.

    SELECT 문 SELECT문에서 사용되는 예약어들은

    • INTO, FROM, WHERE , CONNECT BY, START WITH,GROUP BY,HAVING,ORDER BY, FOR UPDATE OF 등이 있다.
    • EXEC SQL SELECT ename, job, sal + 2000 INTO :emp_name, :job_title, :salary FROM emp WHERE empno = :emp_number;

    INSERT문

    • EXEC SQL INSERT INTO emp (empno, ename, sal, deptno) VALUES ( :emp_number, :emp_name, :salary, :dept_number);

    subquery의 사용

    • subquery는 INSERT문장이나 CREATE TABLE문장 뒤에서, UPDATE문의 컬럼을 명시하는 것으로 사용가능하다. EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno) SELECT empno, ename, sal, deptno from emp WHERE job = :job_title;

    UPDATE문의 사용

    • EXEC SQL UPDATE emp SET sal = :salary, comm = :commission WHERE empno = :emp_number; UPDATE문에서도 subquery를 사용할 수 가 있는데 SET절에서 컬럼 뒤에 사용한다. EXEC SQL UPDATE emp SET sal = (SELECT AVG(sal) *1.1 FROM emp WHERE deptno = 20) WHERE empno = :emp_number;

    DELETE문

    • EXEC SQL DELETE emp WHERE empno = :emp_number; INSERT를 제외한 SELECT, UPDATE, DELETE에서는 WHERE절을 사용가능한데, 이 WHERE절은 테이블의 특정한 ROW를 찾는 검색조건이다.
    • 3. CURSOR의 사용

    여러 개의 ROW를 query할 경우 사용한다. CURSOR의 사용은 DECALRE, OPEN, FETCH, CLOSE의 4개의 명령으로 사용 가능하다. 처음에 DECALRE문으로 CURSOR를 선언한다. 커서의 선언은 명시적으로 SQL QUERY문에 커서의 이름을 대응시키는 것이다.

    • EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, empno, sal FROM emp WHERE deptno = :dept_number;

    CURSOR명에는 하이픈(“-“)이 들어가는 안되고, 길이는 상관이 없는데 처음 31자는 의미가 있어야 한다. ANSI모드에서는 18자로 제한되어 있다. CURSOR를 정의한 SELECT문장에는 INTO절은 사용하지 않는다. 실제적으로 CURSOR를 실행하는 부분은 OPEN이다.

    • EXEC SQL OPEN emp_cursor;

    커서를 DECLARE하기 전에 먼저 OPEN을 하면 OPEN에서 에러가 발생된다. 커서는 OPEN시점에서 실제적으로 QUERY를 수행하여 데이타를 추출한다. OPEN이 되었다면 데이타는 FETCH문으로 어플리케이션 프로그램으로 가져온다.

    • EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary;

    이 FETCH문장은 더 이상 가져올 데이타가 없을 때까지 실행되어야 하니까, LOOP한에 위치하게 된다..

    • while(1){ EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary; if(sqlca.sqlcode == 1403) { printf("No Data Found !\n"); break; } else if(sqlca.sqlcode != 0 ) { printf(" Oracle Error Detected!!: %d\n%s\n", sqlca.sqlcode,sqlca.sqlerrmc); break; } printf("%s:%s:%d\n",emp_name, emp_number, salary); }

    더 이상 데이타가 존재하지 않으면 CLOSE를 사용하여 커서를 FREE시켜야 한다.

    • EXEC SQL CLOSE emp_cursor;

    이렇게 함으로써 커서가 점유하고 있던 resource를 데이타베이스에게 되돌려 준다. 위의 cursor의 사용을 그림으로 한다. 커서의 사용은 위의 그림과 같이 동작된다. 이 커서가 다시 사용된다면 CLOSE하지 말고 DECLARE에서 사용된 호스트 변수에 원하는 값을 다시 부여하고 OPEN부터 다시 수행시켜 PARSING의 부하를 줄일 수 있다. 커서는 재사용 될 수 있다.

    • EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, job FROM emp WHERE empname = :emp_number; while(1) { scanf(emp_number,"%s"); if(strcmp(deptno,"0")==0) break; EXEC SQL OPEN emp_cursor while(1) { EXEC SQL FETCH emp-cursor INTO :emp_name, :job_title; if(sqlca.sqlcode == 1403) break; if(sqlca.sqlcode != 0) { printf("ORACLE Error !!1 %d",sqlca.sqlcode); break; } printf("%s%s\n",emp_name, job_title); } } EXEC SQL CLOSE emp_cursor;
    • 4. 내부커서, 외부커서

    오라클은 SQL문을 수행하기 위하여 PGA(Program Global Area)작업영역을 사용한다. PGA는 SQL문장 수행에 필요한 정보들을 저장하는 CURSOR에 의해 각 SQL문을 제어 하도록 구성되어 있다. 커서에는 내부 커서와 외부커서가 있다. 모든 DDL과 DML에 대해 내부적으로 커서를 생성시킨다. 그러나 다중처리 단위를 여러 번 수행시키고자 한다면 외부커서를 선언하여 사용해야만 한다. 내부커서

    • 오라클은 SQL문장에 대해서 무조건 내부 커서를 생성하며 이 커서는 보관 커서를 지정하지 않는 이상 DECLARE/OPEN/FETCH/CLOSE 작업을 매번 자동적으로 수행된다. 또한 한개의 ROW를 추출하는 문장이나 다중처리로 추출하는 경우도 마찬가지로 작동된다.

    외부커서

    • 앞에서 살펴본 프로그래머가 커서를 선언하여 OPEN/FETCH/CLOSE를 하는 커서를 말한다.

    HOLD_CURSOR의 사용 루프내에서 사용되어질 프로그램에 대해서는 파싱은 한번만 하면 된다. 그렇게 하기 위해서는 프로그래머가 임의적으로 HOLD_CURSOR, RELEASE_CURSOR옵션을 지정해 주어야만 내부커서를 보관할 수 있다. 만약 이렇게 보관시켜야 할 커서의 숫자가 10개가 넘어간다면 MAXOPENCURSOR 옵션을 늘려 주어야 한다. 이 옵션은 기본적으로 10개로 잡혀있다.

     
     
    Dynamic SQL의 사용
    보통의 어플리케이션 프로그램에서는 SQL문이 확정된 후 프로그램에 적용한다. 
    그러나, 다이나믹 SQL의 사용하는 경우는 사용자의 입력에 의거해서 SQL문이 작성되거나 
    다른 STATIC SQL문의 결과에 의해서 SQL문이 생성되는 경우 다이나믹SQL을 사용하게 된다.
    
    • 비교될 컬럼이 변경되는 경우(WHERE절), 참조할 테이블이 변경되어야 하는 경우, INSERT, UPDATE시의 컬럼이 변경되는 경우

    이 있다.

     
    Method
     
    SQL문
     
    1
     
    QUERY문이 아니면서 호스트 변수가 없는 경우
     
    2
     
    QUERY문이 아니면서 호스트 변수가 정해지지 않은 경우
     
    3
     
    호스트 변수와 SELECT컬럼이 정해진 QUERY문인 경우
     
    4
     
    호스트 변수와 SELECT컬럼이 정해지지 않은 QUERY문인 경우
    • < Method 1 >

    이 방법은 Dynamic SQL문을 작성하고 “EXECUTE IMMEDIATE”를 사용하여 즉시 실행한다. SQL문은 QUERY문이 아니어야 하고 - (SELECT문)- 입력용 호스트 변수가 존재하지 않아야 한다. Method 1은 SQL문이 매번 실행될 때마다 PARSING을 한다.

    • 'DELETE FROM EMP WHERE DEPTNO = 20' 'GRANT SELECT ON EMP TO scott'
    • < Method 2 >

    이 방법은 Dynamic SQL문을 작성한 후 “PREPARE”와 “EXECUTE” 명령에 의해 실행한다. SQL문은 QUERY문이 아니어야 하고, 여기에서 사용된 호스트변수는 프리컴파일 시점에서는 데이타 타입과 위치는 정해져 있어야 한다.

    • 'INSERT INTO EMP (ENAME, JOB) VALUES (:emp_name, :job_title)' 'DELETE FROM EMP WHERE EMPNO = :emp_number

    이 방법에서는 SQL문은 단 한번만 PARSING하게 되고 호스트 변수의 값을 달리하고 여러번 실행시킬 수 있다. CREATE나 GRANT같은 DDL 문은 PREPAREd된 후에 실행 할 수 있다.

    • < Method 3 >

    이 방법은 Dynamic SQL문을 작성한 후 “PREPARE”, “DECALRE”, "OPEN", "FETCH", "CLOSE" 와 같은 커서 명령으로 실행한다. SELECT-LIST와 입력 호스트변수의 데이타타입과 위치는 프리컴파일 시점에서는 정해져야 한다. 이 방법은 query문이어야 한다.

    • 'SELECT DEPTNO, MIN(SAL), MAX(SAL) FROM EMP GROUP BY DEPTNO' 'SELECT ENAME, EMPNO FROM EMP WHERE DEPTNO = :dept_number'
    • < Method 4 >

    이 방법은 실행 시점까지 SELECT-LIST와 호스트변수의 데이타 타입과 갯수, 위치를 모를 경우 사용하는 방법이다.

    • 'INSERT INTO EMP () VALUES ()' 'SELECT FROM EMP WHERE DEPTNO = 20'

    위의 네가지 방법 모두 Dynamic SQL문을 charactor string에 저장하고, "EXEC SQL"과 ";"는 생략한다. Method 2와 3은 입력 호스트변수의 위치와 데이타타입을 프리컴파일 시점까지 정해져 있어야 한다. Method 4는 가장 유연성이 좋다. 반면에 복잡한 코딩이 들어가도 Dynamic SQL의 개념을 알고 있어야 하기 때문에 잘 사용하지 않는다. 보통 Method 4는 Method 1, 2, 3으로 해결 할 수 없는 경우에 사용한다. 만약 프리컴파일 옵션을 DBMS=V6나 DBMS=V6_CHAR인 경우 SQL문을 배열에 저장하기 전에 BLANK를 채워줘야 한다. 그렇게 함으로서 변수를 CLEAR해 준다. 특히 배열을 다른 SQL문에서 다시 사용할 경우에는 특히 중요하다. 항상 SQL문을 저장하기 전에 호스트 스트링을 초기화 해야 한다. 오라클에서는 NULL-TERNIMATE는 스트링의 마지막이라고 인식하지 못하고 SQL문의 일부로 인식하기 때문에 사용하여서는 안된다. 만일 프리컴파일 옵션을 DBMS=V7로 했을 경우, 스트링의 값은 "PREPARE", 또는 "EXECUTE IMMEDIATE"하기 전에 NULL-TERNIMATE로 끝을 맺어줘야 한다. DBMS옵션의 값을 개의치 않을 경우에는 다이나믹 SQL문을 저장할 변수로 VARCHAR를 쓸 경우, VARCHAR의 length를 "PREPARE"나 "EXECUTE IMMEDIATE"를 실행하기 전에 정확하게 SET해주어야 한다.>

    • 1. Method 1

    결과값이 단순히 SUCCESS나 FAILURE인 간단하고 호스트변수를 사용하지 않는 다이나믹 SQL문일 경우 사용한다. 이 방법은 "EXECUTE IMMEDIATE"를 사용하여 다이나믹 SQL문을 실행시킨다.

    • EXEC SQL EXECUTE IMMEDIATE {:host_string | string_literal }; char sql_stmt[132]; .... for (;;) { printf("Enter SQL statement: "); gets(sql_stmt); if(*sql_stmt == '\0') break; EXEC SQL EXECUTE IMMEDIATE :sql_stmt; } EXEC SQL EXECUTE IMMEDIATE 'REVOKE RESOURCE FROM MILLER';
    • 2. Method 2

    이 방법으로 실행할 경우 2번의 작업을 거쳐야 한다. 다이나믹SQL문은 QUERY문이어서는 안되고 첫번째로 PREPARE하고 EXECUTE되어 진다. SQL문에는 호스트변수와 INDICATOR변수를 가질 수 있다. PREPARE문은 한번만 수행하면 되고 EXECUTE문은 다른 호스트 변수값으로 여러 번 수행할 수 있다.. 더 나아가서 COMMIT이나 ROLLBACK문장을 수행하고 나서도 다시 PREPARE할 필요가 없다.(LOG OFF이나 RECONNECT가 아닌 경우)

    • EXEC SQL PREPARE statement_name FROM {:host_string | :string_literal };

    PRAPARE 명령은 SQL문을 PARSING하고 이름을 부여한다. 위에서 statement_name은 호스트변수, 프로그램 변수가 아니고 프리컴파일러가 사용할 임시적인 변수로 DECALRE SECTION에 기술할 필요가 없다.

    • EXEC SQL EXECUTE statement_name [USING host_variable_list]; :host_variable_list = :host_variable[:indicator1] [, :host_variable[:indicator2], ...]

    EXECUTE는 PARSING된 SQL문을 "USING" 절의 호스트변수를 이용하여 수행한다. 실제로 사용되는 모습은 아래와 같다.

    • ... int emp_number; char delete_stmt[120], search_cond[40], temp[10]; ... strcpy(delete_stmt, "DELETE FROM EMP WHERE EMPNO = :n AND "); printf("다음의 SQL문에서 검색조건을 입력하여 완성하시오.\n"); printf("%s\n", delete_stmt); gets(search_cond); strcat(delete_stmt, search_cond); EXEC SQL PREPARE sql_stmt FROM :delete_stmt; for(;;) { printf("사원번호를 입력하세요: "); get(temp); emp_number = atoi(temp); if (emp_number == 0) break; EXEC SQL EXECUTE sql_stmt USING :emp_number; } ......

    USING절의 이용 SQL문이 EXECUTE될 때, USING절에 입력된 호스트변수의 값은 PREPARE된 다이나믹 SQL문에서 대응되는 위치에 대치된다. PREPARE된 다이나믹SQL문에서 각각의 변수 위치는 USING절의 각각의 다른 호스트변수와 대치되어야 한다.

    • 3. Method 3

    이 방법은 Method 2와 비슷하나 PREPARE문장과 함께 커서를 선언하고 조작 하는게 필요하다. QUERY문을 사용할 수 있다. 사실상 다이나믹SQL문이 QUERY문이면 Method3이나 4를 사용해야 한다. SELECT-LIST의 컬럼의 갯수와 호스트 변수의 갯수가 프리컴파일 시점에서는 정해져 있어야 한다. 실행시점 전까지는 테이블명과 컬럼명등 데이타베이스 OBJECT의 이름은 정해져야 한다. 데이타베이스 OBJECT의 이름은 호스트변수를 사용하지 못한다. 조건절(WHERE)이나 GROUP BY절, ORDER BY절 역시 실행 시점까지 정해져야 한다.

    • EXEC SQL PREPARE statement_name FROM { :host_string | string_literal }; EXEC SQL DECALRE cursor_name CURSOR FOR statement_name; EXEC SQL OPEN cursor_name [USING host_variable_list ]; EXEC SQL FETCH cursor_name INTO host_variable_list; EXEC SQL CLOSE cursor_name;

    PREPARE는 다이나믹SQL문을 PARSING하고 이름을 부여한다. 아래의 예제는 select_stmt문자열을 sql_stmt로 이름을 부여한다.

    • char select_stmt[132] = "SELECT MGR, JOB FROM EMP WHERE SAL < :salary"; EXEC SQL PREPARE sql_stmt FROM :select_stmt;

    보통 WHERE절은 실행 시점에서 터미널로부터 입력되거나 어플리케이션 프로그램에서 자동으로 생성되게 한다. DECLARE명령은 PREPARE에 의해 붙여진 이름의 SQL문으로 커서를 정의한다.

    • EXEC SQL PREPARE sql_stmt FROM :select_stmt EXEC SQL DECLARE emp_cursor CURSOR FOR sql_stmt;

    위의 예에서 sql_stmt와 emp_cursor는 호스트변수나 프로그램의 변수로 선언할 필요가 없다. OPEN명령은 커서에 메모리를 할당하고, 입력된 호스트변수를 BIND하고, QUERY를 실행시키고, 실행에 의해 나오는 데이타를 active set으로 설정한다. OPEN명령은 커서를 ACTIVE SET의 첫번째 ROW에 위치하게 되고, sqlerrd[2]를 0으로 set한다.

    • EXEC SQL OPEN emp_cursor USING :salary;

    FETCH명령은 INTO절에 대응되는 호스트 변수에ACTIVE SET에서 ROW를 리턴한다. 만약 더 이상의 데이타가 없으면 오라클은 sqlca.sqlcode의 값을 1403을 설정하고 "no data found"를 리턴한다.

    • EXEC SQL FETCH emp_cursor INTO :mgr_number, :job_title;

    CLOSE명령은 커서를 무효화 시킨다. 커서를 CLOSE하고 난 후에는 더 이상 FETCH는 실행되지 않는다.

    • EXEC SQL CLOSE emp_cursor;
    SQLCA(SQL Communication Area)
    데이터베이스와 어플리케이션 프로그램 상호간에 여러가지 정보를 얻는 구조체
    
    
    • SQLCA 구조체 (SQL Communication Area)

    struct sqlca { /* ub1 */ char sqlcaid[8]; /* b4 */ long sqlabc; /* b4 */ long sqlcode; struct { /* ub2 */ unsigned short sqlerrml; /* ub1 */ char sqlerrmc[70]; } sqlerrm; /* ub1 */ char sqlerrp[8]; /* b4 */ long sqlerrd[6]; /* ub1 */ char sqlwarn[8]; /* ub1 */ char sqlext[8]; };

    sqlcaid SQL Communication Area를 지칭하는 부분"SQLCA"로 초기화되어 있음.
    sqlcabc SQLCA 구조체의 전체 길이를 가지는 정수형
    sqlcode
    최근에 실행한  SQL 문장의 상태를 가지고 있음 (에러코드)
    0     에러발생 없이 SQL문이 실행되었음.
    >0    SQL 문이 실행 되었지만 예외사항이 발생했음.
          NO-DATA-FOUND 등 양성적인 ERROR
    <0    SQL 문이 에러발생으로 실행되지 않았음. 
    sqlerrm sqlerrml sqlerrmc의 길이를 저장하는 정수형
    sqlerrmc sqlcode 값에 해당하는 message를 저장하는 변수 길이가 67을 넘지 못한다.
    sqlerrp 예약변수
    sqlerrd sqlerrd[0] 예약변수
    sqlerrd[1] 예약변수
    sqlerrd[2]
    최근에 실행된  row의 개수
    SQL문이 에러가 발생하면 지정되지 않음
    array process 에서는 에러가 발생시 정상적으로 처리된 row의 갯수
    sqlerrd[3] 예약변수
    sqlerrd[4] 최근에 실행된 sql문에서 error가 발생한 위치
    sqlerrd[5] 예약변수
    sqlwarn Warning flags
    sqlext 예약변수
     
    Pro*C 어플리케이션의 작성
     
    • 1. 어플리케이션의 구조
    • EXEC SQL BEGIN DECLARE SECTION; 바인드 변수 선언 EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE "sqlca.h" main() { EXEC SQL CONNECT :username IDENTIFIED BY :password; Embedded SQL문 작업 EXEC SQL COMMIT WORK; 또는 EXEC SQL ROLLBACK RELEASE; }
    • BEGIN DECLARE SECTION
      • 바인드 변수를 선언하는 부분이다. 이 영역에 선언한 변수만 SQL문에 사용할 수 있었으나 현재에는 어디서라도 바인드변수를 선언하고 사용할 수가 있다. Pro*C 2.XX 대부터는 이영역이 의미가 없어졌다.
    • EXEC SQL END DECLARE SECTION;
      • 바인드 변수영역을 종료하는 명령이다.
    • EXEC SQL INCLUDE “sqlca.h”
      • SQL Communication Area 를 포함하는 부분이다 현재의 버젼에서는 sqlca.h를 일반 C문법에서 처럼 #include <sqlca.h>로 선언 할 수 있다 proc컴파일시
        • proc iname=sample1.pc include=$ORACLE_HOME/ product/7.3.3/precomp/public
        cc컴파일시
        • cc -o sample1 sample1.c -I/$ORACLE_HOME/ product/7.3.3/precomp/public
        를 주어 include화일의 위치를 명시해야 한다
    • EXEC SQL CONNECT :username IDENTIFIED BY :password;
      • 오라클과 연결하는 부분이다 username과 password는 bind변수로 선언되어 있어야 한다
    • Embedded SQL문
      • 실제적인 작업 부분이 여기에 들어간다 어떤 SQL문도 여기에 올 수 있다
    • EXEC SQL COMMIT WORK; 또는 EXEC SQL ROLLBACK RELEASE;
      • 트랜잭션을 종료하고 오라클로 접속을 종료하는 명령이다 COMMIT WORK 변경된 데이타를 확정한다 ROLLBACK 변경된 데이타를 되돌린다
    Pro*C 컴파일
    일단 "sample.pc"로 어플리케이션 프로그램의 코딩이 끝났으면 Pro*C  프리컴파일을 
    해야 한다.
    

     

      • proc INAME=sample1.pc proc sample1.pc
    • proc에서 사용되는 프리컴파일러 옵션들의 Default 값들은 프리컴파일러 내에 포함되어 있고, Pro*C System Configuration file에 있고, 또 user configuration file을 작성하여 지정할 수도 있다. 예를 들어 MAXOPENCURSORS라는 옵션은 프리컴파일러 내에 10으로 되어있는데, system 환경화일에 MAXOPENCURSORS=32라고 하면 Default값은 32가 되는 것이다 . 또 user가 정의한 환경화일을 지정해 주면 Default 값은 그 값으로 변경된다 . system configuration file 시스템 마다 다르지만 $ORACLE_HOME/proc/pmscfg.h 오라클7.3.X 버젼에서는 $ORACLE_HOME/ precomp/admin 디렉토리에 위치한다 . config 화일의 지정
      • $proc config=my_config_file.h ...
      Default 옵션을 보려면
      • $proc
      하면 된다 . config 화일의 생성 config 화일은 각 라인마다 하나의 옵션과 값을 주면 된다 .
      • MODE=ANSI CODE=ANSI_C
      • 실행화일의 작성
      make 유틸리티 : "makefile" 이라는 특수한 형식에 저장되어 있는 일련의 의존규칙들에 근거하여 화일을 최신 버전으로 개정하는 유틸리티이다 . -f 옵션은 만들고자 하는 화일 이름을 명시할 수 있게 한다 . 만일 이름이 명시되지 않으면 , "makefile" 로 간주한다 . Pro*C 의 makefile 은 $ORACLE_HOEM/precom/demo/proc 에 존재하는 proc.mk 를 자신의 작업 디렉토리에 copy 하여 변경하여 작성하면 된다 . proc.mk 화일은 Pro*C 프로그램을 컴파일하여 실행화일을 생성하는 일련의 작업들을 기술해 놓은 것이다 . 위의 명령은 proc.mk 라는 makefile 을 이용하여 makefile 안에 있는 sample1 이란 lable 의 구성대로 실행한다 . sample1 이라는 lable 에는 proc 를 구동시키고 , cc 를 구동시키는 부분을 정의한다 . Precompiler Options
      문법 default 설명
      AUTO_CONNECT NO 자동 OPS$ 로그인
      CODE=ANSI_C|KR_C|CPP KR_C 생성 C 코드 타입
      CONFIG=<filename> NO 사용자정의 cinfig 화일
      CPP_SUFFIX NO output 화일의 확장자 정의
      DBMS-V6|V7|NATIVE|V6_CHAR NATIVE 데이타베이스 버젼간의 호환성 정의
      DEFINE=<name> NO Pro*C 프리프로세서에서 사용될 이름 정의
      DEF_SQLCODE NO #define SQLCODE 를 생성
      ERROR=YES|NO YES
      에러메세지 출력할 위치지정 
       YES: stdout, NO: list 화일 
      FIPS=NONE|SQL89|SQL2 NONE whether to flag ANSI/ISO non-compliance
      HOLD_CURSOR=YES|NO NO 커서 cache 를 sql 문으로 핸들링한다
      INAME=<filename> NO 입력화일 이름
      INCLUDE=<pathname> NO EXEC SQL INCLUDE 나 #include 문장을 위한 디렉토리 path 지정
      LINES=YES|NO NO whether #line directives are generated
      LNAME=<filename> none 리스트화일명
      =10..1024 1024 string literals 의 최대길이
      MAXOPENCURSOR=5..255 10 최대커서 갯수
      ONAME=<filename> none output 화일명
      ORACA=YES|NO NO ORACA 의 사용여부
      RELEASE_CURSOR NO 커서캐쉬에서 커서를 제어
      SELECT_ERROR YES SELECT 에러를 FLAG
      SQLCHECK SYNTAX 컴파일시 SQL CHECK
      SYS_INCLUDE none 시스템 헤더화일의 디렉토리 설정
      USERID NO USERNAME/PASSWORD 지정
      • 프리컴파일 옵션의 영향 범위
      위의 옵션들은 하나의 C 소스 프로그램에서만 유효하다 . 만약 A 라는 UNIT 에 프리컴파일러 옵션인 HOLD_SURDOR=YES 그리고 RELEASE_CURSOR=YES 가 정의되어 있고 , B UNIT 에는 없다면 A 는 옵션의 영향을 받고 B 는 DEFAulT 값의 영향을 받는다 . 프리컴파일 옵션의 사용 프리컴파일 옵션은 명령행에서도 사용가능하고 또 SOURCE 에 포함할 수도 있다 . 명령행에서의 사용은
      • [OPTION_NAME=value] [OPTION_NAME=value] ...
      로 사용하고 각각의 옵션사이는 공백으로 구분한다 . 예를 들어
      • CODE=ANSI_C MODE=ANSI
      또 인라인으로 SOURCE 내에 삽입하여 사용가능한데 , 이때는 "EXEC ORACLE" 이라는 문구를 사용하여 삽입한다 .
      • EXEC ORACLE OPTION (OPTION_NAME=value);
      예를 들어
      • EXEC ORACLE OPTION (RELEASE_CURSOR=yes);
      SOURCE 파일에 포함되어진 옵션들도 명령행이나 CONFIGURATION 화일에 중복하여 사용할 수 있다 . 이 "EXEC ORACLE" 구문은 특히 프리컴파일 도중에 옵션을 변경할 때 유용하다 . EXEC ORACLE 의 유효범위는 SOURCE 화일내에 같은 옵션으로 EXEC ORACLE 이 사용된 이전까지 유효하다 .  
    • AUTO_CONNECT: 자동으로 OPS$ 계정으로 connect 한다 . YES 이면 어플리케이션 프로그램이 첫 SQL 문장을 실행할 시점에서 OPT$ 계정으로 CONNECT를 시도한다 . NO 이면 자동 CONNECT 는 되지 않고 SOURCE 화일내에 CONNECT 문장이 존재해야 한다 .
    • CODE : C 함수의 어떤 프로토타입을 생성시키는 지 정한다 . ANSI_C 는 X3.159-1989 에서 제공한 표준을 제공한다 . ANSI_C 표준으로 생성한다 . extern void(sqlora(long *, void *); CODE=KR_C 이면 extern void sqlora(/*_ long *, void * */); CODE=CPP 이면 C++ 에 맞는 SOURCE CODE 를 생성시킨다 .
    • CONFIG : 사용자 지정 CONFIGURATION 화일을 지정한다 . 각 라인마다 한개의 옵션이 들어가게 화일을 생성해 이름을 지정한다 .
    • CPP_SUFFIX: C++ 옵션으로 SOURCE 화일의 확장자를 지정한다 .
    • DBMS : 문법을 정의한다 . NATIVE : 접속되는 데이타 베이스에 SETTING 된 테이블에 따른다 .
    • DEF_SQLCODE:#define SQLCODE sqlca.sqlcode
    • DEFINE : 프리프로세서의 매크로를 컴파일 시점에서 선언한다 . SOURCE 화일에 아래와 같이 정의 되어 있다면
      • #ifdef XYZZY .... #else ... #endif proc my_prog DEFINE=XYZZY
      로 프리컴파일하면 #define XYZZY 를 SOURCE 에 포함시킨것과 같다 .
      • EXEC ORACLE IFDEF XYZZY; ... EXEC ORACLE ELSE; ... EXEC ORACLE ENDIF;
      도 같은 효과를 나타낸다 .
    • ERRORS: 에러를 터미널로 보낼 것인지 (NO), 리스트 화일로 보낼 건지를 (YES) 결정
    • HOLD_CURSOR : SQL 문이나 PL/SQL 블럭을 커서 캐쉬안에서 보관시킬 건지를 결정한다 .
    • INAME: SOURCE 화일명을 명시한다 .
      • proc sample MODE=ANSI proc INAME=sample1 MODE=ANSI
    • INCLUDE : 컴파일시 포함되어져야 할 화일의 디렉토리명을 명시한다 . #include 나 EXEC SQL INCLUDE 문에서 명시된 화일들이 위치한 곳을 명시한다 . 컴파일시 헤더 화일을 찾는 순서는
      • 1. SYS_INCLUDE 로 지정되어진 디렉토리 2. 현재 디렉토리 3. standard 헤더 화일의 디렉토리 4. INCLUDE 옵션으로 지정된 디렉토리
    • IRECLEN : SOURCE 화일의 한 라인의 길이를 정한다 . default 로 80 으로 지정되어 있다 .
    • LNAME:리스트 화일의 이름을 명시한다 .
    • LRECLEN:리스트 화일의 한 라인의 길이를 나타낸다 .( 기본값 :132)
    • LTYPE:생성될 리스트 화일의 타입을 설정한다 .( 기본값:LONG)
    • MAXLITERAL (8~1024) 사이의 값으로 문자 LITERAL 의 최대길이를 설정한다 . ( 기본값 1024)
    • MAXOPENCURSORS:동시에 OPEN 할 수 있는 최대 커서의 갯수를 설정한다 . (5~255) 기본값:10
    • ONAME:OUTPUT 화일명을 명시한다 .
      기본적으로 INAME 의 뒤에 CPP_SUFFIX 를 붇여 출력한다 .
      • proc iname=my_test proc iname=my_test oname=my_test_1.c
    • ORACA:ORACA 의 사용여부를 설정한다 . ORACA=YES 면 SOURCE 프로그램내에 EXEC SQL INCLUDE ORACA.H 나 #include oraca.h 를 포함해야만 한다 .
    • ORECLEN:OUTPUT 화일의 한 라인의 길이를 설정 ( 기본값 80), (80~255)
    • PAGELEN:리스트화일의 PAGE 길이를 설정 ( 기본값 없음 )(30~255)
    • RELEASE CURSOR:커서의 보관을 취소한다 .
    • SQLCHECK:SQL 문의 검사를 설정한다 .
      • SQLCHECK=SEMANTICS 데이타조작문 , PL/SQL 블럭 , 호스트변수의 데이타 타입을 검사 SQLCHECK=FULL SQL 문장 및 데이타베이스에 접속해 현재의 SQL 문장의 유효성을 검사한다 . USERID 가 정의되어 있어야 한다 . SQLCHECK=SYNTAX SQL 문장의 문법적인 오류만 검사 SQLCHECK=SYMANTICS PL/SQL 블럭이 SOURCE 내에 포함되어 있으면 USERID 와 함께 이 옵션을 써야 한다 .
    • SYS_INCLUDE:시스템 헤더 화일의 디렉토리를 설정한다 .
    • USERID:오라클 USERID 와 PASSWORD 를 명시한다 .
      • USERID=username/password

    [출처] https://blog.naver.com/chansury/120048569687

     

     

') break; EXEC SQL EXECUTE IMMEDIATE :sql_stmt; } EXEC SQL EXECUTE IMMEDIATE 'REVOKE RESOURCE FROM MILLER';
  • 2. Method 2

이 방법으로 실행할 경우 2번의 작업을 거쳐야 한다. 다이나믹SQL문은 QUERY문이어서는 안되고 첫번째로 PREPARE하고 EXECUTE되어 진다. SQL문에는 호스트변수와 INDICATOR변수를 가질 수 있다. PREPARE문은 한번만 수행하면 되고 EXECUTE문은 다른 호스트 변수값으로 여러 번 수행할 수 있다.. 더 나아가서 COMMIT이나 ROLLBACK문장을 수행하고 나서도 다시 PREPARE할 필요가 없다.(LOG OFF이나 RECONNECT가 아닌 경우)

  • EXEC SQL PREPARE statement_name FROM {:host_string | :string_literal };

PRAPARE 명령은 SQL문을 PARSING하고 이름을 부여한다. 위에서 statement_name은 호스트변수, 프로그램 변수가 아니고 프리컴파일러가 사용할 임시적인 변수로 DECALRE SECTION에 기술할 필요가 없다.

  • EXEC SQL EXECUTE statement_name [USING host_variable_list]; :host_variable_list = :host_variable[:indicator1] [, :host_variable[:indicator2], ...]

EXECUTE는 PARSING된 SQL문을 "USING" 절의 호스트변수를 이용하여 수행한다. 실제로 사용되는 모습은 아래와 같다.

  • ... int emp_number; char delete_stmt[120], search_cond[40], temp[10]; ... strcpy(delete_stmt, "DELETE FROM EMP WHERE EMPNO = :n AND "); printf("다음의 SQL문에서 검색조건을 입력하여 완성하시오.\n"); printf("%s\n", delete_stmt); gets(search_cond); strcat(delete_stmt, search_cond); EXEC SQL PREPARE sql_stmt FROM :delete_stmt; for(;;) { printf("사원번호를 입력하세요: "); get(temp); emp_number = atoi(temp); if (emp_number == 0) break; EXEC SQL EXECUTE sql_stmt USING :emp_number; } ......

USING절의 이용 SQL문이 EXECUTE될 때, USING절에 입력된 호스트변수의 값은 PREPARE된 다이나믹 SQL문에서 대응되는 위치에 대치된다. PREPARE된 다이나믹SQL문에서 각각의 변수 위치는 USING절의 각각의 다른 호스트변수와 대치되어야 한다.

  • 3. Method 3

이 방법은 Method 2와 비슷하나 PREPARE문장과 함께 커서를 선언하고 조작 하는게 필요하다. QUERY문을 사용할 수 있다. 사실상 다이나믹SQL문이 QUERY문이면 Method3이나 4를 사용해야 한다. SELECT-LIST의 컬럼의 갯수와 호스트 변수의 갯수가 프리컴파일 시점에서는 정해져 있어야 한다. 실행시점 전까지는 테이블명과 컬럼명등 데이타베이스 OBJECT의 이름은 정해져야 한다. 데이타베이스 OBJECT의 이름은 호스트변수를 사용하지 못한다. 조건절(WHERE)이나 GROUP BY절, ORDER BY절 역시 실행 시점까지 정해져야 한다.

  • EXEC SQL PREPARE statement_name FROM { :host_string | string_literal }; EXEC SQL DECALRE cursor_name CURSOR FOR statement_name; EXEC SQL OPEN cursor_name [USING host_variable_list ]; EXEC SQL FETCH cursor_name INTO host_variable_list; EXEC SQL CLOSE cursor_name;

PREPARE는 다이나믹SQL문을 PARSING하고 이름을 부여한다. 아래의 예제는 select_stmt문자열을 sql_stmt로 이름을 부여한다.

  • char select_stmt[132] = "SELECT MGR, JOB FROM EMP WHERE SAL < :salary"; EXEC SQL PREPARE sql_stmt FROM :select_stmt;

보통 WHERE절은 실행 시점에서 터미널로부터 입력되거나 어플리케이션 프로그램에서 자동으로 생성되게 한다. DECLARE명령은 PREPARE에 의해 붙여진 이름의 SQL문으로 커서를 정의한다.

  • EXEC SQL PREPARE sql_stmt FROM :select_stmt EXEC SQL DECLARE emp_cursor CURSOR FOR sql_stmt;

위의 예에서 sql_stmt와 emp_cursor는 호스트변수나 프로그램의 변수로 선언할 필요가 없다. OPEN명령은 커서에 메모리를 할당하고, 입력된 호스트변수를 BIND하고, QUERY를 실행시키고, 실행에 의해 나오는 데이타를 active set으로 설정한다. OPEN명령은 커서를 ACTIVE SET의 첫번째 ROW에 위치하게 되고, sqlerrd[2]를 0으로 set한다.

  • EXEC SQL OPEN emp_cursor USING :salary;

FETCH명령은 INTO절에 대응되는 호스트 변수에ACTIVE SET에서 ROW를 리턴한다. 만약 더 이상의 데이타가 없으면 오라클은 sqlca.sqlcode의 값을 1403을 설정하고 "no data found"를 리턴한다.

  • EXEC SQL FETCH emp_cursor INTO :mgr_number, :job_title;

CLOSE명령은 커서를 무효화 시킨다. 커서를 CLOSE하고 난 후에는 더 이상 FETCH는 실행되지 않는다.

  • EXEC SQL CLOSE emp_cursor;
SQLCA(SQL Communication Area)
데이터베이스와 어플리케이션 프로그램 상호간에 여러가지 정보를 얻는 구조체

  • SQLCA 구조체 (SQL Communication Area)

struct sqlca { /* ub1 */ char sqlcaid[8]; /* b4 */ long sqlabc; /* b4 */ long sqlcode; struct { /* ub2 */ unsigned short sqlerrml; /* ub1 */ char sqlerrmc[70]; } sqlerrm; /* ub1 */ char sqlerrp[8]; /* b4 */ long sqlerrd[6]; /* ub1 */ char sqlwarn[8]; /* ub1 */ char sqlext[8]; };

sqlcaid SQL Communication Area를 지칭하는 부분"SQLCA"로 초기화되어 있음.
sqlcabc SQLCA 구조체의 전체 길이를 가지는 정수형
sqlcode
최근에 실행한  SQL 문장의 상태를 가지고 있음 (에러코드)
0     에러발생 없이 SQL문이 실행되었음.
>0    SQL 문이 실행 되었지만 예외사항이 발생했음.
      NO-DATA-FOUND 등 양성적인 ERROR
<0    SQL 문이 에러발생으로 실행되지 않았음. 
sqlerrm sqlerrml sqlerrmc의 길이를 저장하는 정수형
sqlerrmc sqlcode 값에 해당하는 message를 저장하는 변수 길이가 67을 넘지 못한다.
sqlerrp 예약변수
sqlerrd sqlerrd[0] 예약변수
sqlerrd[1] 예약변수
sqlerrd[2]
최근에 실행된  row의 개수
SQL문이 에러가 발생하면 지정되지 않음
array process 에서는 에러가 발생시 정상적으로 처리된 row의 갯수
sqlerrd[3] 예약변수
sqlerrd[4] 최근에 실행된 sql문에서 error가 발생한 위치
sqlerrd[5] 예약변수
sqlwarn Warning flags
sqlext 예약변수
 
Pro*C 어플리케이션의 작성
 
  • 1. 어플리케이션의 구조
  • EXEC SQL BEGIN DECLARE SECTION; 바인드 변수 선언 EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE "sqlca.h" main() { EXEC SQL CONNECT :username IDENTIFIED BY :password; Embedded SQL문 작업 EXEC SQL COMMIT WORK; 또는 EXEC SQL ROLLBACK RELEASE; }
  • BEGIN DECLARE SECTION
    • 바인드 변수를 선언하는 부분이다. 이 영역에 선언한 변수만 SQL문에 사용할 수 있었으나 현재에는 어디서라도 바인드변수를 선언하고 사용할 수가 있다. Pro*C 2.XX 대부터는 이영역이 의미가 없어졌다.
  • EXEC SQL END DECLARE SECTION;
    • 바인드 변수영역을 종료하는 명령이다.
  • EXEC SQL INCLUDE “sqlca.h”
    • SQL Communication Area 를 포함하는 부분이다 현재의 버젼에서는 sqlca.h를 일반 C문법에서 처럼 #include <sqlca.h>로 선언 할 수 있다 proc컴파일시
      • proc iname=sample1.pc include=$ORACLE_HOME/ product/7.3.3/precomp/public
      cc컴파일시
      • cc -o sample1 sample1.c -I/$ORACLE_HOME/ product/7.3.3/precomp/public
      를 주어 include화일의 위치를 명시해야 한다
  • EXEC SQL CONNECT :username IDENTIFIED BY :password;
    • 오라클과 연결하는 부분이다 username과 password는 bind변수로 선언되어 있어야 한다
  • Embedded SQL문
    • 실제적인 작업 부분이 여기에 들어간다 어떤 SQL문도 여기에 올 수 있다
  • EXEC SQL COMMIT WORK; 또는 EXEC SQL ROLLBACK RELEASE;
    • 트랜잭션을 종료하고 오라클로 접속을 종료하는 명령이다 COMMIT WORK 변경된 데이타를 확정한다 ROLLBACK 변경된 데이타를 되돌린다
Pro*C 컴파일
일단 "sample.pc"로 어플리케이션 프로그램의 코딩이 끝났으면 Pro*C  프리컴파일을 
해야 한다.

 

    • proc INAME=sample1.pc proc sample1.pc
  • proc에서 사용되는 프리컴파일러 옵션들의 Default 값들은 프리컴파일러 내에 포함되어 있고, Pro*C System Configuration file에 있고, 또 user configuration file을 작성하여 지정할 수도 있다. 예를 들어 MAXOPENCURSORS라는 옵션은 프리컴파일러 내에 10으로 되어있는데, system 환경화일에 MAXOPENCURSORS=32라고 하면 Default값은 32가 되는 것이다 . 또 user가 정의한 환경화일을 지정해 주면 Default 값은 그 값으로 변경된다 . system configuration file 시스템 마다 다르지만 $ORACLE_HOME/proc/pmscfg.h 오라클7.3.X 버젼에서는 $ORACLE_HOME/ precomp/admin 디렉토리에 위치한다 . config 화일의 지정
    • $proc config=my_config_file.h ...
    Default 옵션을 보려면
    • $proc
    하면 된다 . config 화일의 생성 config 화일은 각 라인마다 하나의 옵션과 값을 주면 된다 .
    • MODE=ANSI CODE=ANSI_C
    • 실행화일의 작성
    make 유틸리티 : "makefile" 이라는 특수한 형식에 저장되어 있는 일련의 의존규칙들에 근거하여 화일을 최신 버전으로 개정하는 유틸리티이다 . -f 옵션은 만들고자 하는 화일 이름을 명시할 수 있게 한다 . 만일 이름이 명시되지 않으면 , "makefile" 로 간주한다 . Pro*C 의 makefile 은 $ORACLE_HOEM/precom/demo/proc 에 존재하는 proc.mk 를 자신의 작업 디렉토리에 copy 하여 변경하여 작성하면 된다 . proc.mk 화일은 Pro*C 프로그램을 컴파일하여 실행화일을 생성하는 일련의 작업들을 기술해 놓은 것이다 . 위의 명령은 proc.mk 라는 makefile 을 이용하여 makefile 안에 있는 sample1 이란 lable 의 구성대로 실행한다 . sample1 이라는 lable 에는 proc 를 구동시키고 , cc 를 구동시키는 부분을 정의한다 . Precompiler Options
    문법 default 설명
    AUTO_CONNECT NO 자동 OPS$ 로그인
    CODE=ANSI_C|KR_C|CPP KR_C 생성 C 코드 타입
    CONFIG=<filename> NO 사용자정의 cinfig 화일
    CPP_SUFFIX NO output 화일의 확장자 정의
    DBMS-V6|V7|NATIVE|V6_CHAR NATIVE 데이타베이스 버젼간의 호환성 정의
    DEFINE=<name> NO Pro*C 프리프로세서에서 사용될 이름 정의
    DEF_SQLCODE NO #define SQLCODE 를 생성
    ERROR=YES|NO YES
    에러메세지 출력할 위치지정 
     YES: stdout, NO: list 화일 
    FIPS=NONE|SQL89|SQL2 NONE whether to flag ANSI/ISO non-compliance
    HOLD_CURSOR=YES|NO NO 커서 cache 를 sql 문으로 핸들링한다
    INAME=<filename> NO 입력화일 이름
    INCLUDE=<pathname> NO EXEC SQL INCLUDE 나 #include 문장을 위한 디렉토리 path 지정
    LINES=YES|NO NO whether #line directives are generated
    LNAME=<filename> none 리스트화일명
    =10..1024 1024 string literals 의 최대길이
    MAXOPENCURSOR=5..255 10 최대커서 갯수
    ONAME=<filename> none output 화일명
    ORACA=YES|NO NO ORACA 의 사용여부
    RELEASE_CURSOR NO 커서캐쉬에서 커서를 제어
    SELECT_ERROR YES SELECT 에러를 FLAG
    SQLCHECK SYNTAX 컴파일시 SQL CHECK
    SYS_INCLUDE none 시스템 헤더화일의 디렉토리 설정
    USERID NO USERNAME/PASSWORD 지정
    • 프리컴파일 옵션의 영향 범위
    위의 옵션들은 하나의 C 소스 프로그램에서만 유효하다 . 만약 A 라는 UNIT 에 프리컴파일러 옵션인 HOLD_SURDOR=YES 그리고 RELEASE_CURSOR=YES 가 정의되어 있고 , B UNIT 에는 없다면 A 는 옵션의 영향을 받고 B 는 DEFAulT 값의 영향을 받는다 . 프리컴파일 옵션의 사용 프리컴파일 옵션은 명령행에서도 사용가능하고 또 SOURCE 에 포함할 수도 있다 . 명령행에서의 사용은
    • [OPTION_NAME=value] [OPTION_NAME=value] ...
    로 사용하고 각각의 옵션사이는 공백으로 구분한다 . 예를 들어
    • CODE=ANSI_C MODE=ANSI
    또 인라인으로 SOURCE 내에 삽입하여 사용가능한데 , 이때는 "EXEC ORACLE" 이라는 문구를 사용하여 삽입한다 .
    • EXEC ORACLE OPTION (OPTION_NAME=value);
    예를 들어
    • EXEC ORACLE OPTION (RELEASE_CURSOR=yes);
    SOURCE 파일에 포함되어진 옵션들도 명령행이나 CONFIGURATION 화일에 중복하여 사용할 수 있다 . 이 "EXEC ORACLE" 구문은 특히 프리컴파일 도중에 옵션을 변경할 때 유용하다 . EXEC ORACLE 의 유효범위는 SOURCE 화일내에 같은 옵션으로 EXEC ORACLE 이 사용된 이전까지 유효하다 .  
  • AUTO_CONNECT: 자동으로 OPS$ 계정으로 connect 한다 . YES 이면 어플리케이션 프로그램이 첫 SQL 문장을 실행할 시점에서 OPT$ 계정으로 CONNECT를 시도한다 . NO 이면 자동 CONNECT 는 되지 않고 SOURCE 화일내에 CONNECT 문장이 존재해야 한다 .
  • CODE : C 함수의 어떤 프로토타입을 생성시키는 지 정한다 . ANSI_C 는 X3.159-1989 에서 제공한 표준을 제공한다 . ANSI_C 표준으로 생성한다 . extern void(sqlora(long *, void *); CODE=KR_C 이면 extern void sqlora(/*_ long *, void * */); CODE=CPP 이면 C++ 에 맞는 SOURCE CODE 를 생성시킨다 .
  • CONFIG : 사용자 지정 CONFIGURATION 화일을 지정한다 . 각 라인마다 한개의 옵션이 들어가게 화일을 생성해 이름을 지정한다 .
  • CPP_SUFFIX: C++ 옵션으로 SOURCE 화일의 확장자를 지정한다 .
  • DBMS : 문법을 정의한다 . NATIVE : 접속되는 데이타 베이스에 SETTING 된 테이블에 따른다 .
  • DEF_SQLCODE:#define SQLCODE sqlca.sqlcode
  • DEFINE : 프리프로세서의 매크로를 컴파일 시점에서 선언한다 . SOURCE 화일에 아래와 같이 정의 되어 있다면
    • #ifdef XYZZY .... #else ... #endif proc my_prog DEFINE=XYZZY
    로 프리컴파일하면 #define XYZZY 를 SOURCE 에 포함시킨것과 같다 .
    • EXEC ORACLE IFDEF XYZZY; ... EXEC ORACLE ELSE; ... EXEC ORACLE ENDIF;
    도 같은 효과를 나타낸다 .
  • ERRORS: 에러를 터미널로 보낼 것인지 (NO), 리스트 화일로 보낼 건지를 (YES) 결정
  • HOLD_CURSOR : SQL 문이나 PL/SQL 블럭을 커서 캐쉬안에서 보관시킬 건지를 결정한다 .
  • INAME: SOURCE 화일명을 명시한다 .
    • proc sample MODE=ANSI proc INAME=sample1 MODE=ANSI
  • INCLUDE : 컴파일시 포함되어져야 할 화일의 디렉토리명을 명시한다 . #include 나 EXEC SQL INCLUDE 문에서 명시된 화일들이 위치한 곳을 명시한다 . 컴파일시 헤더 화일을 찾는 순서는
    • 1. SYS_INCLUDE 로 지정되어진 디렉토리 2. 현재 디렉토리 3. standard 헤더 화일의 디렉토리 4. INCLUDE 옵션으로 지정된 디렉토리
  • IRECLEN : SOURCE 화일의 한 라인의 길이를 정한다 . default 로 80 으로 지정되어 있다 .
  • LNAME:리스트 화일의 이름을 명시한다 .
  • LRECLEN:리스트 화일의 한 라인의 길이를 나타낸다 .( 기본값 :132)
  • LTYPE:생성될 리스트 화일의 타입을 설정한다 .( 기본값:LONG)
  • MAXLITERAL (8~1024) 사이의 값으로 문자 LITERAL 의 최대길이를 설정한다 . ( 기본값 1024)
  • MAXOPENCURSORS:동시에 OPEN 할 수 있는 최대 커서의 갯수를 설정한다 . (5~255) 기본값:10
  • ONAME:OUTPUT 화일명을 명시한다 .
    기본적으로 INAME 의 뒤에 CPP_SUFFIX 를 붇여 출력한다 .
    • proc iname=my_test proc iname=my_test oname=my_test_1.c
  • ORACA:ORACA 의 사용여부를 설정한다 . ORACA=YES 면 SOURCE 프로그램내에 EXEC SQL INCLUDE ORACA.H 나 #include oraca.h 를 포함해야만 한다 .
  • ORECLEN:OUTPUT 화일의 한 라인의 길이를 설정 ( 기본값 80), (80~255)
  • PAGELEN:리스트화일의 PAGE 길이를 설정 ( 기본값 없음 )(30~255)
  • RELEASE CURSOR:커서의 보관을 취소한다 .
  • SQLCHECK:SQL 문의 검사를 설정한다 .
    • SQLCHECK=SEMANTICS 데이타조작문 , PL/SQL 블럭 , 호스트변수의 데이타 타입을 검사 SQLCHECK=FULL SQL 문장 및 데이타베이스에 접속해 현재의 SQL 문장의 유효성을 검사한다 . USERID 가 정의되어 있어야 한다 . SQLCHECK=SYNTAX SQL 문장의 문법적인 오류만 검사 SQLCHECK=SYMANTICS PL/SQL 블럭이 SOURCE 내에 포함되어 있으면 USERID 와 함께 이 옵션을 써야 한다 .
  • SYS_INCLUDE:시스템 헤더 화일의 디렉토리를 설정한다 .
  • USERID:오라클 USERID 와 PASSWORD 를 명시한다 .
    • USERID=username/password

[출처] https://blog.naver.com/chansury/120048569687

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86204
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78673
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95411
15 [hadoop] Cloudera Quick Start VM in Hyper-V file 졸리운_곰 2022.11.14 3816
14 [hadoop][java][MapReduce] 맵리듀스 원리와 그 과정 졸리운_곰 2021.02.28 1653
13 [hadoop][mapreduce][csv file] [Reference] : Hadoop MapReduce Join & Counter with Example file 졸리운_곰 2021.02.23 1534
12 [hadoop][mapreduce][csv file] Hadoop & Mapreduce Examples: Create First Program in Java file 졸리운_곰 2021.02.23 1855
11 하둡 맵리듀스(MapReduce) 알아보자 file 졸리운_곰 2019.04.22 2559
10 [하둡] 맵리듀스(MapReduce) 이해하기 file 졸리운_곰 2019.04.22 1981
9 맵/리듀스 (Map/Reduce) 이해하기 file 졸리운_곰 2019.04.22 2649
8 아파치 하둡 HDFS 사용법(Cloudera 사용) file 졸리운_곰 2017.04.19 1598
7 클라우데라 배포판을 이용한 하둡 및 빅데이터 오픈소스 설치하기 file 졸리운_곰 2017.02.14 2023
6 빅데이터 플랫폼 아키텍처의 두 가지 file 졸리운_곰 2016.05.29 1685
5 Hadoop 적용 사례 기사 정리 졸리운_곰 2016.05.29 1998
4 빅데이터 잡설 , 하둡은 어디로 갈꺼나 … file 졸리운_곰 2016.05.29 1740
3 하둡, 데이터 분석에 활용하기까지 file 졸리운_곰 2016.05.29 2136
2 A Guide to Python Frameworks for Hadoop file 졸리운_곰 2016.04.30 3074
1 Writing an Hadoop MapReduce Program in Python file 졸리운_곰 2016.04.30 2190
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED