2

テーブルにレコードを挿入し、列の値 (orderid など) を一意の # に設定する必要があります。そして、使用されたその番号を返します。

nextval でシーケンスと挿入ステートメントを使用するプロセスになると思いました。

insert into ordersTable(orderid) values(ordernums.nextval);

しかし、使用された番号を取得するにはどうすればよいですか? 私の考えでは、挿入呼び出しからそれを取得する必要があります。そうしないと、再クエリすると nextval (または currval) が変更される可能性があります。

しかし、私はそれを行う方法がわかりません。これを回避する1つの方法は、挿入時に、唯一の一意の値をフィールドに追加してから、その値を再クエリすることです。

これを行う別の方法はありますか?おそらくSQLレベルで何かが足りないと思いますか?

CtC

4

1 に答える 1

9

私の知る限り、Oracle 9i+ には RETURNING 句があります。

DECLARE v_orderid ORDERSTABLE%TYPE;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (ordernums.nextval)
RETURNING orderid INTO v_orderid;

別の方法は、INSERT ステートメントの前に変数を設定することです。

関数内:

DECLARE v_orderid ORDERSTABLE%TYPE := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (v_orderid);

RETURN v_orderid;

OUT パラメータの使用:

CREATE OR REPLACE PROCEDURE ORDER_INS(out_orderid OUT ORDERSTABLE%TYPE) 
AS
BEGIN

out_orderid := ORDERNUMS.NEXTVAL;

INSERT INTO ordersTable
 (orderid) 
VALUES
 (out_orderid);

END;

さらに、シーケンスの CURRVAL はセッション固有であることに注意してください。現在のセッションで NEXTVAL を呼び出してからどれくらい経っても、同じシーケンスで NEXTVAL を呼び出した他のセッションがいくつあっても、 ordernums.currval は常に、セッションに与えられたシーケンスの最後の値を返します。そのため、INSERT から値を取得するためのさまざまなオプションがありますが、必要ではない場合があります。後続のステートメントで ordernums.currval を参照するだけでよいのです。もちろん、CURRVAL はセッション固有であるため、同じシーケンスに対して NEXTVAL を呼び出す前にセッションで CURRVAL を呼び出しても意味がありません (エラーが返されます)。

于 2010-09-24T00:19:47.717 に答える