/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.engine.sql.util.executer.procedure; import java.util.List; import org.apache.log4j.Logger; import com.hangum.tadpole.engine.query.dao.mysql.ProcedureFunctionDAO; import com.hangum.tadpole.engine.query.dao.rdb.InOutParameterDAO; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.RDBTypeToJavaTypeUtils; /** * mysql procedure executer * * <pre> * * Procedure sample.... create procedure p_calc2(in pram1 int, in param2 int, inout param3 int, out ret float) begin set @ret = @param1 / @param2; end; create procedure p_calc3(in pram1 int, in param2 int, inout param3 int, out ret float) begin select * from information_schema.tables; end; </pre> * * @author hangum * @author nilriri * */ public class MySqlProcedureExecuter extends ProcedureExecutor { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(MySqlProcedureExecuter.class); /** * * @param procedureDAO * @param userDB */ public MySqlProcedureExecuter(ProcedureFunctionDAO procedureDAO, UserDBDAO userDB) { super(procedureDAO, userDB); } /** * execute script */ public String getMakeExecuteScript() throws Exception { StringBuffer sbQuery = new StringBuffer(); if ("FUNCTION".equalsIgnoreCase(procedureDAO.getType())){ if(!"".equals(procedureDAO.getPackagename())){ sbQuery.append("SELECT " + procedureDAO.getFullName(true) + "("); }else{ sbQuery.append("SELECT " + procedureDAO.getFullName() + "("); } List<InOutParameterDAO> inList = getInParameters(); for(int i=0; i<inList.size(); i++) { InOutParameterDAO inOutParameterDAO = inList.get(i); if(i == (inList.size()-1)) sbQuery.append(String.format(":%s", inOutParameterDAO.getName())); else sbQuery.append(String.format(":%s, ", inOutParameterDAO.getName())); } sbQuery.append(");"); }else{ // output parameter for (InOutParameterDAO inOutParameterDAO : getOutParameters()) { if(RDBTypeToJavaTypeUtils.isNumberType(inOutParameterDAO.getRdbType())) { sbQuery.append(String.format("SET @%s = 0;\n", inOutParameterDAO.getName())); } else { sbQuery.append(String.format("SET @%s = \"\";\n", inOutParameterDAO.getName())); } } // 프로시저 본체 만들기. if(!"".equals(procedureDAO.getPackagename())){ sbQuery.append(String.format("CALL %s(", procedureDAO.getFullName(true))); }else{ sbQuery.append(String.format("CALL %s(", procedureDAO.getFullName())); } // in 설정 List<InOutParameterDAO> inList = getInParameters(); for(int i=0; i<inList.size(); i++) { InOutParameterDAO inOutParameterDAO = inList.get(i); if(i == (inList.size()-1)) sbQuery.append(String.format(":%s", inOutParameterDAO.getName())); else sbQuery.append(String.format(":%s, ", inOutParameterDAO.getName())); } // out 설정 List<InOutParameterDAO> outList = getOutParameters(); if(!inList.isEmpty() && !outList.isEmpty()) sbQuery.append(", "); for(int i=0; i<outList.size(); i++) { InOutParameterDAO inOutParameterDAO = outList.get(i); if(i != (outList.size()-1)) sbQuery.append(String.format("@%s,", inOutParameterDAO.getName())); else sbQuery.append(String.format("@%s",inOutParameterDAO.getName())); } sbQuery.append(");\n"); // out 출력 for (InOutParameterDAO inOutParameterDAO : getOutParameters()) { sbQuery.append(String.format("SELECT @%s;\n", inOutParameterDAO.getName())); } } if(logger.isDebugEnabled()) logger.debug("Execute Procedure query is\t " + sbQuery.toString()); return sbQuery.toString(); } @Override public boolean exec(List<InOutParameterDAO> parameterList) throws Exception { throw new Exception("Do now use the method"); } }