【发布时间】:2013-12-07 17:57:47
【问题描述】:
我对 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 触发器进行硬编码。
如果这不可能,那么硬编码没什么大不了的,这只是我的一个查询。
【问题讨论】:
-
所以你想创建类似 for 循环的东西?
-
升级到12c(如果可以的话)并使用identity columns
-
为什么不对所有表格使用相同的顺序?
-
“Oracle”的方式是直接在
INSERT语句中调用你的序列:insert into mytable (id, ... ) values (myseq.nextval, ...)。就我个人而言,我发现这比自动增量列好得多。而且触发器很臭,除非我没有更明智的选择,否则我不会使用它们......
标签: sql database oracle database-design auto-increment