2010-11-04 4 views
0

Я пытаюсь вставить запись в таблицу Oracle с помощью функции, которая будет вызываться через iBatis.NET. Функция работает как ожидается в Oracle при вызове напрямую.iBatis.NET для вставки записи с хранимой процедурой Oracle, возвращаемой записи ID

Я попытался использовать <statement> и <insert> SqlMap, но я не могу заставить iBatis.NET вызывать функцию, а Oracle не поддерживает возврат чего-либо из хранимой процедуры.

Мне нужно передать свойства моего объекта в качестве параметров функции/sproc и вернуть идентификатор этой новой записи.

Что было бы хорошей комбинацией вызова iBatis.NET call/SQLMap/Sproc или Function в Oracle?

В документации есть только примеры встроенного 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; 

ответ

0

Если это помогает кому-то другому, мне не удалось найти обходной путь к моей проблеме.

Я закончил реализацию этого как хранимую процедуру, которая принимает входные параметры для всех полей, которые должны быть вставлены в таблицу, и один выходной параметр, который возвращает уникальный идентификатор, сгенерированный последовательностью.

После выполнения 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 (Oracle):

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;