sql - oracle DB 中的自动增量替代方案

标签 sql database oracle database-design auto-increment

我对 Oracle 比较陌生,过去几个小时一直在浏览网页,但仍然找不到困扰我的问题的明确答案。

我有软件工程背景,通过为每个表创建 AI 序列而进行的代码重复量让我感到沮丧。无论如何,我是否可以定义一个采用序列和表名称的 AI 函数,这样我就可以在触发器中调用该函数,或者我是否需要对每个序列进行硬编码?

目前,我拥有的 12 个表中的每一个都有这样的序列

CREATE OR REPLACE TRIGGER trg_site_addr
BEFORE INSERT OR UPDATE ON site_addr FOR EACH ROW
BEGIN 
IF INSERTING THEN
    IF :NEW.site_addr_id IS NULL THEN
        SELECT seq_site_addr_id.nextval
        INTO :NEW.site_addr_id
        FROM sys.dual;
    END IF;
END IF;
END;

理想情况下,我希望能够执行以下操作

CREATE OR REPLACE TRIGGER trg_site_addr
BEFORE INSERT OR UPDATE ON site_addr FOR EACH ROW
BEGIN 
IF INSERTING THEN
    IF :NEW.site_addr_id IS NULL THEN
        -- Param 1 = sequence name, Parm 2 = table name
        auto_increment(seq_site_addr_id, site_addr);
    END IF;
END IF;
END;

我将如何去做这件事,任何指示将不胜感激。

亚历克斯。

* 编辑* 为了消除任何困惑,我想创建一个函数,但我不知道是否可以在函数中嵌入序列,然后使用参数,即

CREATE FUNCTION auto_increment( seq_name, table_col_id)
       SELECT seq_name.nextval
       INTO :NEW.table_col_id
       FROM sys.dual;
END;

这样,它将在每个表的触发器内动态创建增量序列,而无需我在每个表上对 AI 触发器进行硬编码。

如果这是不可能的,那么硬编码没什么大不了的,这只是我的一个查询。

最佳答案

另一种方法是使用一个表来存储其他表 ID。
喜欢:
identification holder

对于应用程序的任何表(例如客户表),我们需要执行以下操作:

insert into ID_Table (table_name, current_id) values ('CUSTOMER', 0);

获取新 ID 的函数为:

CREATE OR REPLACE FUNCTION fetch_new_id(p_table_name Varchar2) return number
IS
   result_value number;
BEGIN    
       SELECT ID_Tbale.current_id + 1
       INTO result_value 
       FROM ID_Table where trim(upper(ID_Table.table_name)) = trim(upper(p_table_name))
      for update;

      UPDATE ID_Tbale set current_id =  current_id + 1
      where trim(upper(ID_Table.table_name)) = trim(upper(p_table_name));

      COMMIT;

      RETURN result_value ;
      -- exception handling, etc
END;

关于sql - oracle DB 中的自动增量替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151894/

相关文章:

sql - 外键约束是否自动禁止空值?

iphone - 数据库中的原始数据或预先计算的值?

python - "error: cannot locate an Oracle software installation"尝试安装 cx_Oracle 时

oracle - Oracle 中的 EXTPROC 是什么?

java - Spring存储过程传递数组

mysql - 理解加盟

php - 用于 SELECT 查询的多个 HTML 字段

php - 如何在 LIMIT 子句中应用 bindValue 方法?

mysql - 我应该为同一个SQL表列选择自增和主键吗

database - 中止和回滚之间的区别?