我正在尝试在mybatis上调用存储过程。 这是我的代码。
<insert id="insertWbs" parameterType="HashMap" useGeneratedKeys="true" keyProperty="wbs_unique">
<selectKey keyProperty="wbs_unique" resultType="string" order="BEFORE" statementType="CALLABLE">
<!-- <![CDATA[ SELECT #{proj_no}||WBS_${PROJ_NO}_SEQ.NEXTVAL FROM DUAL ]]> -->
<![CDATA[ CALL WBS_UNIQUE(#{proj_no, mode=IN, jdbcType=VARCHAR}, #{X, mode=OUT, jdbcType=VARCHAR}) ]]>
</selectKey>
insert into wbs(proj_no, task_name, wbs_worker, wbs_tester, wbs_ex_start, wbs_ex_end, wbs_unique, task_status)
select #{proj_no}, #{task_name}, #{wbs_worker}, #{wbs_tester}, to_date(#{wbs_ex_start}, 'yyyy-mm-dd'), to_date(#{wbs_ex_end}, 'yyyy-mm-dd'), #{wbs_unique}, #{task_status} from dual where not exists
(select wbs_unique from wbs where wbs_unique = #{wbs_unique})
</insert>
第一个评论是我尝试设置动态序列的方法,但没有奏效。 这是错误
ORA-02289: sequence does not exist
所以我决定使用存储过程来设置包含'wbs _','_ seq'的动态参数。
create or replace PROCEDURE WBS_UNIQUE
(
PROJ_NO IN VARCHAR2
,X OUT VARCHAR2
) AS
V_QUERY VARCHAR(1000);
BEGIN
V_QUERY := V_QUERY||'SELECT WBS_'||PROJ_NO||'_SEQ.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE V_QUERY into x;
END WBS_UNIQUE;
,它在oracle 11g而不是mybatis上正常工作... 我附加的第一个代码会引发此错误
org.apache.ibatis.executor.ExecutorException: SelectKey returned no data.
我不明白为什么它不能在mybatis上工作。我做错什么了吗?也许我做到了,但我不知道我做错了什么。 如果有人知道为什么会这样,请告诉我。 谢谢。
答案 0 :(得分:0)
第一个例子对我来说很好。这就是我自己做的方式:
<selectKey keyProperty="myId" resultType="java.lang.Integer" order="BEFORE">
SELECT ${proj_no}||WBS_${PROJ_NO}_SEQ.NEXTVAL FROM DUAL
</selectKey>
请勿使用#{proj_no}
,而应使用${proj_no}
。前者用于JDBC参数。后者(您需要的)用于SQL注入。
或者,问题可能是属性PROJ_NO
的值(或者是proj_no
?)导致无效的序列名称:
顺便说一句,它不应该看起来更像“ java一样”,像projNo
吗?