I have a procedure like this:
CREATE PROCEDURE p_author_exists (IN author_name VARCHAR(50), OUT result INT) READS SQL DATA BEGIN ATOMIC SELECT COUNT(*) INTO result FROM t_author WHERE first_name LIKE author_name OR last_name LIKE author_name; END
I can call the procedure easily using a CallableStatement like this:
CallableStatement s = c.prepareCall("{ call P_AUTHOR_EXISTS(?, ?) }")); // .. Bind IN parameter // .. Register OUT parameter
I can also call the procedure using a constant expression for the IN parameter:
CallableStatement s = c.prepareCall("{ call P_AUTHOR_EXISTS('abc' || cast('xyz' as varchar(50)), ?) }")); // .. Register OUT parameter
However, I cannot use any expression that contains a bind variable, e.g.:
CallableStatement s = c.prepareCall("{ call P_AUTHOR_EXISTS(cast(? as varchar(50)), ?) }")); // .. Register OUT parameter
This results in the following exception:
java.lang.NullPointerException at org.hsqldb.StatementProcedure.getParametersMetaData(Unknown Source) at org.hsqldb.result.Result.newPrepareResponse(Unknown Source) at org.hsqldb.Session.execute(Unknown Source) at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) at org.hsqldb.jdbc.JDBCCallableStatement.<init>(Unknown Source) at org.hsqldb.jdbc.JDBCConnection.prepareCall(Unknown Source)
Has been fixed in recent versions.