Oracle 프로시저 – 오브젝트 어레이 선언해서 돌리기

테스트코드 짜다가 버리기 아까워서 저장.

 

타입선언

create or replace TYPE USER_OBJECT AS OBJECT
(
    V_USERNAME     VARCHAR2(20),
    V_PHONE      VARCHAR2(20),
    V_ADDRESS       VARCHAR2(100)
);

create or replace TYPE USER_OBJECT_ARRAY AS TABLE OF USER_OBJECT;

테이블

 CREATE TABLE USERTABLE 
   (	V_USERNAME VARCHAR2(20), 
	V_PHONE VARCHAR2(20), 
	V_ADDRESS VARCHAR2(100)
   )

 

 

그냥 실행문

DECLARE
V_CODE                 VARCHAR2(100);
V_MSG                  VARCHAR2(100);
v_CNT NUMBER(4) :=0 ;
v_userArr USER_OBJECT_ARRAY;
v_user USER_OBJECT;

BEGIN

v_userArr := USER_OBJECT_ARRAY(USER_OBJECT('김유저', '010-000-3333', '서울시 전체'), USER_OBJECT('최유저', '010-4444-4444', '경기도 전체'));

for i in 1..v_userArr.count loop
  dbms_output.put_line(v_userArr(i).V_USERNAME);
end loop;
  
END;

 

 

프로시저

create or replace PROCEDURE         MASS_USER_PROCEDURE 
(
 v_userArr          in USER_OBJECT_ARRAY,
 O_RESULR_CODE                        OUT VARCHAR2,
 O_RESULT_MESSAGE                         OUT VARCHAR2) 
 
IS

--V_USERNAME     VARCHAR2(20);
--V_PHONE      VARCHAR2(20);
--V_ADDRESS       VARCHAR2(100);
    
i BINARY_INTEGER := 0;

BEGIN

for i in 1..v_userArr.count loop
  dbms_output.put_line(v_userArr(i).V_USERNAME);
  insert into usertable (V_USERNAME, V_PHONE, V_ADDRESS) values (v_userArr(i).V_USERNAME, v_userArr(i).V_PHONE, v_userArr(i).V_ADDRESS); 
end loop;
commit;
   
END MASS_USER_PROCEDURE;

 

프로시저 호출코드

DECLARE
v_code                     VARCHAR2(100);
v_message                  VARCHAR2(100);
v_userArr USER_OBJECT_ARRAY;
v_user USER_OBJECT;

BEGIN

v_userArr := USER_OBJECT_ARRAY(USER_OBJECT('김유저', '0103333', '서울시 전체'), USER_OBJECT('최유저', '0104444', '경기도 전체'));

for i in 1..v_userArr.count loop
  MASS_USER_PROCEDURE(v_userArr, V_CODE, V_MSG);
  dbms_output.put_line(v_CODE);
end loop;
  
END;

 

 

 

 

제일 도움된 페이지 :

https://oracle-base.com/articles/8i/collections-8i

Mybatis – Oracle Procedure 연동해서 사용해서 여러개의 ResultSet을 받아오는 케이스

인터넷에 한개짜리는 많이 나오는데

여러개를 받아야 하는 경우에 대한 케이스.
한참 디버깅해서 알아냈지만
알고보면 간단하다

 

솔루션부터… Mybatis Mapper파일
매퍼를 여러개 지정 해 줘야한다. 한곳에서 result가 다 담겨나오지 않네.. 생각해보면 당연한데

<mapper namespace="org.beansugar.api.server.module.common.dao.CommonMainDAO">
	<resultMap type="java.util.HashMap" id="pMap">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap0">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap1">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap2">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap3">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap4">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap5">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap6">
	</resultMap>
	<resultMap type="java.util.HashMap" id="pMap7">
	</resultMap>
</mapper>

 

또 Mybatis Mapper파일이지만 이번엔 프로시저 호출부분

	<select id="PID-057" parameterType="hashmap" statementType="CALLABLE">
		{ call MEMBER_001(
			#{username,mode=IN,jdbcType=VARCHAR},

			#{email,mode=OUT,jdbcType=VARCHAR},
			#{joinDate,mode=OUT,jdbcType=VARCHAR},
			#{name,mode=OUT,jdbcType=VARCHAR},


			#{groupInfo,mode=OUT,jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=pMap0},
			#{friendInfo,mode=OUT,jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=pMap1},
			#{pointInfo,mode=OUT,jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=pMap2},

			#{code,mode=OUT,jdbcType=VARCHAR},
			#{message,mode=OUT,jdbcType=VARCHAR}
			)
		}
	</select>

 

Java – Mybatis 호출 코드

getSqlSessionTemplate().selectOne("procedure-member-001", param);

List<Map<String,Object>> subList0 = (List<Map<String, Object>>)param.get("groupInfo");

subList0내의 결과값은 프로시저에서 지정한 이름으로 나온다. mybatis에서 손대려면 resultMap을 만져주면 될 것 같은데...
그것도 귀찮으니 그냥 코드로 하는게 나을 것같다