| This does work using Hibernate and a StoredProcedureQuery:
final StoredProcedureQuery storedProcedureQuery = entityManager.get().createStoredProcedureQuery(
"dbms_stats.GATHER_TABLE_STATS");
storedProcedureQuery.registerStoredProcedureParameter("ownname", String.class, ParameterMode.IN);
storedProcedureQuery.registerStoredProcedureParameter("tabname", String.class, ParameterMode.IN);
storedProcedureQuery.setParameter("ownname", ownerName);
storedProcedureQuery.setParameter("tabname", tableName);
storedProcedureQuery.executeUpdate();
Good so far - now i wanted to specify the cascade attribute which is a Boolean. (http://www.toadworld.com/platforms/oracle/w/wiki/3403.dbms-stats-gather-table-stats-statt) So i tried that:
final StoredProcedureQuery storedProcedureQuery = entityManager.get().createStoredProcedureQuery(
"dbms_stats.GATHER_TABLE_STATS");
storedProcedureQuery.registerStoredProcedureParameter("ownname", String.class, ParameterMode.IN);
storedProcedureQuery.registerStoredProcedureParameter("tabname", String.class, ParameterMode.IN);
storedProcedureQuery.registerStoredProcedureParameter("cascade", Boolean.class, ParameterMode.IN);
storedProcedureQuery.setParameter("ownname", ownerName);
storedProcedureQuery.setParameter("tabname", tableName);
storedProcedureQuery.setParameter("cascade", cascade);
storedProcedureQuery.executeUpdate();
This fails with the message:
ORA-20001: 1 is an invalid identifier
ORA-06512: in "SYS.DBMS_STATS", Zeile 34634
ORA-06512: in Zeile 1
Looking at the trace logs Hibernate does this:
20:05:41.616 [main] DEBUG org.hibernate.SQL [SqlStatementLogger.java:109] - {call dbms_stats.GATHER_TABLE_STATS(?,?,?)}
20:05:41.617 [main] TRACE o.h.type.descriptor.sql.BasicBinder [BasicBinder.java:81] - binding parameter [1] as [VARCHAR] - [USER]
20:05:41.618 [main] TRACE o.h.type.descriptor.sql.BasicBinder [BasicBinder.java:81] - binding parameter [2] as [VARCHAR] - [TABLE]
20:05:41.618 [main] TRACE o.h.type.descriptor.sql.BasicBinder [BasicBinder.java:81] - binding parameter [3] as [BIT] - [true]
This does work normally for standard dml stuff where a boolean is something like 0 or 1 in a NUMBER(1) in oracle. But using a StoredProcedureQuery 0 or 1 are wrong, it must be false or true. |