Frage

Ich versuche, einen Datensatz in eine Oracle -Tabelle mit einer Funktion einzufügen, die über Ibatis.net aufgerufen wird. Funktion funktioniert wie in Oracle, wenn er direkt aufgerufen wird.

Ich habe versucht zu benutzen <statement> und <insert> SQLMAP, aber ich kann Ibatis.net nicht dazu bringen, die Funktion aufzurufen, und Oracle unterstützt keine Rückgabe von etwas aus gespeicherten Prozeduren.

Ich müsste die Eigenschaften meines Objekts als Parameter an eine Funktion/Sproc übergeben und die ID dieses neuen Datensatzes zurückerhalten.

Was wäre eine gute Kombination aus ibatis.net call / sqlmap / sproc oder Funktionssignatur in Oracle?

Die Dokumentation enthält nur Beispiele für Inline-SQL und ich kann nur Sprocs verwenden.

Aufgrund der Anzahl der Eigenschaften in realen Objekten liegt der Hash-Map und die Anzahl der Parameter im 30+.

Idealerweise könnte ich dies tun (funktioniert nicht):

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

Domänenobjekt:

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

Ibatis.net Anruf:

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

Oracle gespeicherte Prozedur:

   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;
War es hilfreich?

Lösung

Falls dies jemand anderem hilft, konnte ich keine Problemumgehung zu meinem Problem finden.

Am Ende habe ich dies als gespeicherte Prozedur implementiert, bei der Eingabeparameter für alle Felder in eine Tabelle eingefügt werden, und einen Ausgangsparameter, der die durch Sequenz generierte eindeutige ID zurückgibt.

Nach der Ausführung mapper.Insert(...) Ich habe einfach den Ausgabeparameter gelesen und zurückgegeben.

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 Karte:

<?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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top