Previous chapter
Accessing SQL from a Programming Language
프로그래밍 언어에서 SQL에 접근하는 방법!
유저가 쿼리를 알리는 경우도 많지만, 언어에서 쿼리를 알리는 경우도 있다.
기본적으로 파일시스템이나 간단한 스토리지 시스템에 비해서 복잡한 조건을 갖는 자료구조를 바로 가져올 수 있다는 점에서 효율적이다.
JDBC and ODBC
API
•
DB 서버에 접속
•
DB서버에 SQL 커맨드 전송!
•
프로그램 변수에 1대1로 튜플 Fetch
ODBC (Open Database Connectivity) : C, C++, C#, VB
JDBC (Java Database Connectivity) : Java
JDBC
•
Connection 오픈
•
Sataement Object 생성
•
Statement 변수에 쿼리 전송 하고 결과 확인
•
에러 핸들링을 통한 예외 메커니즘
JDBC Code
SQLJ
#sql iterator deptInfoIter(String dept_name,
int avgSal);
deptInfoIter iter = null;
#sql iter = { select dept_name, avg(salary)
from instructor
group by dept name };
while (iter.next()) {
String deptName = iter.dept_name();
int avgSal = iter.avgSal();
System.out.println(deptName + " " + avgSal);
}
iter.close();
Java
복사
SQL임베드 + JAVA
ODBC
API제공고전
•
DB와의 연결이 가능
•
쿼리와 업데이트를 보내고
•
결과를 반환받는것
GUI,스프레스시트 등을 ODBC에 쓸 수 있다.
각 DB시스템에는 클라이언트와 링크되어있는 라이브러리인 드라이버가 제공되어야 한다.
클라이언트가 ODBC API콜에 관련된 프로그램을 만들면 library가 서버와 통신함
ODBC는 먼저 sQL환경을 할당/초기화하고, DB연결 핸들러를 할당/초기화한다.
•
SQLConnect();
◦
파라미터 : Connection handle, server, user id, pw
ODBC Code
int ODBCexample()
{
RETCODE error;
HENV env; /* environment */
HDBC conn; /* database connection */
SQLAllocEnv(&env); //Environment 변수 공간 할당(안에 malloc 등등..)
SQLAllocConnect(env, &conn); //연결관련 공간 할당
SQLConnect(conn, “localhost", SQL_NTS,
“bnam", SQL_NTS, “changethis", SQL_NTS); // 연결
{ …. Do actual work … }
SQLDisconnect(conn);//접속종료
SQLFreeConnect(conn);//메모리 프리
SQLFreeEnv(env);//환경변수 프리
}
C
복사
프로그램이 SQL을 쿼리를 수행하기 위해 SQLExecDirect를 쓰고
Rel
char deptname[80];
float salary;
int lenOut1, lenOut2;
HSTMT stmt;
char * sqlquery = "select dept_name, sum (salary)
from instructor
group by dept_name";
SQLAllocStmt(conn, &stmt);
error = SQLExecDirect(stmt, sqlquery, SQL_NTS); //
if (error == SQL SUCCESS) {
SQLBindCol(stmt, 1, SQL_C_CHAR,
deptname, 80, &lenOut1);
SQLBindCol(stmt, 2, SQL_C_FLOAT,
&salary, 0 , &lenOut2);
while (SQLFetch(stmt) == SQL_SUCCESS) {
printf (" %s %g\n", deptname, salary);
}
}
SQLFreeStmt(stmt, SQL_DROP);
C
복사
ODBC Prepared Statements
More ODBC Features
SQLSetConnectOption(conn, SQL_AUTOCOMMIT,0)
C
복사
SQLTransact(conn, SQL_COMMIT) or SQLTransact(conn, SQL_ROLLBACK)
C
복사
MySQL C API
MYSQL *conn = mysql_init(NULL);//SQL 초기화
mysql_real_connect(conn, "localhost", “id",
"changethis", “db_name", 0, NULL, 0);
char * sqlquery = "select dept_name, avg(salary)\
from instructor group by dept_name ";
mysql_query(conn, sqlquery);
MYSQL_RES *result = mysql_store_result(conn);
int num_fields = mysql_num_fields(result);
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
for(int i=0; i<num_fields; i++){
printf (" %s ", row[i]? row[i] : "NULL");
}
printf("\n");
}
mysql_free_result(result);
mysql_close(conn);
C
복사
Embedded SQL
Example Query
void main ()
{
EXEC SQL BEGIN DECLARE SECTION;
int credit_amount;
EXEC SQL END DECLARE SECTION;
…
EXEC SQL
declare c cursor for
select ID, name
from student
where tot_cred > :credit_amount
END_EXEC
…
}
C
복사
Procedural Extensions and Stored Procedures
SQL Functions
DELIMITER //
create function dept_count (d_name varchar(20))
returns integer
begin
declare d_count integer;
select count (* ) into d_count
from instructor
where instructor.dept_name = d_name;
return d_count;
end //
DELIMITER ;
C
복사
MySQL: DELIMITER
Table Functions
create function instructors_of (dept_name char(20))
returns table ( ID varchar(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2))
return table
(select ID, name, dept_name, salary
from instructor
where instructor.dept_name = instructors_of.dept_name)
SQL
복사
MySQL: Functions
function <function-name> (param_spec1, …, param_speck)
returns <return_type>
[not] deterministic allow optimization if same output
for the same input
begin
-- execution code
end;
SQL
복사
MySQL: Procedure
DELIMITER //
create procedure instructors_of (dept_name char(20))
begin
select ID, name, dept_name, salary
from instructor
where instructor.dept_name = dept_name;
end //
DELIMITER ;
SQL
복사
Create Procedure <proc-name>
(param_spec1, param_spec2, …, param_specn)
begin
-- execution code
end;
SQL
복사
MySQL: IF
IF <condition> then
<statements>
ELSEIF <condition> then
<statements>
ELSE
<statements>
END IF
SQL
복사
MySQL: Case Statement
MySQL: Repeat Until
MySQL: While
Triggers
Trigger Example
DELIMITER//
create trigger trigger name (before, after) (insert on 등등)
for each row
begin
if new.dept_name is not null then
update department
set department.budget = department.budget + new.salary
where department.dept_name = new.dept_name;
END//
delimiter;
Assembly
복사
Next chapter