ibatis.net pour insérer l'enregistrement avec la procédure stockée par Oracle, retournez l'ID d'enregistrement

StackOverflow https://stackoverflow.com/questions/4099018

Question

J'essaie d'insérer un enregistrement dans une table Oracle avec une fonction, qui serait appelée via ibatis.net. La fonction fonctionne comme prévu dans Oracle lorsqu'elle est appelée directement.

J'ai essayé d'utiliser <statement> et <insert> SQLMAP mais je ne peux pas demander à Ibatis.net d'appeler la fonction, et Oracle ne prend pas en charge le rendement de la procédure stockée.

J'aurais besoin de passer les propriétés de mon objet sous forme de paramètres à une fonction / sproc et de récupérer l'ID de ce nouvel enregistrement.

Quelle serait une bonne combinaison de la signature Ibatis.net Call / SQLMAP / Sproc ou fonction dans Oracle?

La documentation n'a que des exemples de SQL en ligne et je ne peux utiliser que des sprocs.

En raison du nombre de propriétés dans des objets réels, le hash-map et le nombre de paramètres se trouvent dans les 30+.

Idéalement, je serais en mesure de le faire (ne fonctionne pas):

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

Objet de domaine:

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

Ibatis.net Appel:

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

Procédure stockée par 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;
Était-ce utile?

La solution

Dans le cas où cela aide quelqu'un d'autre, je n'ai pas pu trouver de solution à mon problème.

J'ai fini par implémenter cela en tant que procédure stockée qui prend les paramètres d'entrée pour que tous les champs soient insérés dans une table, et un paramètre de sortie qui renvoie l'ID unique généré par séquence.

Après exécution mapper.Insert(...) Je lis simplement le paramètre de sortie et le renvoie.

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"]);

Carte 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top