Chr☆s Kwok 的技术笔记

.NET, C#, WPF, WCF, WF, .NetCore & LINQ ... I know how it works because I know why it works ...

博客园 首页 新随笔 订阅 管理

新建表脚本:

CREATE TABLE DATA.SpdCallP2001ApiResult
   (	
    SpdCallP2001ApiResultId NUMBER(10,0) NOT NULL , 
    EncounterId NUMBER(10,0) DEFAULT (-1) NOT NULL ,
    AccountListId NUMBER(10,0) DEFAULT (-1) NOT NULL ,
    OrderId    NUMBER(10,0) DEFAULT (-1) NOT NULL ,
    IsSuccess NUMBER(1,0) DEFAULT (0) NOT NULL ,
    CalledTime TIMESTAMP (6) DEFAULT SYSDATE NOT NULL
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "JXTBSPACE" ;
  
  CREATE UNIQUE INDEX data.PK_SpdCallP2001ApiResult ON data.SpdCallP2001ApiResult (SpdCallP2001ApiResultId) 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "JXTBSPACE" ;

ALTER TABLE data.SpdCallP2001ApiResult ADD CONSTRAINT PK_SpdCallP2001ApiResult PRIMARY KEY (SpdCallP2001ApiResultId)
  USING INDEX "DATA"."PK_SPDCALLP2001APIRESULT" ;

CREATE SEQUENCE  data.SpdCallP2001ApiResult_SE MINVALUE 1 MAXVALUE 999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ;

/

CREATE OR REPLACE TRIGGER data.SpdCallP2001ApiResult_TR 
   BEFORE INSERT 
   ON data.SpdCallP2001ApiResult
   FOR EACH ROW
 DECLARE 
    v_newVal NUMBER(12) := 0;
    v_incval NUMBER(12) := 0;
    v_C  NUMBER(12) := 0;
    PRAGMA AUTONOMOUS_TRANSACTION;  
 BEGIN
  IF INSERTING AND nvl(:new.SpdCallP2001ApiResultId,-1)<0 THEN
    SELECT  data.SpdCallP2001ApiResult_SE.NEXTVAL INTO v_newVal FROM DUAL;
    IF v_newVal = 1 THEN 
      SELECT NVL(max(SpdCallP2001ApiResultId),0) INTO v_newVal FROM data.SpdCallP2001ApiResult;
      v_newVal := v_newVal + 1;
      
      LOOP
           EXIT WHEN v_incval>=v_newVal;
           SELECT data.SpdCallP2001ApiResult_SE.nextval INTO v_incval FROM dual;
      END LOOP;
    END IF;
    
    --跳过已存在的Id,默认生成的触发器没有这个逻辑****************
    loop
        SELECT count(0) INTO v_c FROM data.SpdCallP2001ApiResult WHERE SpdCallP2001ApiResultId=v_newVal;
        IF v_c=0 THEN
            EXIT;
        END IF;
        SELECT data.SpdCallP2001ApiResult_SE.nextval INTO v_newVal FROM dual;
    END LOOP;
    --****************
        
   sqlserver_utilities.IDENTITY  := v_newVal;    
   :new.SpdCallP2001ApiResultId := v_newVal;
   END IF;
  END;
/
ALTER TRIGGER data.SpdCallP2001ApiResult_TR ENABLE;
/

 

posted on 2026-10-20 14:21  Chr☆s  阅读(3)  评论(0)    收藏  举报