사용자 도구

사이트 도구


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

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

tech:codeigniter:01.framework:복수의_sp_호출_방법 [2019/01/09 18:55] (현재)
endofsky 만듦
줄 1: 줄 1:
 +====== 복수의 SP 호출 시 주의사항 ======
 +  - 기존 CodeIgniter (3.x 기준) 에서 SP 호출 이후 다른 query 호출 시 오류 발생
 +  - 이에 mysqli mockup driver patch 수행
 +  - 한 transaction에서 복수의 SP 호출 시 이전 호출 method에서 close_result();​ 선언해주어야함
 +**Example : **
 +<code php>
 +$query = $this->​db->​query($spCall);​
 +$rows = $query->​result_array();​
 +// 다음 resultset으로 이동하여 release 진행. 혹시 향후 유사 오류 발생시 while 구문을 통해 잔여 resultset을 모두 명시적으로 release 필요.
 +// 필수 실행 조건 : SP호출이면서 동일 transaction내 다음 DB 호출이 예상 될 경우
 +$query->​close_result();​
 +</​code>​
  
 +===== 오류 세부 내용 =====
 +한 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 : **
 +<code php [예제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();​ // 결과 저장
 +
 +</​code>​
 +
 +<code php [예제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();​
 +</​code>​
 +
 +===== 개선점 및 한계 =====
 +  - 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기능) 을 사용하는 방안이 있음// ))
tech/codeigniter/01.framework/복수의_sp_호출_방법.txt · 마지막으로 수정됨: 2019/01/09 18:55 저자 endofsky