====== 복수의 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기능) 을 사용하는 방안이 있음// ))