db 프로그래밍
목적 : 대화식 인터페이스와 달리 응용 프로그램에서 db에 access하기 위해서
왜?
대화식 인터페이스는 편리하나 기능이 충분하지 않다.
db 프로그래밍 접근방법
-범용 프로그래밍 언어에 db 명령어를 내장시키는 방법
precompiler or preprocessor를 통해 embedded 프로그램을 처리
-db 함수 라이브러리 사용
host 언어에서 db호출을 위해 사용하는 API를 제공
-새로운 db언어 사용
DBPL, impedance mismatch를 최소화 할 수 있다.
impedance mismatch
-두 프로그래밍 환경 사이에서 (DB<->host) 데이터 타입이나 프로그래밍 사이의 불일치를 이야기한다
ex) type mismatch -> 두 언어간의 타입 표시에 차이가 존재 (바인딩 작업이 필요)
ex) 언어처리 방식 : db는 한번에 하나의 집합 처리 그러나 프로그래밍 언어는 한번에 한 record씩 처리함(iterator 도입하여 해결)
DB프로그래밍의 전형적인 상호작용 순서
-Client program이 db 서버에 연결을 요구
- '' 질의어를 보냄
-상호작용을 하다 더이상 db에 접근이 필요 없다면 연결을 종료
Embedded sql
-EXEC SQL ... END_EXEC (... <-에 sql문 위치시킴)
Embedded sql내에서 host의 변수를 사용할 수 있는데 이것을 shared variables이라 하며
이것이 sql내에서 쓰인다면 colon을 붙혀서 어디쪽 변수인지 구분해준다.
DBMS와 program사이 소통
=0: DBMS가 성공적으로 쿼리 수행함
>0:(or = 100): 쿼리 결과에서 더이상 가능한 결과가 없다
<0: 에러
SQL STATE
5자리 code로 되어있고
00000이면 에러나 예외 없음, 다른 변수는 에러나 예외를 알려준다.
오라클의 경우 SQLCA. 형식으로 구조체로 선언하고 , include를 통해 포함시킨다.
검색결과가 하나의 tuple이므로 impedance mismatch가 발생하지 않으나
검색결과가 여러개일 경우 처리가 불가능하다.
이럴땐 cursor(iterator)를 이용해 다중 튜플을 처리한다.
cursor : 다중 튜플을 처리하는데 필요한 일종의 검색결과를 임시 저장한 파일의 한 튜플을 가리키는 포인터
-Open cursor
db에서 검색결과를 가져와서 첫번째 row의 position을 point한다
-Fetch
커서를 다음 튜플로 이동시키는 것
-Close cursor
커서가 필요없으면 커서를 닫는 기능
부서이름을 입력받아서 그 부서에 근무하는 직원정보를 검색해서 출력하고
그 직원의 급여를 인상시켜 주는 프로그램
4번의 EMP라는 CUROSOR를 선언하는 모습
7번- 써주지 않으면 UPDATE된 내용이 없어져 버린다
8번- EMP를 실제로 실행시키는 실행문
9번-fectch문을 통해서 cursor를 하나 다음으로 이동시켜서 데이터를 가져온다
open cursor문 실행, dbms는 해당되는 쿼리를 실행하고 query 결과를 임시적 file에 저장하고
cursor는 제일 첫째 record 바로 앞의 위치를 가리킨다.
fetch실행시 cursor가 다음칸으로 이동, 데이터를 가져온다
Dynamic SQL
embedded sql을 쓸경우 sql이 변경되면 전체 프로그램을 컴파일 해야한다.
그래서 runtime에 sql을 입력해서 바로 실행할 수 있게 해주는게 Dynamic sql이다.
이런 Dynamic sql은 검색되는 속성의 타입이나 숫자를 컴파일 타임에 미리 알 수 없기 때문에
처리가 복잡해지는 경우가 있다.
자바에서 embedded사용법
표준 : SQLJ sql statement를 자바로 변경해준다
-JDBC인터페이스를 통해 수행시켜준다
-java,sql 같은 클래스를 import해주어야 한다
SQLJ도 두 타입의 iterator을 제공한다.
-named iterator : 변수 이름을 지정해서 매칭시켜준다
-positional iterator : 나타난 순서대로 매칭시켜준다
-FETCH 연산은 앞서 한것과 동일하다
함수호출을 이용한 db프로그래밍 : SQL/CLI , JDBC
-Embedded SQL은 한번 쿼리가 embedded되고 나면 변경이 힘들다
API : 동적인 프로그래밍이 가능해진다.
장점 : preprocessor가 필요하지 않다
단점 : SQL에 오류가 있으면 runtime에 발생한다.
SQL call level interface
-SQL 표준의 일부
Microsoft가 개발했던 ODBC를 표준으로 개발했다
-동일 프로그램에서 다수의 db에 접근할수 있게 도와준다
-필요한 library를 include해서 사용한다
-SQL문을 동적으로 생성하고 전달을 할 수 있다.
(C의 4가지 유형의 record structure을 이용해 관리한다)
Components of SQL/CLI
Environment record : db connection과 system 환경정보 관리
connection record: 특정 connection을 위한 정보 관리
statement record: sql문장을 위한 정보 관리
description record : 튜플이나 변수에 대한 정보 관리(튜플 속성개수, 타입정보, 함수호출에 필요한 parameters수)
과정
-SQL/CLI 라이브러리 선언
-4개의 component를 위한 record에 대한 pointer = handle variables
(SQLHSTMT, SQLHDBC, SQLHENV , SQLHDESC)
-SQLAllocHandle을 이용해 해당되는 pointer변수를 세팅
3가지 parameters를 가진다.
handle1 : 해당되는 pointer에 data들이 저장되는 container
handle2 : 새로 생성되는 record에 대한 pointer를 가짐
3개의 변수
stmt1 : sql문을 위해 필요한 정보
con1 :특정 connection을 위해 필요한 정보
env1 : db 접속환경에 관련된 정보를 가지고 있는 변수
SQLRETURN : SQL/CLI를 통해 넘어오는 return code ( error/exception 검출)
ret1부터 순차적으로 코드가 돌아가는 구조
6- SQL_HANDLE_ENV : env1을 선언하기 위한 parameter
SQL_NULL_HANDLE : enviroment가 가장 큰 외곽 구조 이므로 자기를 포함하는 handle은 NULL
&env1 : 결과 전달받음
7-Env1이 생성되면 그 내부에 ret2가 선언되고 (DBC관련) 그 선언된 container record를 &con1이 가르킨다는 것을 얘기한다
8-SQLConnect, 해당되는 connection안에서 수행되야 하므로 con1에서 수행되며 parameters들을 입력받는다
9-statement들을 수행
과정
-SQLPrepare을 이용해 SQL을 번역하고
-SQLExecute로 실행하고
-SQLBindCol로 C변수와 바인딩하고
-SQLFetch로 C변수에 가져온다.
10- SQL준비, sql문이 제공되고 'Ssn=?'에서 ?는 paramter인데 나중에 전달해준다(SQLBindParamter에서)
SQL_NTS = 쿼리 길이를 byte를 넣어줘야 하는데 자동으로 길이를 계산해준다.
11 - Ssn 입력받음
12 - ?와 Ssn을 매칭시켜준다 SQLBindParamter( stmt1 , 1=? 를 의미 , 타입, 입력값, 길이, 실제길이 계산)
13 - stmt1 실행
15,16 - SQLBindCol은 select문의 값을 받아온다.
17 - 검색결과를 가져오는 SQLFetch.
18 - (ret2에 error가 없으면 출력)
JAVA
JDBC
-자바 프로그래밍을 위한 SQL connection 함수 호출
-JDBC함수를 이용하면 JDBC드라이버를 지원하는 어느 DBMS든 접근 가능
-JDBC는 프로그램이 동시에 여러 DB에 access 가능하게함
4 - jdbc 드라이버 호출
5 - 예외처리, 각 jdbc함수호출에 체크 가능
12 - connection 작업
13 - 로그인
14-? = paramter, sql문을 string에 표현
15 - 해당 쿼리 준비
16 - 입력받음
17 - parameter 초기화
18 - 첫 paramter을 ssn에 매칭(타입에 따라 setInterger()등 사용법이 다름)
19 - Resultset은 cursor,iterator와 비슷한 역활
database stored procedures ( 함수같은 개념인듯...?)
db 서버에 저장되는 유저가 지우지 않는이상 보존되는 procedures/functions
장점: 많은 어플리케이션에서 사용한다면 개발할 필요없이 사용가능
서버에서 바로 실행되기 때문에 cc 줄일 수 있음
view같은 것을 모델링할때 융통성을 제공해준다
stored procedure 이용 방법
외부 프로그램을 이용해 작성하여 링크, 디비 내부에서 작성
-stored function
return절을 사용한다
-calling a procedure or fucntion
call문을 통해 호출할 수 있다.
SQL PSM
SQL/PSM저장 프로시저 모듈을 작성하기위한 sql 표준
SQL+ 저장 프로시저/함수 + 추가적 프로그래밍 구조를 통해 작성을 한다.
이런 함수는 SQL의 WHERE 문에 바로 적용할 수 있는 편의성이 있다
'Database' 카테고리의 다른 글
Database-16 (0) | 2020.11.05 |
---|---|
Database-16장 (0) | 2020.10.22 |
Database 14장 (0) | 2020.10.22 |
DATABASE 3장 (0) | 2020.10.10 |
Database 8장 (0) | 2020.10.10 |