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.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
import java.sql.DatabaseMetaData;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@ -38,8 +39,10 @@
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.sqoop.util.LoggingUtils;
|
||||||
|
|
||||||
import com.cloudera.sqoop.SqoopOptions;
|
import com.cloudera.sqoop.SqoopOptions;
|
||||||
import com.cloudera.sqoop.SqoopOptions.UpdateMode;
|
import com.cloudera.sqoop.SqoopOptions.UpdateMode;
|
||||||
@ -50,7 +53,6 @@
|
|||||||
import com.cloudera.sqoop.mapreduce.db.OracleDataDrivenDBInputFormat;
|
import com.cloudera.sqoop.mapreduce.db.OracleDataDrivenDBInputFormat;
|
||||||
import com.cloudera.sqoop.util.ExportException;
|
import com.cloudera.sqoop.util.ExportException;
|
||||||
import com.cloudera.sqoop.util.ImportException;
|
import com.cloudera.sqoop.util.ImportException;
|
||||||
import org.apache.sqoop.util.LoggingUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages connections to Oracle databases.
|
* Manages connections to Oracle databases.
|
||||||
@ -707,6 +709,50 @@ public String[] listTables() {
|
|||||||
return tables.toArray(new String[tables.size()]);
|
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
|
@Override
|
||||||
public String[] getColumnNames(String tableName) {
|
public String[] getColumnNames(String tableName) {
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
|
@ -18,7 +18,31 @@
|
|||||||
|
|
||||||
package org.apache.sqoop.manager;
|
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.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.SqoopOptions;
|
||||||
import com.cloudera.sqoop.hbase.HBaseUtil;
|
import com.cloudera.sqoop.hbase.HBaseUtil;
|
||||||
@ -32,30 +56,6 @@
|
|||||||
import com.cloudera.sqoop.util.ImportException;
|
import com.cloudera.sqoop.util.ImportException;
|
||||||
import com.cloudera.sqoop.util.ResultSetPrinter;
|
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.
|
* ConnManager implementation for generic SQL-compliant database.
|
||||||
* This is an abstract class; it requires a database-specific
|
* 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()]);
|
return ret.toArray(new String[ret.size()]);
|
||||||
} finally {
|
} finally {
|
||||||
results.close();
|
results.close();
|
||||||
|
Loading…
Reference in New Issue
Block a user