根据条件使序列列递增?

时间:2019-05-01 21:33:39

标签: c# sql asp.net sql-server entity-framework

背景信息

因此,这是此问题的背景。当前,我们有多个物料清单编号标识符(UNPN,UDEN,UXXN等),每个都有自己的序列号(UNPN0001,UNPN0002,UNPN0003等)

当用户请求新的物料清单编号时,可以说一个新的UNPN编号。如果最后一个号码是UNPN0003,则用户应该可以保留UNPN0004。

我的初步想法:

所以起初我想,我可以简单地在表中创建一个序列列。因此,如果我们有一个UNPN表,我们可以轻松地添加一条新记录并对其自动排序,并返回UNPN +生成的序列号的组合。

问题:

所以我确定的问题是,对于这种方法,我们目前有50多种不同的物料清单标识符。因此,这意味着我将必须为其每个标识符及其自动序列列创建1个表。

我正在寻找什么:

我宁愿避免创建50多个不同的表。我不确定是否可以将其他模式用于我的数据库,或者是否应该放弃该方法以用于其他用途。我不认为您可以在一个表中有多个序列列,这些列只能根据输入的内容进行排序,当然我对所有可能的事还没有完全了解

任何建议将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

您已表明您正在使用Oracle。 Oracle有一个数据库级对象,称为为此类对象创建的序列。他们非常有表现。您可能希望为每个标识符创建一个序列。您只需为每个标识符执行一次。

CREATE SEQUENCE UNPN;  -- Starts a 1 by default
CREATE SEQUENCE UDEN START WITH 50;
CREATE SEQUENCE UXXN MAXVALUE 9999 CYCLE; -- This one will recycle back to 0001 after it hits 9999

接下来,当您需要给定序列的新值时,只需选择它即可:

SELECT 'UNPN'||TO_CHAR(UNPN.NEXTVAL,'FM0000') FROM DUAL;

要使其更容易/更动态,可以定义一个函数来按名称获取新值:

create or replace function get_named_seq(p_sequence varchar2) return varchar2
is
  l_sql VARCHAR2(4000);
  l_Result varchar2(30);
begin
  select 'select '''||sequence_name||'''||to_char('||sequence_name||'.nextval,''FM0000'') from dual'
    into l_sql
    from user_sequences
   where sequence_name = upper(p_sequence);

  execute immediate l_sql
     into l_Result;
   return l_result;
end;
/

如果所请求的序列不存在,则上述函数将引发NO_DATA_FOUND异常,并且即使使用动态SQL,也应避免使用SQL Injection,因为实际的动态SQL语句永远不会直接接触输入参数。您可以像这样使用它,也可以在任何可以使用函数的地方使用它:

INSERT into MyTable (ID, Data) values (get_named_seq('UXXN'), 'some data');