Проект, над которым я работаю, использует базу данных Oracle с безопасностью на уровне строк.Мне нужно иметь возможность вызывать call DBMS_APPLICATION_INFO.SET_CLIENT_INFO('userId');
, прежде чем я смогу выполнить любые другие операторы SQL.Я пытаюсь найти способ реализовать это в MyBatis.Несколько идей, которые у меня были, но я не смог заставить их работать, включают следующее:
Попытка 1
<select id="selectIds" parameterType="string" resultType="Integer">
call DBMS_APPLICATION_INFO.SET_CLIENT_INFO(#{userId});
select id from FOO
</select>
Однако вы не можете сделать два оператора в одном вызове JDBC, а MyBatis неУ меня нет поддержки для пакетных операторов JDBC, или, по крайней мере, я не смог их найти.
Попытка 2
<select id="selectMessageIds" parameterType="string" resultType="Integer">
<![CDATA[
declare
type ID_TYP is table of AGL_ID.ID_ID%type;
ALL_IDS ID_TYP;
begin
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(#{userId});
select ID bulk collect
into ALL_IDS
from FOO
end;
]]>
</select>
Однако, насколько я понял, я понял, что вы можете 't вернуть данные в процедуре, только в функции, поэтому не было никакого способа вернуть данные.
Попытка 3
Я рассмотрел просто создание простого оператора MyBatis, который установитинформация о клиенте, и ее нужно будет вызвать перед выполнением операторов.Это кажется наиболее многообещающим, однако мы используем Spring и пул соединений с базами данных, и меня беспокоят условия гонки.Я хочу убедиться, что информация о клиенте не утечет и не повлияет на другие операторы, поскольку соединения не будут закрыты, они будут использоваться повторно.
Информация о версии программного обеспечения / платформы
Oracle 10g
MyBatis 3.0.5
Spring 3.0.5
Обновление
Забыл упомянуть, что я также использую MyBatis Spring 1.0.1