사용자 도구

사이트 도구


사이드바

tech:codeigniter:01.framework:복수의_sp_호출_방법

복수의 SP 호출 시 주의사항

  1. 기존 CodeIgniter (3.x 기준) 에서 SP 호출 이후 다른 query 호출 시 오류 발생
  2. 이에 mysqli mockup driver patch 수행
  3. 한 transaction에서 복수의 SP 호출 시 이전 호출 method에서 close_result(); 선언해주어야함

Example :

$query = $this->db->query($spCall);
$rows = $query->result_array();
// 다음 resultset으로 이동하여 release 진행. 혹시 향후 유사 오류 발생시 while 구문을 통해 잔여 resultset을 모두 명시적으로 release 필요.
// 필수 실행 조건 : SP호출이면서 동일 transaction내 다음 DB 호출이 예상 될 경우
$query->close_result();

오류 세부 내용

한 transaction에서 복수의 SP call 진행 시 (Error Number: 2014 - Commands out of sync; you can't run this command now) 오류 발생 https://stackoverflow.com/questions/7767231/calling-stored-procedure-in-codeigniter 참조

Fix 내용

  1. /system/database/drivers/mysqli_fix/ 에 mysqli wrapper class로 이루어진 driver 생성
    • mysqli_fix_result.php 에 close_result() function 추가
  2. /application/config/database.php 부분
    • 'dbdriver' ⇒ 'mysql' 을모두 'dbdriver' ⇒ 'mysqli_fix' 로 변경

개선점 및 한계

  1. mockup driver 생성으로 CodeIgniter 마이너 업그레이드 시 영향 없음 (메이저 업그레이드 시에도 db driver 구조 변경이 없으면 사용 상 이슈 없음)
  2. 독립적인 mysqli 함수 사용으로 CodeIgniter가 제공하는 DBCache 사용 시 오류 발생
  3. 해결방안 : 캐시_사용_가이드 참조

Multi-resultset 을 반환하는 SP 사용

  1. 상기와 같은 에러로 인해 CodeIgniter에서는 공식적으로 SP call을 지원하지 않음
  2. 이에 multi resultset을 반환하는 경우 CodeIgniter framework의 dbutil 로는 받아 올 수 없어 patch 진행 (대상 : mysqli mockup driver)
  3. 첫 번째 resultset을 받을 경우 기존과 같이 $query→result_array(); 활용
  4. 이후 resultset은 $query→next_result(); 를 선언하여 포인터 이동 가능
  5. $query→next_result_array(); 를 활용하면 다음 resultset으로 포인터 이동과 동시에 결과 값을 array객체로 리턴 받을 수 있음

Example :

[예제1] 포인터 이동 후 객체 수신.php
$query = "call sp_name($param1, $param2, ... )"; // query 정의
$query = $this->db->query($query); // query 수행
 
# 첫 번째 resultset 수신
$result['list'] = $query->result_array();
 
# 두 번째 resultset 수신
$query->next_result(); // 다음 포인터로 이동
$result['totalCnt'] = $query->result_array(); // 결과 저장
[예제2] next_result_array()를 활용하여 바로 다음 결과 수신.php
$query = "call sp_name($param1, $param2, ... )"; // query 정의
$query = $this->db->query($query); // query 수행
 
# 첫 번째 resultset 수신
$result['list'] = $query->result_array();
 
# 두 번째 resultset 수신
$result['totalCnt'] = $query->next_result_array();

개선점 및 한계

  1. CodeIgniter의 SP사용 제약사항 해소 및 mockup driver활용을 통한 마이너 버전업 대비 가능
  2. 해당 기능 적용으로 인해 framework에서 제공하는 dbcache 사용이 사실상 불가능해짐. 1)
1) CodeIgniter의 dbcache방식은 resultset 객체를 cache파일 등에 저장시킨 후에, 이후 호출 시 cache의 resultset을 db_result class의 멤버변수에 저장하는 방식임. 만약 여러 resultset을 리턴하는 SP의 경우 해당 멤버변수를 배열형으로 변경 후, dbcache 모듈 자체를 index에 따라 리턴 해 주도록 업데이트 해야 함. 해당 작업은 framework의 core모듈을 직접 건드리게 되어 향후 framework의 버전 업에 대응 할 수 없게 됨. 대안으로는 꼭 cache를 사용해야 할 경우 dbcache가 아닌 CodeIgniter에서 제공하는 다른 종류의 cache(viewcache나 일반 cache기능) 을 사용하는 방안이 있음
tech/codeigniter/01.framework/복수의_sp_호출_방법.txt · 마지막으로 수정됨: 2019/01/09 18:55 저자 endofsky