2017-03-16 6 views
0

에 도달하는 경우 :업데이트 ID 시퀀스 MAX_VALUE 내가 내 테스트 테이블에 삽입하려면 다음 트리거를 사용하고

create or replace 
TRIGGER TRG_CYCLE 
BEFORE INSERT ON TEST_CYCLE 
FOR EACH ROW 
BEGIN 
IF :NEW.LOGID IS NULL 
    THEN SELECT SEQ_CYCLE.nextval INTO :NEW.LOGID from dual; 
END IF; 
END; 

SEQ_CYCLE이 순서입니다. 이제 MAX_VALUE에 도달 한 후 1부터 시작하려면 CYCLE 옵션을 사용해야합니다. 중복 된 LOGID를 원하지 않기 때문에 INSERT가 아니라면 LOGID가 있으면 UPDATE를하고 싶습니다. 방아쇠 안쪽에서 이것을 할 수 있습니까?

+0

귀하의 요구 사항은 테이블의 임의의 행을 덮어 쓰는 것입니까? 매혹적인. – APC

+0

할 수 있는지 묻는다면, 질문은 당신이 이것을해야하는지 아닌지이며 대답은 아니오입니다. 순서에 숫자 제한을두기 만하면 중복에 대해 걱정할 필요가 없습니다. 또한 12C를 사용하면 시퀀스를 열에 대한 기본값으로 지정할 수 있습니다. – unleashed

답변

0

잘 이해하면 INSTEAD OF 트리거가 필요할 수 있습니다. 그런 트리거를 만들려면 테이블 위에 VIEW를 만들고이 뷰에서 트리거를 작성해야합니다. 예를 들어

은, 당신이 말 :

create sequence SEQ_CYCLE maxValue 3 cycle nocache; 
create table TEST_CYCLE (logId number, someColumn varchar2(20)); 

당신은보기와보기를 통해 트리거를 만들 수 있습니다 : 당신이보기에 삽입물을 할 경우

create or replace view v_test_cycle as select * from test_cycle; 

create or replace trigger trgCycle 
instead of insert on v_test_cycle 
for each row 
declare 
    vCheck number; 
    vSeqVal number := SEQ_CYCLE.nextVal; 
begin 
    select count(*) 
    into vCheck 
    from v_test_cycle 
    where logId = vSeqVal; 
    -- 
    if vCheck = 0 then 
     insert into test_cycle(logId, someColumn) values (vSeqVal, :NEW.someColumn); 
    else 
     update test_cycle 
     set someColumn = :NEW.someColumn 
     where logId = vSeqVal; 
    end if; 
end; 

, 이것은 무엇을 당신 얻으십시오 :

SQL> select * from test_cycle; 

no rows selected 

SQL> insert into v_test_cycle(someColumn) values('some value 1'); 

1 row created. 

SQL> insert into v_test_cycle(someColumn) values('some value 2'); 

1 row created. 

SQL> insert into v_test_cycle(someColumn) values('some value 3'); 

1 row created. 

SQL> insert into v_test_cycle(someColumn) values('some value 4'); 

1 row created. 

SQL> insert into v_test_cycle(someColumn) values('some value 5'); 

1 row created. 

SQL> select * from test_cycle; 

    LOGID SOMECOLUMN 
---------- -------------------- 
     1 some value 4 
     2 some value 5 
     3 some value 3 

SQL>