Хранимая процедура возврата первичного ключа после вставки? - PullRequest
2 голосов
/ 23 июля 2010

Я хочу, чтобы хранимая процедура возвращала первичный ключ новой записи после ее выполнения.Я думаю, что он будет возвращен параметром OUT в процедуре.Но как выбрать недавно вставленный идентификатор строки?Я не хочу использовать select MAX (row_id), так как это многопользовательская среда.Любой пример процедуры будет оценен.

Моя платформа - ISeries DB2 V5 R4.Спасибо.

Редактировать

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

Edit

Вот что я пытаюсь сделать

Begin Stored procedure
   Insert into Employees;
   (row id gets automatically generated by trigger) 
Return row id ;

Я хочучтобы избежать выбора при возврате идентификатора строки.

Ответы [ 4 ]

2 голосов
/ 14 июня 2012
CREATE PROCEDURE ASF_InsertNewAuthorRequest 
(IN @REQUESTTYPE CHAR(1), IN @UserID VARCHAR(18), IN @DATECREATED TIMESTAMP,  IN @REQUESTSTATUS CHAR(1))
    LANGUAGE SQL
    DYNAMIC RESULT SETS 1
P1: BEGIN

    DECLARE cursor1 CURSOR WITH RETURN for
    SELECT IDENTITY_VAL_LOCAL FROM SYSIBM.SYSDUMMY1;


    INSERT INTO AFS_REQUEST 
        ( REQUESTTYPE, "UserID", DATECREATED, REQUESTSTATUS ) 
    VALUES 
        ( @REQUESTTYPE, @UserID, @DATECREATED, @REQUESTSTATUS );

    OPEN cursor1;

END P1
2 голосов
/ 23 июля 2010

- ОБНОВЛЕНО ---

Привет, Попо,

Прежде всего, не могли бы вы рассказать подробнее о том, что вы имеете в виду, когда говорите, что rowid назначен триггером?

Если бы у вас был столбец реальных идентификаторов, вы бы использовали функцию IDENTITY_VAL_LOCAL (), например, сразу после INSERT: SELECT IDENTITY_VAL_LOCAL() INTO myrowid FROM SYSIBM.SYSDUMMY1; Я не на 100% использую этот синтаксис, потому что я обычно использую встроенный SQL, и он работает там иначе возможно, придется поиграть с этим. Документация IBM по адресу http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/db2/rbafzscaidentity.htm.

Однако, поскольку вы делаете что-то более сложное, я думаю, что этот альтернативный метод может сработать. Вам нужно будет переформатировать вашу ВСТАВКУ, чтобы обернуть ее в SELECT.

SELECT myrowid
INTO myrowid
FROM FINAL TABLE (
   INSERT INTO myfile (myrowid, other_stuff) VALUES (default, 'blah')
)

Вам нужно будет настроить правильные имена полей и так далее, но я думаю, что это поможет. Документации не так много, но если вы хотите увидеть ее, перейдите на http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/db2/rbafzbackup.htm и прокрутите ее до самого конца страницы.

Приветствия

2 голосов
/ 23 июля 2010

просто установите параметр out для столбца, который содержит PK.

CREATE PROCEDURE DB2TBL.DO_STUFF (IN Param1 INT, IN Param2 CHAR(32),OUT Param3 INT) 
/* Param1 is primary key */
LANGUAGE SQL
P1: BEGIN
DECLARE OUTPARAM INT;
/* Do the stored procedure */
SET OUTPARAM = Param1; 
1 голос
/ 09 марта 2012
INSERT INTO [User] (columns)
OUTPUT inserted.userId   
VALUES (@values)

Это вернет вновь созданное значение столбца userId ... очень просто.

...