Eu finalmente (com uma pequena ajuda de outros) descobri a resposta para isso. Ele veio em três partes:
A primeira foi que eu precisava usar um:
OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(query);
em vez do simples JDBC CallableStatement que eu estava tentando usar.
A segunda parte foi que tive que registrar meu parâmetro "out" da seguinte forma:
stmt.registerOutParameter(2, OracleTypes.STRUCT, "DATA_SUMMARY_TAB");
A terceira parte, e está implícita na parte 2 acima, era que "DATA_SUMMARY_TAB" tinha que estar em MAIÚSCULAS. Se você colocá-lo em letras minúsculas, receberá uma mensagem de erro enigmática da seguinte maneira:
java.sql.SQLException: invalid name pattern: MYTEST.data_summary_tab
em oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:553)em oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:469)em oracle.sql.StructDescriptor.initPickler(StructDescriptor.java:390)em oracle.sql.StructDescriptor.(StructDescriptor.java:320)
É isso.
Além disso, observe que nosso tipo de objeto personalizado não estava em nenhum pacote. Se for, talvez seja necessário hackear um pouco o terceiro parâmetro.