我对oracle的sql开发人员(因为我们已经研究过mysql)和编程非常陌生。我在这个网站上搜索了我的问题的答案,但我真的无法理解所提供的解决方案。
我想要的是返回在将对象从java插入数据库后生成的ID。我用的是霉霉和甲骨文10g数据库。我已经创建了表及其列。
这是我的地图代码
<insert id="addUser" parameterType="User" statementType="CALLABLE"> { CALL addUserSP( #{user.surname, javaType=String, jdbcType=VARCHAR, mode=IN}, #{user.firstName, javaType=String, jdbcType=VARCHAR, mode=IN}, #{userId, javaType=Integer, jdbcType=NUMBER, mode=OUT} )} </insert>
这是我的存储过程(我已经创建了一个名为“CREATEUSER”的包)
PROCEDURE ADDUSERSP
( surname IN VARCHAR2,
firstName IN VARCHAR2,
userId OUT NUMBER
) AS
BEGIN
INSERT INTO users("surname", "first_name")
VALUES (surname, firstName);
RETURNING user_id INTO userId;
END ADDUSERSP;
根据我在这里发现的,我似乎需要创建一个触发器(?)以及序列(?)每当我将新数据添加到表中时,user_id自动递增。但是,我不知道该怎么做。
以下是我的问题:我的存储过程正确吗?密码不完整吗?我的意思是,我还没有在映射器中声明包,我已经看到它是必需的(?),类似于这个{ CALL [CreateUser].[addUserSP]( blah blah...
。我应该编写一个序列并触发,还是有一种简单的方法可以使主键user_id
自动递增?请也检查一下语法。我在语法上有很多问题。
非常感谢!
发布于 2016-04-13 20:50:14
为了模仿甲骨文中的MySQL AUTO_INCREMENT,该模式(如您所发现)确实使用了一个序列对象和一个前置插入触发器。
作为演示,对sequence对象如下所示:
CREATE SEQUENCE myseq START WITH 1 INCREMENT BY 1 ;
对于前置插入触发器,如下所示:
CREATE TRIGGER users_bi
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF :NEW.id IS NULL THEN
SELECT myseq.NEXTVAL INTO :NEW.id FROM DUAL;
END IF;
END
就过程而言,我不太喜欢包装SQL INSERT语句的额外PL/SQL块。
看来你在回来之前有一个额外的分号。该子句是INSERT语句的一部分,而不是单独的语句。
需要注意的一个大问题是PL/SQL块中的SQL语句可以同时引用列和PL/SQL变量。当变量具有与列相同的名称时,您可能会遇到意想不到的行为。
通常,PL/SQL对变量使用命名约定,以减少名称冲突的可能性。我们经常看到名为v_surname
的变量。(就我个人而言,我使用的约定略有不同,但是变量名“看起来像”变量名,而不是列引用。并且我没有按照变量使用的模式命名列。)
标识符周围的双引号是可以接受的,但这确实使标识符区分大小写。当标识符不包含在双引号中时,Oracle将它们视为大写。只需确保您的表定义了小写列名。
https://stackoverflow.com/questions/36613948
复制相似问题