开发者

Stored procedure return the primary key after insert?

开发者 https://www.devze.com 2023-01-08 07:13 出处:网络
I want a stored procedure to return the primary key of the new record after it gets executed. I think it will be returned by OUT parameter in the procedure. But how to select the newly inserted row ID

I want a stored procedure to return the primary key of the new record after it gets executed. I think it will be returned by OUT parameter in the procedure. But how to select the newly inserted row ID ? I don't want to use select MAX(row_id) as it is a multi user environment. Any procedure sample will be appreciated.

My platform is ISeries DB2 V5 R4. Thanks.

Edit

The row id Column is not an identity column. It uses a sequence for the key which gets generated via a trigger before insert on table.

Edit

Here is what I am trying to do

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

I want to avoid a select in returning row id.开发者_如何学C


just set the out parameter to the column that contains the 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; 


--UPDATED---

Hi Popo,

First off could you give more detail on what you mean when you say the rowid is assigned by a trigger?

If you had a real identity column you would use the IDENTITY_VAL_LOCAL() function like this right after the INSERT: SELECT IDENTITY_VAL_LOCAL() INTO myrowid FROM SYSIBM.SYSDUMMY1; I'm not 100% on that syntax because I generally use embedded SQL and it works differently there so you might have to play with it. IBM documentation is at http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/db2/rbafzscaidentity.htm.

However since you are doing something more complicated, I think this alternate method might work. You'll need to re-format your INSERT to be wrapped in a SELECT.

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

You'll need to adjust for the proper field names and so on but I think this will do the trick. There's not much documentation but if you want to see it go to http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/db2/rbafzbackup.htm and scroll all the way down to the bottom of the page.

Cheers


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


INSERT INTO [User] (columns)
OUTPUT inserted.userId   
VALUES (@values)

This will return the newly created userId column value... very simple.

0

精彩评论

暂无评论...
验证码 换一张
取 消