Thanks Abdul, I changed your code to include Oracle Cursors and it works great. I made the stmt a CallableStatement with stmt.registerOutParameter(1,OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = (ResultSet) ((OracleCallableStatement)stmt).getCursor(1);
and added rsmd.getColumnType(i) == OracleTypes.CURSOR
Here’s my version:
String user=“”, pass=“”, dburl=“”, command=“”;
int rowcount=0;
ArrayList al_results = new ArrayList();
Connection conn=null;
byte bytes=null;
IDataHashCursor id = pipeline.getHashCursor();
// only will use the first occurance of the message element
if (id.first(“user”)) user = (String)id.getValue();
if (id.first(“password”)) pass = (String)id.getValue();
if (id.first(“url”)) dburl = (String)id.getValue();
if (id.first(“sql”)) command = (String)id.getValue();
try
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
conn = DriverManager.getConnection(dburl, user, pass);
}
catch(SQLException sqle)
{
id.last();
id.insertAfter( “$dbMessage”, sqle.getMessage() );
id.insertAfter( “$rowCount”, “0” );
}
CallableStatement stmt = null;
try
{
stmt = conn.prepareCall(command);
stmt.registerOutParameter(1,OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = (ResultSet) ((OracleCallableStatement)stmt).getCursor(1);
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();
while( rs.next() )
{
rowcount++;
IData result = IDataFactory.create();
IDataCursor resultCursor = result.getCursor();
for( int i=1; i<=colCount; i++ )
{
if( rsmd.getColumnType(i) == java.sql.Types.BINARY || rsmd.getColumnType(i) == java.sql.Types.LONGVARBINARY || rsmd.getColumnType(i) == java.sql.Types.BLOB || rsmd.getColumnType(i) == OracleTypes.CURSOR )
{
resultCursor.insertAfter(rsmd.getColumnName(i), rs.getBytes(i));
}
else
{
resultCursor.insertAfter(rsmd.getColumnName(i), rs.getString(i));
}
}
resultCursor.destroy();
al_results.add(result);
}
rs.close();
stmt.close();
conn.close();
}
catch(SQLException sqle)
{
id.last();
id.insertAfter( “$dbMessage”, sqle.getMessage() );
id.insertAfter( “$rowCount”, “0” );
}
Object obj = al_results.toArray();
IData results = new IData[obj.length];
for( int i=0; i<obj.length; i++)
results[i] = (IData) obj[i];
id.last();
id.insertAfter( “results”, results );
id.insertAfter(“$rowCount”, rowcount+“”);
id.insertAfter( “$dbMessage”, “” );
id.destroy();
#webMethods#Integration-Server-and-ESB#Flow-and-Java-services