Are there any performance improvement in calling a procedure which returns SYS_RECURSOR or call a query?
For example
CREATE OR REPLACE PROCEDURE my_proc
(
p_id number,
emp_cursor IN OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN emp_cursor for
select * from emp where emp_number=p_id
end;
/
and call the above from Java by registering OUT parameter,pass IN parameter and fetch the results.
Or
From Java get the results from emp table by
preparedStatement = prepareStatement(connection, "select * from emp where emp_number=?", values);
resultSet = preparedStatement.executeQuery();
Which one of the above is a better option to call from Java?
There is no performance difference assuming your
prepareStatementmethod is using the appropriate type for all bind variables. That is, you would need to ensure that you are callingsetLong,setDate,setString, etc. depending on the data type of the parameter. If you bind the data incorrectly (i.e. callingsetStringto bind a numeric value), you may force Oracle to do data type conversion which may prevent the optimizer from using an index that would improve performance.From a code organization and maintenance standpoint, however, I would rather have the queries in the database rather than in the Java application. If you find that a query is using a poor plan, for example, it’s likely to be much easier for a DBA to address the problem if the query is in a stored procedure than if the query is embedded in a Java application. If the query is stored in the database, you can also use the database’s dependency tracking functions to more easily do an impact analysis if you need to do something like determine what would be impacted if the
emptable needs to change.