1

出力パラメーター thirdPartyId の値を設定しようとしていますがmissing or invalid optionset thirdPartyIdステートメントでエラーが発生しています。

PROCEDURE usp_insert_user(  userType VARCHAR2,
                                logonId VARCHAR2,
                                title VARCHAR2,
                                firstName VARCHAR2,
                                middleName VARCHAR2,
                                lastName VARCHAR2,
                                comments VARCHAR2,
                                thirdPartyId OUT number) AS
      begin
        set thirdPartyId := select max(third_party_id) + 1 from third_party_user_temp;
        insert into THIRD_PARTY_USER_TEMP
            (Third_party_id,web_logon_id,prsn_type_cd,prsn_title_nm,
            prsn_first_nm,prsn_mdl_nm,prsn_last_nm,addtnl_third_party_txt)
            VALUES(thirdPartyId,logonId,upper(userType),title,
            firstName,middleName,lastName,comments)
        ;
    end usp_insert_user;

これを行う正しい方法は何ですか?

ありがとう!

更新: これは安全ですか?

insert into THIRD_PARTY_USER_TEMP
        (Third_party_id,web_logon_id,prsn_type_cd,prsn_title_nm,
        prsn_first_nm,prsn_mdl_nm,prsn_last_nm,addtnl_third_party_txt)
        VALUES((select max(third_party_id) + 1 from third_party_user_temp),logonId,upper(userType),title,
        firstName,middleName,lastName,comments)
        returning third_party_id into thirdPartyId
4

1 に答える 1

3

あなたはこれを行うことができます:

select max(third_party_id) + 1 into thirdPartyId from third_party_user_temp;

2人が同時にこれを実行できる場合、これは競合の問題が発生する可能性があります-両方が同じ新しいで終わる可能性がありthirdPartyIdます。これを回避するためにシーケンスを見ることができます。


たとえば、と呼ばれるシーケンスを定義するとthirdPartyIdSeq、次のことができます。

PROCEDURE usp_insert_user(  userType VARCHAR2,
                                logonId VARCHAR2,
                                title VARCHAR2,
                                firstName VARCHAR2,
                                middleName VARCHAR2,
                                lastName VARCHAR2,
                                comments VARCHAR2,
                                thirdPartyId OUT number) AS
      begin
        insert into THIRD_PARTY_USER_TEMP
            (Third_party_id,web_logon_id,prsn_type_cd,prsn_title_nm,
            prsn_first_nm,prsn_mdl_nm,prsn_last_nm,addtnl_third_party_txt)
            VALUES(third_party_id_seq.nextval,logonId,upper(userType),title,
            firstName,middleName,lastName,comments)
        returning third_party_id into thirdPartyId;
    end usp_insert_user;

これはシーケンスを使用して次のIDを生成し、returning句はOUTパラメーターを設定します。

この手順を回避し、シーケンスを使用してトリガーでID生成を実行することもできます。特にこのサイトには、このアプローチの例がたくさんあります。

CREATE OR REPLACE TRIGGER third_party_user_temp_bi
BEFORE INSERT ON third_party_user_temp
FOR EACH ROW
BEGIN
    SELECT thirdPartyIdSeq.NEXTVAL
    INTO   :new.third_party_id
    FROM   dual;
END;
/

その場合、挿入物は使用するIDを指定する必要はありません。

于 2011-03-01T12:16:00.807 に答える