ibatis.net para insertar registro con el procedimiento almacenado de Oracle, devolver la ID de registro

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

Pregunta

Estoy intentando insertar un registro en una tabla Oracle con una función, que se llamaría a través de ibatis.net. La función funciona como se esperaba en Oracle cuando se llama directamente.

He intentado usar <statement> y <insert> SQLMAP Pero no puedo hacer que Ibatis.net llame a la función, y Oracle no admite devolver nada del procedimiento almacenado.

Tendría que pasar las propiedades de mi objeto como parámetros para una función/SPROC y recuperar la ID de este nuevo registro.

¿Cuál sería una buena combinación de llamadas ibatis.net / SQLMAP / SPROC o firma de función en Oracle?

La documentación solo tiene ejemplos de SQL en línea y solo puedo usar SPROC.

Debido al número de propiedades en objetos reales, el mapa hash y el número de parámetros están en los 30+.

Idealmente, podría hacer esto (no funciona):

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

Objeto de dominio:

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

ibatis.net llama:

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

Procedimiento almacenado de 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;
¿Fue útil?

Solución

En caso de que esto ayude a alguien más, no pude encontrar una solución para mi problema.

Terminé implementando esto como un procedimiento almacenado que toma parámetros de entrada para que todos los campos se inserten en una tabla, y un parámetro de salida que devuelve la ID única generada por secuencia.

Después de ejecutar mapper.Insert(...) Simplemente leo el parámetro de salida y lo devuelvo.

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

Mapa 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top