我正在从事的一个项目使用具有行级安全性的 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>
但是,这就是我所得到的,因为我了解到您不能在过程中返回数据,只能在函数中返回,因此无法返回数据。
尝试 3
我考虑过创建一个简单的 MyBatis 语句来设置客户端信息,并且需要在执行语句之前调用它。这似乎是最有希望的,但是,我们正在使用 Spring 和数据库连接池,我担心竞争条件。我想确保客户端信息不会溢出并影响其他语句,因为连接不会关闭,它们会被重用。
软件/框架版本信息
Oracle 10g
MyBatis 3.0.5
Spring 3.0.5
更新
忘了提我也在使用 MyBatis Spring 1.0.1