Hi,
I would need help in understanding how to escape a quoted identifier in JDBC
as this seems to be different from how to do it in interactive SQL using ij.
What I am trying to do is to compare CURRENT_ROLE to constant string.
Scenario 1)
===========
Please see the following output in which I am using ij and where I achieve what
I want, i.e. there is one row returned as the comparison in the
where clause is satisfied:
ij> connect 'jdbc:derby://localhost:1527/dummydb;bootPassword=xy;
user=dbo;password=derby;create=true';
ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY
('derby.database.sqlAuthorization', 'true');
Statement executed.
ij> connect 'jdbc:derby://localhost:1527/dummydb;shutdown=true;';
ERROR 08006: DERBY SQL error: SQLCODE: -1, SQLSTATE: 08006,
SQLERRMC: Database 'dummydb' shutdown.
ij> disconnect;
ij> connect 'jdbc:derby://localhost:1527/dummydb;bootPassword=xy;
user=dbo;password=derby;create=true';
ij> create role db_reader;
0 rows inserted/updated/deleted
ij> set role db_reader;
0 rows inserted/updated/deleted
ij> select IBMREQD FROM SYSIBM.SYSDUMMY1 WHERE CURRENT_ROLE='"DB_READER"';
IBM&
----
Y
1 row selected ===> so success here!
ij> disconnect;
ij>
Scenario 2)
===========
Now I would like the query to be embedded into a stored procedure.
However I am struggling to find out what the correct syntax might be here.
Here is my java code for the stored procedure:
public static void SP_getRole(String dummy[]) throws SQLException
{
Connection conn = DriverManager.getConnection("jdbc:default:connection");
Statement stmt = conn.createStatement();
String cSQL = "SELECT ibmreqd FROM sysibm.sysdummy1"+
" WHERE CURRENT_ROLE='\"DB_READER\"'";
ResultSet rs = stmt.executeQuery(cSQL);
while (rs.next()) {
System.out.println(rs.getString(1));
};
rs.close();
stmt.close();
return;
}
and the java stub to call the procedure:
try {
Connection conn = DriverManager.getConnection(connectionURL);
System.out.println("Successfully connected to Database");
Statement stmt = conn.createStatement();
String cSQL = "SET ROLE db_reader";
stmt.executeUpdate(cSQL);
stmt.close();
cSQL = "SELECT CURRENT_ROLE FROM SYSIBM.SYSDUMMY1 \n";
PreparedStatement ps = conn.prepareStatement(cSQL);
ResultSet rs = ps.executeQuery();
String rsString = "";
while (rs.next()) {
rsString = rs.getString(1);
System.out.println(rsString);
};
rs.close();
ps.close();
CallableStatement cstmt =
conn.prepareCall("{ CALL rte.\"SP_getRole\"(?) }");
cstmt.setString(1, "dummy");
cstmt.executeUpdate();
and the create procedure statement
CREATE PROCEDURE rte."SP_getRole"(OUT "vcRole" varchar(128))
LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL SECURITY DEFINER
MODIFIES SQL DATA EXTERNAL NAME '...SP_getRole'
;
HOWEVER when running this now row is returned!
I also tried
" WHERE CURRENT_ROLE='\\\"DB_READER\\\"'";
but this also did not lead to success.
Any hints appreciated.
Thanks
Thomas