Oracleでは、複数の挿入で再利用される変数にsequence.nextvalを保存するにはどうすればよいですか?


13

いくつかのテーブルにテスト用のデータを入力するスクリプトを書いています。

私は次のようなものを書きたいのですが、どうすればいいのかわかりません(私はOracle 11gです)

SET ENABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE
SET DISABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:ENABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :ENABLED_USER_ID);

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:DISABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :DISABLED_USER_ID);

クエリを再配置してsequence.currval参照を使用できることは知っていますが、適切な名前の変数にIDを保存することを希望します。

スクリプトを単にラップする必要があるかもしれませんDECLARE ... BEGIN ... END;が、もっと簡潔な方法があることを望んでいます。


追加2011年5月27日15:31

いずれにしても、変数をDECLAREブロックで宣言する必要があるようです。だから私はしようとしている

DECLARE
  USER_ID NUMBER(10,0) := 1;
BEGIN   
  insert into TEST_USER
  values (user_id, 'andrew', sysdate);   
END;

しかし、次のエラーが表示されます

Caused by: java.sql.SQLException: ORA-06550: **line 2, column 27:**
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

  * & = - + ; < / > at in is mod remainder not rem
  <an exponent (**)> <> or != or ~= >= <= <> and or like like2
  like4 likec between || multiset member submultiset

それは変数宣言を指します。

javaを使用してファイルからスクリプトをロードし、Oracle 11gサーバーでOracle JDBCドライバー(ojdbc14-10.2.0.4.0.jar)を使用して実行しています。

テーブルTEST_USERが作成されました。

create table TEST_USERS (
    id number(10, 0) not null,
    name varchar2(100),
    date_ins date default sysdate,
    primary key (id)
);

回答:


11

こうなると思う

DECLARE
    ENABLED_USER_ID PLS_INTEGER;
    DISABLED_USER_ID PLS_INTEGER;
BEGIN
    ENABLED_USER_ID := SEQ.NEXTVAL;
    DISABLED_USER_ID := SEQ.NEXTVAL;

    INSERT INTO USERS (ID, USR_NAME)
    VALUES  (ENABLED_USER_ID, 'ANDREW');

    INSERT INTO CAR (CAR_ID, CAR_NAME, USR_ID)
    VALUES (CARSEQ.NEXTVAL, 'FORD', ENABLED_USER_ID);

    INSERT INTO USERS (ID, USR_NAME)
    VALUES  (DISABLED_USER_ID, 'ANDREW');

    INSERT INTO CAR (CAR_ID, CAR_NAME, USR_ID)
    VALUES (CARSEQ.NEXTVAL, 'FORD', DISABLED_USER_ID);
END;
/


8

変数を宣言する場合、ブロックが必要になります

11gでは、シーケンスのサポートが改善されたため、次のように使用できます。

ENABLED_USER_ID := SEQ.NEXTVAL;

selectステートメントを使用するのではなく(両方とも機能します)

値を永続化する他のオプションには、テーブルへの保存やコンテキストの作成が含まれますがsequence.currvalここでは本当に「正しい答え」だと思います


7
SELECT seq.nextval 
   INTO ENABLED_USER_ID
FROM dual;

ENABLED_USER_IDは、declareブロックに入るべきですか?
バジリコデ

@Xan:はい、変数はDECLAREセクションでのみ定義できます。DECLAREセクションは、PL / SQLブロックがある場合にのみ有効です
a_horse_with_no_name

4

私はあなたが実際に余分な変数なしで逃げることができると思うcurrval

INSERT INTO USERS
    (ID,      USR_NAME)
VALUES  (SEQ.NEXTVAL, 'ANDREW');
INSERT INTO CAR
   (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   SEQ.CURRVAL);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.