背景信息
因此,这是此问题的背景。当前,我们有多个物料清单编号标识符(UNPN,UDEN,UXXN等),每个都有自己的序列号(UNPN0001,UNPN0002,UNPN0003等)
当用户请求新的物料清单编号时,可以说一个新的UNPN编号。如果最后一个号码是UNPN0003,则用户应该可以保留UNPN0004。
我的初步想法:
所以起初我想,我可以简单地在表中创建一个序列列。因此,如果我们有一个UNPN表,我们可以轻松地添加一条新记录并对其自动排序,并返回UNPN +生成的序列号的组合。
问题:
所以我确定的问题是,对于这种方法,我们目前有50多种不同的物料清单标识符。因此,这意味着我将必须为其每个标识符及其自动序列列创建1个表。
我正在寻找什么:
我宁愿避免创建50多个不同的表。我不确定是否可以将其他模式用于我的数据库,或者是否应该放弃该方法以用于其他用途。我不认为您可以在一个表中有多个序列列,这些列只能根据输入的内容进行排序,当然我对所有可能的事还没有完全了解
任何建议将不胜感激。
谢谢
答案 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');