でそれを再利用:は、OracleのストアドプロシージャでSYS_REFCURSORからデータを読み、私はこのテーブルを持っているのjava
CREATE TABLE "QMS_MODEL"."BOOKING" (
"ID" NUMBER (19, 0) CONSTRAINT "QMS_BOOKING_NN_1" NOT NULL ENABLE
,"CALL_TIME" TIMESTAMP (6)
);
それから私は、Oracleでの簡単なストアドプロシージャを持っています予約は と発見されたこのプロシージャを呼び出すと
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;
:OUTパラメータで見つかったレコード 3.returns上2.update列見つかったレコードを指しSYS_REFCURSORフィールドが更新されますが、最後にカーソル が有効ではありませんし、私は私が使用してJavaで予約をモデル
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;
idフィールドにログインするためにカーソルを使用して、この例では他の操作、 のためにそれを使用するカントれますエンティティ
@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 {
..
..
}
...と私は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
}
私のための唯一の要求はあります0 - 予約を選択し、同じトランザクションで同じトランザクションで更新してストアドプロシージャ - javaからストアドプロシージャを呼び出すと、@ Entity-Bookingの形式で更新された予約を取得します。
ありがとうございます。
オブジェクトの作成時には引用符を使用しないでください。大文字と小文字を区別し、手間を省きます。 – Ben