Я недавно обнаружил, что анонимные блоки можно вызывать из jdbc следующим образом:
String plsql = "BEGIN" +
" :result := foobar( booleanparameter => :mypar > 2);" +
"END;";
con.prepareCall(plsql);
Что здорово, потому что я могу использовать это, чтобы "обернуть" некоторые вызовы функций и
преодолеть некоторые ограничения JDBC. Например, я не могу передать логические переменные
PL / SQL процедуры, и не может изменить сигнатуру процедур, так как есть
много кода, который зависит от них. Добавление новых процедур «обертывания» тоже не легко
по причинам внутренней политики.
Так что это кажется приемлемым решением, но я беспокоюсь о разборе
накладные расходы. Сохраняются ли анонимные блоки, подобные этому, в SGA или они
разбирали каждый раз когда их вызывают?
Спасибо
Обновление 1: Я сделал быстрый скрипт-оболочку для просмотра v $ sqlarea, как предлагает egorius:
String plsql = "BEGIN :myresult := dbms_random.random ; END;";
OracleDriver oracledrv = new OracleDriver();
Connection con = oracledrv.connect(connstr, new Properties());
for (int i = 0 ; i < 1000 ; i++ ) {
CallableStatement cb = con.prepareCall(plsql);
cb.registerOutParameter("myresult", Types.INTEGER);
cb.execute();
System.out.println("random ->" +cb.getInt("myresult"));
cb.close();
}
con.close();
И вот что я получаю int v $ sqlarea (я запускал его дважды):
SQL_TEXT
--------------------------------------------------------------------------------
PARSE_CALLS EXECUTIONS
----------- ----------
BEGIN :myresult := dbms_random.random ; END;
2000 2000
Значит ли это, что подготовлен или нет?