mirror of
https://github.com/apache/sqoop.git
synced 2025-05-20 10:51:21 +08:00
SQOOP-1029: Oracle export using procedures does not work
(Venkat Ranganathan via Jarek Jarcec Cecho)
This commit is contained in:
parent
0bd1e89353
commit
e76ee6eea5
@ -21,6 +21,7 @@
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
@ -38,8 +39,10 @@
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.sqoop.util.LoggingUtils;
|
||||
|
||||
import com.cloudera.sqoop.SqoopOptions;
|
||||
import com.cloudera.sqoop.SqoopOptions.UpdateMode;
|
||||
@ -50,7 +53,6 @@
|
||||
import com.cloudera.sqoop.mapreduce.db.OracleDataDrivenDBInputFormat;
|
||||
import com.cloudera.sqoop.util.ExportException;
|
||||
import com.cloudera.sqoop.util.ImportException;
|
||||
import org.apache.sqoop.util.LoggingUtils;
|
||||
|
||||
/**
|
||||
* Manages connections to Oracle databases.
|
||||
@ -707,6 +709,50 @@ public String[] listTables() {
|
||||
return tables.toArray(new String[tables.size()]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getColumnNamesForProcedure(String procedureName) {
|
||||
List<String> ret = new ArrayList<String>();
|
||||
try {
|
||||
DatabaseMetaData metaData = this.getConnection().getMetaData();
|
||||
ResultSet results = metaData.getProcedureColumns(null, null,
|
||||
procedureName, null);
|
||||
if (null == results) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
while (results.next()) {
|
||||
if (results.getInt("COLUMN_TYPE")
|
||||
!= DatabaseMetaData.procedureColumnReturn) {
|
||||
int index = results.getInt("ORDINAL_POSITION");
|
||||
if (index < 0) {
|
||||
continue; // actually the return type
|
||||
}
|
||||
for (int i = ret.size(); i < index; ++i) {
|
||||
ret.add(null);
|
||||
}
|
||||
String name = results.getString("COLUMN_NAME");
|
||||
if (index == ret.size()) {
|
||||
ret.add(name);
|
||||
} else {
|
||||
ret.set(index, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
String[] result = ret.toArray(new String[ret.size()]);
|
||||
LOG.debug("getColumnsNamesForProcedure returns "
|
||||
+ StringUtils.join(ret, ","));
|
||||
return result;
|
||||
} finally {
|
||||
results.close();
|
||||
getConnection().commit();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
LoggingUtils.logAll(LOG, "Error reading procedure metadata: ", e);
|
||||
throw new RuntimeException("Can't fetch column names for procedure.", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getColumnNames(String tableName) {
|
||||
Connection conn = null;
|
||||
|
@ -18,7 +18,31 @@
|
||||
|
||||
package org.apache.sqoop.manager;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.sql.Timestamp;
|
||||
import java.sql.Types;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.sqoop.mapreduce.JdbcCallExportJob;
|
||||
import org.apache.sqoop.util.LoggingUtils;
|
||||
import org.apache.sqoop.util.SqlTypeMap;
|
||||
|
||||
import com.cloudera.sqoop.SqoopOptions;
|
||||
import com.cloudera.sqoop.hbase.HBaseUtil;
|
||||
@ -32,30 +56,6 @@
|
||||
import com.cloudera.sqoop.util.ImportException;
|
||||
import com.cloudera.sqoop.util.ResultSetPrinter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.Statement;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Types;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.sqoop.mapreduce.JdbcCallExportJob;
|
||||
import org.apache.sqoop.util.LoggingUtils;
|
||||
import org.apache.sqoop.util.SqlTypeMap;
|
||||
|
||||
/**
|
||||
* ConnManager implementation for generic SQL-compliant database.
|
||||
* This is an abstract class; it requires a database-specific
|
||||
@ -196,6 +196,8 @@ public String[] getColumnNamesForProcedure(String procedureName) {
|
||||
}
|
||||
}
|
||||
}
|
||||
LOG.debug("getColumnsNamesForProcedure returns "
|
||||
+ StringUtils.join(ret, ","));
|
||||
return ret.toArray(new String[ret.size()]);
|
||||
} finally {
|
||||
results.close();
|
||||
|
Loading…
Reference in New Issue
Block a user