Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如果达到序列最大值,则更新ID_Oracle_Database Trigger - Fatal编程技术网

Oracle 如果达到序列最大值,则更新ID

Oracle 如果达到序列最大值,则更新ID,oracle,database-trigger,Oracle,Database Trigger,我正在使用以下触发器在测试表中插入: 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_循环是顺序。现在我必须使用循环选项,以便在达到最大值后从1开始。因为我不想要重复的LOGI

我正在使用以下触发器在测试表中插入:

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_循环是顺序。现在我必须使用循环选项,以便在达到最大值后从1开始。因为我不想要重复的LOGID,所以如果LOGID存在,如果不是INSERT,我想进行更新。我可以在触发器内部执行此操作吗?

如果我理解得很清楚,您可能需要
而不是
触发器;要构建这样的触发器,需要在表上创建一个视图,并在此视图上构建触发器

例如,假设您有:

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>

那么您的要求是覆盖表中的随机行?迷人。你在问如果可以的话,问题是你是否应该这样做,答案是不。只要在序列上提供一个高的数字限制,你就不必担心重复。此外,使用12C,您可以指定一个序列作为列的默认值。