lire des données à partir de SYS_REFCURSOR dans une procédure stockée Oracle et le réutiliser dans java

J'ai cette table:

  CREATE TABLE "QMS_MODEL"."BOOKING" (
       "ID" NUMBER ( 19, 0 ) CONSTRAINT "QMS_BOOKING_NN_1" NOT NULL ENABLE
      ,"CALL_TIME" TIMESTAMP ( 6 )
  );

Puis j'ai une simple procédure stockée Oracle que:
1.obtenir un enregistrement d'une table
2.mise à jour d'une colonne sur l'enregistrement trouvé
3.retour par un paramètre de SORTIE d'un SYS_REFCURSOR que les points à l'enregistrement trouvé :

CREATE OR REPLACE 
PROCEDURE GET_BOOKING
  ( 
    refCursorValue OUT SYS_REFCURSOR,
    bookingId IN QMS_MODEL.booking.id%type
  )
AS
    bookingResult QMS_MODEL.booking%ROWTYPE;
    todayAtNow QMS_MODEL.booking.booking_time%type;
BEGIN

  --********************************
  --get booking cursor....
  --********************************
  OPEN refCursorValue FOR 
  SELECT 
    bb.*
  FROM qms_model.booking bb 
  WHERE bb.id = bookingId 
  FOR UPDATE;


  --****************************************
  --from boking cursor get booking record...
  --****************************************
  FETCH refCursorValue INTO bookingResult;

  --********************************
  --update a column on found booking....
  --********************************
  SELECT SYSDATE into todayAtNow FROM DUAL;  
  UPDATE qms_model.booking SET 
          call_time = todayAtNow
  WHERE id = bookingResult.id;


  /*
  after the fetch refCursorValue is not
  valid and the client can't use it!
  */ 

END;

L'appel de cette procédure, la réservation est trouvé
et le champ est mis à jour,mais à la fin le curseur
n'est pas valide et je ne peux pas l'utiliser pour autre opération,
dans cet exemple, j'utilise le curseur pour ouvrir une session le champ id

set serveroutput on format wrapped;
DECLARE
  REFCURSORVALUE SYS_REFCURSOR;
  BOOKINGID NUMBER;
  bookingResult QMS_MODEL.booking%ROWTYPE;
BEGIN
  BOOKINGID := 184000000084539;
  GET_BOOKING(
    REFCURSORVALUE,
    BOOKINGID
  );
  FETCH REFCURSORVALUE INTO bookingResult;
  DBMS_OUTPUT.PUT_LINE('>>>OUT , cursor fetc,id='|| bookingResult.id ); 
END;

J'modèle de la réservation en java à l'aide d'une entité

@Entity
@Table(name = "BOOKING", schema = "QMS_MODEL")
@NamedNativeQueries({    
    @NamedNativeQuery(name = "booking.callNext.Oracle",
    query = "call GET_BOOKING(?,:bookingId)",
    callable = true,
    resultClass = Booking.class)
})
public class Booking implements Serializable {
..
..
}

...et je le reçois par un NamedNativeQuery:

long bookingID=...some value
Query q = entityMng.createNamedQuery("booking.callNext.Oracle");
q.setParameter("bookingId", bookingID);
List results = q.getResultList();
if (results!=null && !results.isEmpty()) {
  Booking eBooking = (Booking) results.get(0);
  ..
  ..
  ..
  ..i want use some booking data here....
  ..but i can't because the cursor is closed
}

la seule demande pour moi sont
-sélectionnez la réservation et le mettre à jour dans la même transaction dans une procédure stockée
-appel de la procédure stockée à partir de java et de récupérer la mise à jour de la réservation dans la forme d'un @Entity-Réservation

vous en remercie d'avance.

  • S'il vous plaît, veuillez ne pas utiliser les citations lors de la création d'objets. Cela les rend sensibles à la casse et n'en finit pas de tracas.
InformationsquelleAutor emmedierre | 2012-02-15