选择键未返回有关mybatis的数据

时间:2018-07-13 13:36:17

标签: plsql mybatis

我正在尝试在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上工作。我做错什么了吗?也许我做到了,但我不知道我做错了什么。 如果有人知道为什么会这样,请告诉我。 谢谢。

1 个答案:

答案 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吗?