代码之家  ›  专栏  ›  技术社区  ›  Leon

要插入带有Oracle存储过程的记录,请返回记录ID

  •  0
  • Leon  · 技术社区  · 14 年前

    我试图在Oracle表中插入一个带有函数的记录,该函数将通过iBatis.NET调用。函数在直接调用时按Oracle中的预期工作。

    <statement> <insert>

    我需要将对象的属性作为参数传递给一个函数/存储过程,并获取这个新记录的ID。

    在Oracle中,iBatis.NET call/SQLMap/Sproc或函数签名的最佳组合是什么?

    文档中只有行内SQL的示例,我只能使用sprocs。

    由于实际对象中的属性数,哈希映射和参数数都在30+中。

    <procedure id="InsertPerson" parameterClass="BOM.Person"> TestDB.PERSON_PKG.InsertPerson(#Name#, #Age#) </procedure>

    域对象:

    public class Person
    {
        int ID { get; set; }
        string Name { get; set; }
        decimal Age { get; set; }
    }
    

    iBatis.NET呼叫:

    int personID = mapper.Insert("InsertPerson", person);
    

    Oracle存储过程:

       FUNCTION InsertPerson(
                 p_Name IN Persons.Name%TYPE,
                 p_Age IN Persons.Age%TYPE,
                 ) RETURN NUMBER
       IS
                 NEW_ID Persons.ID%TYPE;
       BEGIN
                SELECT Persons_SEQ.NEXTVAL INTO NEW_ID FROM DUAL; /* Get new ID*/
    
                INSERT INTO Persons(ID, Name, Age)
                SELECT NEW_ID, p_Name, p_Age from dual; /* Insert record */
                COMMIT;
    
                RETURN NEW_ID;
       END;
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Leon    14 年前

    如果这对别人有帮助,我就找不到解决问题的办法。

    最后,我将其实现为一个存储过程,该存储过程接受要插入到表中的所有字段的输入参数,以及一个输出参数,该参数返回序列生成的唯一ID。

    mapper.Insert(...) 我只是读取输出参数并返回它。

    C#:

    mapper.BeginTransaction(System.Data.IsolationLevel.Serializable);
    
    // Add new Record
    Hashtable param = new Hashtable();
    param.Add("ID", user.ID); // Output
    param.Add("DeptID", user.DeptID);
    param.Add("RightID", user.RightID);
    
    mapper.Insert("AddUserRight", param);
    
    user.ID = Convert.ToInt32(param["ID"]);
    

    MyBATIS地图:

    <?xml version="1.0" encoding="utf-8" ?>
    <sqlMap namespace="CCP" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <statements>
            <procedure id="AddUserRight" parameterMap="AddUserRight-param">
                Database.USER_PKG.ADDUSERRIGHT
            </procedure>
        </statements>
    
        <parameterMaps>
            <parameterMap id="AddUserRight-param">
                <parameter property="ID" column="ID" direction="Output" />
                <parameter property="DeptID" column="DeptID" direction="Input" />
                <parameter property="RightID" column="RightID" direction="Input" />
            </parameterMap>
        </parameterMaps>
    </sqlMap>
    

       PROCEDURE AddUserRight(
                ID OUT USERRIGHTS.USERID%TYPE,
                DEPTID IN USERRIGHTS.DEPTID%TYPE,
                RIGHTID IN USERRIGHTS.RIGHTID%TYPE)
       IS
       BEGIN
            SELECT USERRIGHTS_UNQ_SEQ.NEXTVAL INTO ID FROM DUAL;
    
                 INSERT INTO USERRIGHTS(ID, DEPTID, RIGHTID)
                 VALUES (ID, DEPTID, RIGHTID);
       END;