PHP 를 이용한 Oracle DB 접속과 활용

PHP

PHP 를 이용한 Oracle DB 접속과 활용

 

개발환경 : PHP 5.2, window 7 32bit, Oracle 11g,

 

web application DB 와 뗄수 없는 관계이다. 보통 PHP MySQL

자주 사용된다. Oracle 과 관련된 내용이 별로 없는 것 같아 정리해본다.

PHP 에서 RDBMS 를 이용하는 방법은 종류가 틀려도 동일한 과정을

거치기 때문에 같은 기능을 하는 함수명을 찾아 끼워넣어 사용하기만 하면 된다.

그 비슷한 과정이란 것이 아래 그림과 같다.

그리고 그 기능을 하는 API 함수가 아래에 나와 있다. 아래로 내려 가며 순서대로

이루어진다

 

  


1. 각각의 기능에 대한 설명

 

(1) DB 접속

오라클에서 접속에 필요한 정보는 3가지이다. 아이디, 패스워드, 서비스명 이다.

oci_connect 에서 넘기는 인자값도 3가지면 된다.

 

$connection = oci_connect(“gon”, “1111”, “ora11”);

 

(2) SQL 구문 파싱

이부분에서 오라클의 특징을 알수 있는데 수행 비용을 적게 들이기 위한

과정이 포함된다. 수행비용이란 최적의 실행방법을 찾아내어 실행한다는 말이다.

조회일 경우에 필드중 인덱스가 있다면 그 것을 찾아 실행하는 것이다.

구문은 간단하다. 파라미터로 접속정보와 수행할 쿼리를 넘기면 된다.

 

$result = oci_parse($connection, $sql)

 

(3) SQL 실행

실행전에 넘겨야 할 변수가 있다면 oci_bind_by_name 로 각 변수에

값을 연결해서 넘긴다. 첫번째 파라미터는 oci_parse 를 통해 리턴받은

값을 넘기면 된다. 두번째는 쿼리에서 bind 할 변수와 세번째는 그

바인드 변수에 넘길 값을 셋팅하면 된다

 

oci_bind_by_name($result, “:v_sno”, $sno);

 

바인드 할것이 없다면 바로 SQL 을 실행하면 된다. 그리고 리소스를 리턴받아

사용해야 되는 경우에는 oci_execute 의 리턴값을 받으면 된다.

 

$return = oci_execute($result);

 

(4) 결과 패치

조회성 쿼리는 oci_execute 를 수행한후에 그 결과값을 배열에 패치시켜야한다

두가지 함수를 제공하는데 1차원 배열로 값을 전달하는 oci_fetch_array

2차원 배열로 값을 전달하는 oci_fetch_all 이 있다.

1차원 배열인 oci_fetch_array 는 첫번째 배열값이 키이다.

2차원 배열인 oci_fetch_all 은 첫번째 배열값이 키이고 두번째가 행의 번호가 된다.

 

while($row = oci_fetch_array($result, OCI_ASSOC)){

   $sno = $row[SNO];

}

 

for ($i = 0; $i<$row_num; $i++){

   $sno = $row[SNO][$i];

}

 

oci_fetch_all 는 한번의 패치로 리소스 전체를 가져오기 때문에

속도는 빠를지 모르나 메모리를 많이 사용하는 단점이 있다.

 

(5) SQL 종료

oci_execute 함수 실행후 결과값으로 리턴받은 리소스가 점유한 메모리를 반환한다.

완전한 반환을 위해 명시적으로 적어주는 것이 좋다.

메모리를 반환했으면 마지막으로 오라클을 종료한다.

 

oci_free_statement ($result);

oci_close ($connection)

 

2. 다양한 기능에 대한 처리 예제

 

프로그램을 짜게 되면 기능은 핵심적인 몇 개만 알면 된다.

입력, 조회, 수정, 삭제가 그것이다. 이 네 가지 기능에 대한

소스만 정리하면 나머지는 응용이 되는 것이다.

Orcale 과 연결해서 쿼리를 처리하는 관점에서만 보면 크게

두가지로 압출할수 있다. 조회와 입력/수정/삭제 가 그것이다.

조회 외에는 Orale 에 수행 명령을 내리고 간단하게 성공여부만

알아오는 것이기 때문에 쿼리만 틀릴뿐 소스는 같다.

 

(1) 조회 기능

쿼리 수행후 리턴받은 데이터를 패치할 때 반환된 배열의 형식 옵션

두가지가 있다. OCI_ASSOC OCI_NUM 인데

OCI_NUM 은 스칼라 배열만 생성하고 OCI_ASSOC 는 연관배열만 생성한다.

예를 들자면 OCI_NUM $row[0], $row[1] … 배열의 요소값으로 하고

OCI_ASSOC $row[SNO], $row[SNAME] … 쿼리필드 값을 key

사용해서 값을 엑세스 한다.

 

$connection = oci_connect($username, $password, $server);
	    
// 출력
$query = "SELECT * FROM STUDENT";
$result = oci_parse($connection, $query);
$success = oci_execute($result);
		
// OCI_NUM
while ($row = oci_fetch_array($result, OCI_ASSOC)) {
   $row[SNO];
   $row[SNAME];
}
	    
oci_free_statement($result);
oci_close($connection);

 

(2) 입력/수정/삭제 기능

수정, 삭제도 쿼리만 틀리고 사용순서와 함수들은 아래와 같이 사용하면 된다.

 

// 입력예제 
$sno = $_POST["sno"];
  
$query = "insert into student (sno) value (:v_sno)";
$result = oci_parse($connection, $query);
oci_bind_by_name($result, ":v_sno", $sno);
$success = oci_execute($result);
    
oci_free_statement($result);
oci_close($connection);
Posted by 녹두장군