2010-11-04 134 views
0

我试图插入一个记录在一个函数,这将通过iBatis.NET调用一个Oracle表。直接调用Oracle时,函数可以正常工作。iBatis.NET插入记录与Oracle存储过程,返回记录ID

我已经尝试过使用<statement><insert> SqlMap,但我无法让iBatis.NET调用该函数,并且Oracle不支持从存储过程返回任何内容。

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

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

该文档仅包含内联SQL的示例,我只能使用sprocs。

由于实数对象中的属性数量众多,哈希映射和参数数量在30+以上。

理想我想能够做到这一点(不工作):

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

Domain对象:

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; 

回答

0

如果这有助于其他人,我无法找到解决方法来解决我的问题。

我最终实现了这个存储过程,它将所有字段的输入参数插入到一个表中,还有一个输出参数返回序列生成的唯一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> 

SPROC(甲骨文):

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; 
相关问题