Oracle 在函數或存儲過程中執行一條插入語句並返回主鍵ID值


有時,我們需要往一張表插入一條記錄,同時返回主鍵ID值。

假定主鍵ID的值都是通過對應表的SEQUENCE來獲得,然后進行ID賦值

這里有幾種情況需要注意:

1)如果建表語句含有主鍵ID的觸發器,通過觸發器來實現主鍵ID的自增,實現方式如下:

INSERT INTO GP_MONTH_BILL (
                           MONTH,
                           BONUS_VALUE,
                           CUR_WAY,
                           CUR_TIME,
                           STATUS,
                           IS_USE,
                           CREATE_TIME)
     VALUES (
             CUR_MONTH,
             CUR_BONUS_VALUE,
             '包函數固化',
             SYSDATE,
             '固化中',
             1,
             SYSDATE)
  RETURNING ID
       INTO CUR_MONTH_BILL_ID;   --CUR_MONTH_BILL_ID為變量,接收返回的ID值

關鍵語法: INSERT INTO TABLE VALUES(,) RETURNING ID INTO  VAL

補充:此種情況,觸發器的語句可能如下

CREATE OR REPLACE TRIGGER GPS.TR_EM_FILES 
before insert on "GPS"."EM_FILES"
for each row
begin
  select "GPS"."SQ_EM_FILES".nextval into :new."ID" from dual;
end;
/

oralce12c,主鍵是通過default設置SEQUENCE下一個值

CREATE TABLE C##EM.GP_TARGET_TYPE
(
  ID           NUMBER(19)                       DEFAULT "C##EM"."ISEQ$$_124895".nextval NOT NULL,  --DEFAULT默認值為seq的下個值
  NAME         NVARCHAR2(50)                    NOT NULL,
  REMARK       NVARCHAR2(200),
  CREATE_TIME  DATE                             NOT NULL,
  CREATE_UID   NUMBER(19),
  DELETE_UID   NUMBER(19),
  DELETE_TIME  DATE,
  IS_DELETE    NUMBER(1)                        NOT NULL,
  UPDATE_TIME  DATE,
  UPDATE_UID   NUMBER(19)
)

 

2)如果主鍵ID的值由用戶自主獲得SEQUENCE的值,然后賦值,實現方式可以如下:

SELECT YOUR_SEQ.NEXTVAL  INTO MID_ID FROM DUAL; --MID_ID為變量

INSERT INTO TABLE(ID) VALUES(MID_ID);

補充:此種情況,可以有觸發器,語句可能如下:

CREATE OR REPLACE TRIGGER C##WL.TR_BULLETIN BEFORE INSERT
ON C##WL.WL_BULLETIN 
FOR EACH ROW
WHEN (
NEW.ID IS NULL OR NEW.ID = 0
      )
BEGIN   
  SELECT   WL_BULLETIN_SEQ.NEXTVAL   INTO   :NEW.ID   FROM   DUAL;   
  END;
/

當前插入的主鍵ID為空值或0時,獲取對應SEQUENCE 的NEXTVAL值來賦值主鍵ID


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM