我正在使用 oracle 中的一个序列在 id 列中存储增量值,并且在插入触发器之前设置了,但现在由于某种原因我需要在同一表中的 id1 列中存储相同的值。
请让我知道我该怎么做。
既然你提到了一个trigger
,我想你需要了解PL/SQL语法。 链接中提到的重要部分是,每次引用伪列时currval
并nextval
:
PL/SQL评估每次出现的sequence_name。库尔瓦尔和 sequence_name。NEXTVAL(与计算序列的SQL不同 表示它出现的每一行(。
出于您的目的,请注意在触发器中只使用nextval
一次。
插入的示例;触发器的代码将类似。 我错了;此语法是在 11g 中引入的,因此这应该适用于大多数人:
BEGIN
INSERT INTO employees_temp (employee_id, dup_id, first_name, last_name)
VALUES (employees_seq.NEXTVAL, employees_seq.CURRVAL, 'Lynette', 'Smith');
END;
/
请注意在第二个VALUES
参数中使用CURRVAL
。
我建议在这种情况下使用virtual column
。
虚拟列数据是动态生成的。
COL2 NUMBER,
COL3 NUMBER GENERATED ALWAYS AS COL2 VIRTUAL
在这种情况下,COL3
将始终等于COL2
。
如果确实需要成为trigger
的一部分,那么您只需将seq.nextval
分配给一个变量并将该变量用于两列即可。
干杯!!
在触发器中,您应该使用 INSERT...返回语法。例如
DECLARE
nID_some_table NUMBER;
BEGIN
INSERT INTO SOME_TABLE (ID_SOME_TABLE, SOMETHING_ELSE, YA_DA_YA_DA)
VALUES (SOME_TABLE_SEQ.NEXTVAL, 'bleah-blah-blort', 'ya-da-ya-da-ya-da')
RETURNING ID_SOME_TABLE INTO nID_some_table;
-- Now use ID_some_table for some other purpose
UPDATE SOME_OTHER_TABLE
SET ID_SOME_TABLE = nID_some_table
WHERE ID_SOME_OTHER_TABLE = nHeaven_only_knows;
END;