Sql Oracle表单Secuences或Autoincrement或其他选项

Sql Oracle表单Secuences或Autoincrement或其他选项,sql,oracle,plsql,auto-increment,oracleforms,Sql,Oracle,Plsql,Auto Increment,Oracleforms,我需要把数字2放在公司里,也就是CODCIA,序列是1,2,3,4等等。当放数字4时,序列被重置为1。 我只有一张带有codcia字段的表 我是这样想的: CODCIA NRODOCTO ------ -------- 2 1 2 2 2 3 4 4 4 5 4 6 使用此代码: IF (:E.NRODOCTO in (2)) then BEGIN SELECT NVL(MAX(NRODOCTO),1200)+1

我需要把数字2放在公司里,也就是CODCIA,序列是1,2,3,4等等。当放数字4时,序列被重置为1。 我只有一张带有codcia字段的表

我是这样想的:

CODCIA NRODOCTO
------ --------
2      1
2      2
2      3
4      4
4      5
4      6
使用此代码:

IF (:E.NRODOCTO in (2)) then
   BEGIN
       SELECT NVL(MAX(NRODOCTO),1200)+1 
       INTO   :E.NRODOCTO 
       FROM PS91;
   EXCEPTION WHEN OTHERS THEN :E.NRODOCTO  := 1200;
   END;
END IF;
我需要这个:

CODCIA NRODOCTO
------ --------
2      1
2      2
2      3
4      1
4      2
4      3

你的问题似乎遗漏了很多信息;并不是说你应该发布所有的信息,但过于简单化也无济于事

无论如何:我想说,您可能正在使用
POST-INSERT
触发器和update NRODOCTO列值,因为在表单中这样做需要在整个块中循环,注意CODCIA项值并增加适当的NRODOCTO值,并对所有不同的CODCIA值执行此操作。这有点无聊,因为没有人阻止用户输入混合的CODCIA值

下面是一个基于SQL*Plus的示例(因为我不打算为它创建表单)。PS91表看起来很可能没有那么简单(重读我的第一句话),但这就是你告诉我们的

SQL> create table ps91 (codcia) as
  2    (select 2 from dual union all
  3     select 2 from dual union all
  4     select 2 from dual union all
  5     --
  6     select 4 from dual union all
  7     select 4 from dual
  8    );

Table created.

SQL> alter table ps91 add nrodocto number;

Table altered.

SQL> -- POST-INSERT form trigger
SQL> merge into ps91 p
  2    using (select rowid rid, row_number() over (partition by codcia order by null) rn
  3           from ps91
  4          ) x
  5  on (p.rowid = x.rid)
  6  when matched then update set p.nrodocto = x.rn;

5 rows merged.

SQL> select * from ps91
  2  order by codcia, nrodocto;

    CODCIA   NRODOCTO
---------- ----------
         2          1
         2          2
         2          3
         4          1
         4          2

SQL>

看起来你需要在每个CODCIA组重置计数器。您可以有更多的组,如低于2个或大于4个?还是只有2组,2组和4组?请看Row_Number()函数,而不是您编写的函数。