diff --git a/src/java/org/apache/sqoop/manager/OracleManager.java b/src/java/org/apache/sqoop/manager/OracleManager.java index 1999344c..edc888e5 100644 --- a/src/java/org/apache/sqoop/manager/OracleManager.java +++ b/src/java/org/apache/sqoop/manager/OracleManager.java @@ -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 ret = new ArrayList(); + 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; diff --git a/src/java/org/apache/sqoop/manager/SqlManager.java b/src/java/org/apache/sqoop/manager/SqlManager.java index 6952b9e2..e96368ba 100644 --- a/src/java/org/apache/sqoop/manager/SqlManager.java +++ b/src/java/org/apache/sqoop/manager/SqlManager.java @@ -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();