возвращение выходного параметра из хранимой процедуры Oracle - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь установить значение выходного параметра thirdPartyId, но получаю сообщение об ошибке missing or invalid option в операторе set 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

1 Ответ

3 голосов
/ 01 марта 2011

Вы можете сделать это:

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

Это может привести к конфликтным ситуациям, если два человека могут запустить его одновременно - оба могут получить один и тот же новый 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;

Используется последовательность для генерации следующего идентификатора, а предложение returning заполняет ваш параметр OUT.

Вы также можете избежать процедуры и выполнить генерацию идентификатора в триггере, снова используя последовательность. Существует множество примеров такого подхода, не в последнюю очередь на этом сайте.

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;
/

Ваша вставка не требует указания идентификатора, который будет использоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...