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

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

num c# 如果 acl get col oracle style 建表語句

有時,我們需要往一張表插入一條記錄,同時返回主鍵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

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