====== 복수의 SP 호출 시 주의사항 ======
- 기존 CodeIgniter (3.x 기준) 에서 SP 호출 이후 다른 query 호출 시 오류 발생
- 이에 mysqli mockup driver patch 수행
- 한 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 내용 =====
- /system/database/drivers/mysqli_fix/ 에 mysqli wrapper class로 이루어진 driver 생성
* mysqli_fix_result.php 에 close_result() function 추가
- /application/config/database.php 부분
* 'dbdriver' => 'mysql' 을모두 'dbdriver' => 'mysqli_fix' 로 변경
===== 개선점 및 한계 =====
- mockup driver 생성으로 CodeIgniter 마이너 업그레이드 시 영향 없음 (메이저 업그레이드 시에도 db driver 구조 변경이 없으면 사용 상 이슈 없음)
- 독립적인 mysqli 함수 사용으로 CodeIgniter가 제공하는 DBCache 사용 시 오류 발생
- 해결방안 : [[03.프로그램_모듈:02.framework:01.사용가이드:02.캐시_사용_가이드|캐시_사용_가이드]] 참조
====== Multi-resultset 을 반환하는 SP 사용 ======
- 상기와 같은 에러로 인해 CodeIgniter에서는 공식적으로 SP call을 지원하지 않음
- 이에 multi resultset을 반환하는 경우 CodeIgniter framework의 dbutil 로는 받아 올 수 없어 patch 진행 (대상 : mysqli mockup driver)
- 첫 번째 resultset을 받을 경우 기존과 같이 $query->result_array(); 활용
- 이후 resultset은 $query->next_result(); 를 선언하여 포인터 이동 가능
- $query->next_result_array(); 를 활용하면 다음 resultset으로 포인터 이동과 동시에 결과 값을 array객체로 리턴 받을 수 있음
** Example : **
$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(); // 결과 저장
$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();
===== 개선점 및 한계 =====
- CodeIgniter의 SP사용 제약사항 해소 및 mockup driver활용을 통한 마이너 버전업 대비 가능
- 해당 기능 적용으로 인해 framework에서 제공하는 dbcache 사용이 사실상 불가능해짐. ((//CodeIgniter의 dbcache방식은 resultset 객체를 cache파일 등에 저장시킨 후에, 이후 호출 시 cache의 resultset을 db_result class의 멤버변수에 저장하는 방식임. 만약 여러 resultset을 리턴하는 SP의 경우 해당 멤버변수를 배열형으로 변경 후, dbcache 모듈 자체를 index에 따라 리턴 해 주도록 업데이트 해야 함. 해당 작업은 framework의 core모듈을 직접 건드리게 되어 향후 framework의 버전 업에 대응 할 수 없게 됨. 대안으로는 꼭 cache를 사용해야 할 경우 dbcache가 아닌 CodeIgniter에서 제공하는 다른 종류의 cache(viewcache나 일반 cache기능) 을 사용하는 방안이 있음// ))