该过程对于在oracle中生成序列号是否正确

时间:2015-06-15 07:17:52

标签: oracle stored-procedures

请检查以下程序是否正确?插入没有发生。

我想在第一列中生成序列号。请告诉我它是否正确。

create or replace PROCEDURE SP_JCP_SET_DET_BND_LST(  
    p_channel IN VARCHAR2,   
    p_deptBrandListName IN VARCHAR2,  
    p_groupNo IN NUMBER,
    p_userID IN VARCHAR2
    )
AS
  SequenceId          NUMBER;

BEGIN

SELECT seqid1+1 into SequenceId from(SELECT CHANNEL_DEPT_BRAND_LIST_ID as seqid1 
FROM GMPPFC.CHANNEL_DEPT_BRAND_LIST
ORDER  BY CHANNEL_DEPT_BRAND_LIST_ID DESC) where rownum=1;

INSERT INTO GMPPFC.CHANNEL_DEPT_BRAND_LIST
(
CHANNEL_DEPT_BRAND_LIST_ID,
CHANNEL_NM,
DEPT_BRAND_LIST_NM,
GROUP_NO,
CREATE_USER_ID,
CREATE_TS,
CHANGE_USER_ID,
CHANGE_TS)
VALUES
(
SequenceId, 
p_channel,
p_deptBrandListName,
p_groupNo,
p_UserID,
sysdate,
null,
null
);

COMMIT;
NULL;
END SP_JCP_SET_DET_BND_LST;

1 个答案:

答案 0 :(得分:2)

原则上,如果Maxx评论你的表不为空,它将起作用。

但是,正确的实现方法是使用序列,并且对于这种普通情况考虑触发器。

就是这个:

CREATE SEQUENCE CHANNEL_DEPT_BRAND_SEQ START WITH 1 NOMAXVALUE MINVALUE 1 NOCYCLE;

CREATE OR REPLACE TRIGGER BIR_CHANNEL_DEPT_BRAND_LIST
    BEFORE INSERT ON CHANNEL_DEPT_BRAND_LIST
    FOR EACH ROW
BEGIN
    :NEW.CHANNEL_DEPT_BRAND_LIST_ID := CHANNEL_DEPT_BRAND_SEQ.NEXTVAL;
    :NEW.CREATE_TS := SYSDATE;
END;
/

当多个会话同时调用您的过程时,您的解决方案将在多用户环境中产生问题。