1

MyGeneration、dodads、および Oracle XE を使用して、「自動番号の主キー」スキームを実装することは可能ですか?

問題の事実: Oracle XE を使用しています。次のテーブルとトリガーを実装しました。

CREATE TABLE  "USERS" 
(   
    "ID" NUMBER(38,0), 
    "USER_NAME" VARCHAR2(50), 
    "PASSWORD" VARCHAR2(50), 
    "EMAIL" VARCHAR2(100), 
     CONSTRAINT "USERS_PK" PRIMARY KEY ("ID") ENABLE
)
/

CREATE OR REPLACE TRIGGER  "BI_USERS" 
  before insert on "USERS"               
  for each row  
begin   
    select "USERS_SEQ".nextval into :NEW.ID from dual; 
end; 

/
ALTER TRIGGER  "BI_USERS" ENABLE
/

MyGeneration / Doodads は次のストアド プロシージャを作成しました...

CREATE OR REPLACE PROCEDURE "XXX"."PI_USERS"
(
    p_ID IN USERS.ID%type,
    p_USER_NAME IN USERS.USER_NAME%type,
    p_PASSWORD IN USERS.PASSWORD%type,
    p_EMAIL IN USERS.EMAIL%type
)
IS
BEGIN


    INSERT
    INTO USERS
    (
        ID,
        USER_NAME,
        PASSWORD,
        EMAIL
    )
    VALUES
    (
        p_ID,
        p_USER_NAME,
        p_PASSWORD,
        p_EMAIL
    );
END PI_USERS;

シーケンスとトリガーの組み合わせは正常に機能しています。C# の BusinessEntity クラスは、新しい ID を受け取りません。

呼び出し元のコードが新しいレコード ID を受信できるようにするための推奨される方法はありますか?

4

2 に答える 2

2

私はDoodadsを使用したことがないので、これが期待どおりかどうかはわかりませんが、returning句を使用して以下のように手順を変更し、p_IDパラメーターin outをp_IDパラメーターにすると、実行後に新しく追加されたIDが保持されます。

CREATE OR REPLACE PROCEDURE "XXX"."PI_USERS"
(
    p_ID IN OUT USERS.ID%type,
    p_USER_NAME IN USERS.USER_NAME%type,
    p_PASSWORD IN USERS.PASSWORD%type,
    p_EMAIL IN USERS.EMAIL%type
)
IS
BEGIN


    INSERT
    INTO USERS
    (
        ID,
        USER_NAME,
        PASSWORD,
        EMAIL
    )
    VALUES
    (
        p_ID,
        p_USER_NAME,
        p_PASSWORD,
        p_EMAIL
    )
    RETURNING ID INTO p_ID;

END PI_USERS;
于 2010-04-25T00:40:31.203 に答える
1

シーケンスを使ってみませんか?TAPIを使用する場合でも、ID列とWHO列はシーケンスのトリガーで提供するのが最適だと思います。問題は、スキップされた番号がない純粋で高密度のシーケンスの必要性ですか?

于 2011-04-06T15:14:11.417 に答える