Search

6 : Advanced SQL

course
last review
2023/04/15
mastery
intermediate
progress
not started
date
2023/03/28
4 more properties
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