You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
8.0 KiB
186 lines
8.0 KiB
package com.fr.plugin.db.procedure.dialectcreator; |
|
|
|
import com.fr.base.StoreProcedureParameter; |
|
import com.fr.data.core.db.DBUtils; |
|
import com.fr.data.core.db.dialect.Dialect; |
|
import com.fr.data.core.db.dialect.base.key.fetchspp.parameter.FetchStoreProcedureParameterUtils; |
|
import com.fr.data.core.db.dialect.base.key.fetchspp.parameter.OracleDialectFetchStoreProcedureParameterExecutor; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.stable.StringUtils; |
|
import org.jetbrains.annotations.NotNull; |
|
|
|
import java.sql.Connection; |
|
import java.sql.ResultSet; |
|
import java.sql.SQLException; |
|
import java.sql.Statement; |
|
import java.util.ArrayList; |
|
import java.util.List; |
|
|
|
public class MyOracleDialectFetchStoreProcedureParameterExecutor extends OracleDialectFetchStoreProcedureParameterExecutor { |
|
|
|
@Override |
|
public StoreProcedureParameter[] execute(Connection conn, String name, String parameterDefaultValue, Dialect current) { |
|
String query = this.getProcedureParametersSql(name); |
|
StoreProcedureParameter[] parameters = this.getStoreProcedureParameters(conn, parameterDefaultValue, query); |
|
if (parameters.length == 0) { |
|
String queryOther = this.getProcedureParametersSqlByOtherUser(conn, name); |
|
if (StringUtils.isNotEmpty(queryOther)) { |
|
parameters = this.getStoreProcedureParameters(conn, parameterDefaultValue, queryOther); |
|
} |
|
} |
|
|
|
return parameters; |
|
} |
|
|
|
|
|
private int sql2ColumnTypeForProcedure(String type) { |
|
if (type == null) { |
|
return 12; |
|
} else if (type.toUpperCase().indexOf("CHAR") <= -1 && type.toUpperCase().indexOf("BIT") <= -1) { |
|
if (type.toUpperCase().indexOf("INT") > -1) { |
|
return 4; |
|
} else if (isDecimalType(type)) { |
|
return 3; |
|
} else if (type.toUpperCase().indexOf("DATE") > -1) { |
|
return 91; |
|
} else { |
|
return type.toUpperCase().indexOf("BOOLEAN") > -1 ? 16 : 12; |
|
} |
|
} else { |
|
return 12; |
|
} |
|
} |
|
|
|
|
|
private static boolean isDecimalType(String type) { |
|
return type.toUpperCase().indexOf("DECIMAL") > -1 || type.toUpperCase().indexOf("NUMERIC") > -1 || type.toUpperCase().indexOf("DOUBLE") > -1 || type.toUpperCase().indexOf("FLOAT") > -1 || type.toUpperCase().indexOf("NUMBER") > -1; |
|
} |
|
|
|
private @NotNull StoreProcedureParameter[] getStoreProcedureParameters(Connection conn, String parameterDefaultValue, String query) { |
|
List<StoreProcedureParameter> list = new ArrayList(); |
|
Statement stat = null; |
|
ResultSet resultSet = null; |
|
|
|
StoreProcedureParameter[] var8; |
|
try { |
|
stat = conn.createStatement(); |
|
FineLoggerFactory.getLogger().info("query:"+query); |
|
resultSet = stat.executeQuery(query); |
|
int i = 0; |
|
|
|
while(resultSet.next()) { |
|
++i; |
|
String parameterName = resultSet.getString("argument_name"); |
|
String DataType = resultSet.getString("Data_type"); |
|
String inOut = resultSet.getString("in_out"); |
|
String plsType = resultSet.getString("pls_type"); |
|
int level = resultSet.getInt("DATA_LEVEL"); |
|
|
|
FineLoggerFactory.getLogger().info("parameterName:"+parameterName+",DataType:"+DataType+",inOut:"+inOut+",plsType:"+plsType+",level:"+level); |
|
|
|
if (level <= 0) { |
|
DataType = DataType == null ? "" : DataType; |
|
int type; |
|
if (DataType.toUpperCase().contains("CURSOR")) { |
|
type = -10; |
|
} else { |
|
type = sql2ColumnTypeForProcedure(plsType); |
|
} |
|
|
|
if(parameterName != null){ |
|
StoreProcedureParameter tempPara; |
|
if (DataType.toUpperCase().contains("VARCHAR") && StringUtils.isNotEmpty(parameterDefaultValue)) { |
|
tempPara = new StoreProcedureParameter(parameterName == null ? "storeParameter" + i : parameterName, parameterDefaultValue, sql2ParameterType(inOut), type); |
|
} else { |
|
tempPara = new StoreProcedureParameter(parameterName == null ? "storeParameter" + i : parameterName, sql2ParameterType(inOut), type); |
|
} |
|
|
|
list.add(tempPara); |
|
} |
|
|
|
} |
|
} |
|
|
|
var8 = (StoreProcedureParameter[])list.toArray(new StoreProcedureParameter[0]); |
|
return var8; |
|
} catch (SQLException var18) { |
|
FineLoggerFactory.getLogger().error(var18.getMessage(), var18); |
|
var8 = (StoreProcedureParameter[])list.toArray(new StoreProcedureParameter[0]); |
|
} finally { |
|
DBUtils.close(resultSet); |
|
DBUtils.close(stat); |
|
} |
|
|
|
return var8; |
|
} |
|
|
|
private int sql2ParameterType(String inOut) { |
|
if (ComparatorUtils.equals(inOut.toUpperCase(), "OUT")) { |
|
return 2147483645; |
|
} else if (ComparatorUtils.equals(inOut.toUpperCase(), "IN")) { |
|
return 2147483646; |
|
} else { |
|
return ComparatorUtils.equals(inOut.toUpperCase(), "IN/OUT") ? 2147483644 : 2147483646; |
|
} |
|
} |
|
|
|
private String getProcedureParametersSql(String fullProcedureName) { |
|
String[] nameAddress = fullProcedureName.split("\\."); |
|
String procedureName; |
|
if (nameAddress.length == 3) { |
|
String packageName = nameAddress[1]; |
|
procedureName = nameAddress[2]; |
|
return "select argument_name, Data_type, in_out, pls_type, DATA_LEVEL from sys.user_arguments WHERE OBJECT_NAME='" + procedureName + "' and PACKAGE_NAME='" + packageName + "' order by position"; |
|
} else { |
|
procedureName = nameAddress[nameAddress.length - 1]; |
|
return "select argument_name, Data_type, in_out, pls_type, DATA_LEVEL from sys.user_arguments WHERE OBJECT_NAME='" + procedureName + "' and PACKAGE_NAME is null order by position"; |
|
} |
|
} |
|
|
|
private String getProcedureParametersSqlByOtherUser(Connection conn, String fullProcedureName) { |
|
String[] nameAddress = fullProcedureName.split("\\."); |
|
Statement stat = null; |
|
ResultSet queryResultSet = null; |
|
String query = ""; |
|
|
|
String owner; |
|
try { |
|
stat = conn.createStatement(); |
|
String ownerQuery = this.getOwner(nameAddress[nameAddress.length - 1]); |
|
queryResultSet = stat.executeQuery(ownerQuery); |
|
|
|
for(owner = ""; queryResultSet.next(); owner = queryResultSet.getString("OWNER")) { |
|
} |
|
|
|
query = this.getProcedureParametersSql(owner, nameAddress); |
|
String var9 = query; |
|
return var9; |
|
} catch (SQLException var13) { |
|
FineLoggerFactory.getLogger().debug("oracle procedure parameters:{}", new Object[]{query}); |
|
owner = query; |
|
} finally { |
|
DBUtils.closeResultSet(queryResultSet); |
|
DBUtils.closeStatement(stat); |
|
} |
|
|
|
return owner; |
|
} |
|
|
|
private String getProcedureParametersSql(String owner, String[] nameAddress) { |
|
String procedureName; |
|
if (nameAddress.length == 3) { |
|
String packageName = nameAddress[1]; |
|
procedureName = nameAddress[2]; |
|
return "select argument_name, Data_type, in_out, pls_type, DATA_LEVEL FROM all_arguments WHERE OWNER = '" + owner + "' and OBJECT_NAME='" + procedureName + "' and PACKAGE_NAME='" + packageName + "' order by position"; |
|
} else { |
|
procedureName = nameAddress[nameAddress.length - 1]; |
|
return "select argument_name, Data_type, in_out, pls_type, DATA_LEVEL FROM all_arguments WHERE OWNER = '" + owner + "' and OBJECT_NAME='" + procedureName + "' and PACKAGE_NAME is null order by position"; |
|
} |
|
} |
|
|
|
private String getOwner(String procedureName) { |
|
return "SELECT OWNER FROM all_objects WHERE OBJECT_TYPE = 'PROCEDURE' AND OBJECT_NAME = '" + procedureName + "'"; |
|
} |
|
|
|
}
|
|
|