Domanda

Sto tentando di inserire un record in una tabella Oracle con una funzione, che sarebbe chiamata tramite ibatis.net. La funzione funziona come previsto in Oracle quando viene chiamata direttamente.

Ho provato a usare <statement> e <insert> Sqlmap ma non riesco a convincere ibatis.net a chiamare la funzione e Oracle non supporta la restituzione di nulla dalla procedura memorizzata.

Avrei bisogno di passare le proprietà del mio oggetto come parametri a una funzione/Sproc e recuperare l'ID di questo nuovo record.

Quale sarebbe una buona combinazione di IBATIS.NET Call / SQLMAP / SPROC o firma della funzione in Oracle?

La documentazione ha solo esempi di SQL in linea e posso usare solo SPROCS.

A causa del numero di proprietà negli oggetti reali, la mappa hash e il numero di parametri sono nel 30+.

Idealmente sarei in grado di farlo (non funziona):

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

Oggetto di dominio:

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

chiamata ibatis.net:

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

Procedura memorizzata 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;
È stato utile?

Soluzione

Nel caso in cui questo aiuti qualcun altro, non sono stato in grado di trovare una soluzione alternativa al mio problema.

Ho finito per implementare questo come una procedura memorizzata che richiede parametri di input per inserire tutti i campi in una tabella e un parametro di output che restituisce l'ID univoco generato dalla sequenza.

Dopo l'esecuzione mapper.Insert(...) Ho semplicemente letto il parametro di output e lo restituisco.

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

Mappa 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top