我有许多触发器可以执行各种操作,但是在所有具有唯一整数主键的顶部,我需要它们自动递增。该代码目前看起来如下:
IF :NEW.student_id IS NULL THEN
SELECT seq_student_id.nextval
INTO :NEW.student_id
FROM sys.dual;
END IF;
我认为为这个做一个小函数可能是有用的,就像我是传统的编程语言一样。但是,我不确定如何将参数传递给他们需要去的地方以允许函数正确运行。理想情况下,我只想在顶部调用AUTO_INCREMENT(student_id),并执行类似以下运行的操作(当前不起作用):
create or replace function "AUTO_INCREMENT"
(field in VARCHAR2)
return BOOLEAN
is
begin
IF ':NEW'.field IS NULL THEN
SELECT 'seq_'||field.nextval
INTO :NEW.field
FROM sys.dual;
END IF;
return true;
end;
任何有助于以我期望的方式运行此功能的帮助都会非常感激。我是PL / SQL的新手,我认为这可以作为一个好的功能介绍(如果这是我应该使用它们的地方)。感谢。
答案 0 :(得分:2)
这是两个问题:
1)解决您的问题
如果有的话,你根本不需要整体。你可以做下面的一个班轮,比通过这个功能更短(EDIT:感谢下面的Ben评论,我用COALESCE取代了NVL):
:NEW.student_id := COALESCE(:NEW.student_id, seq_student_id.nextval);
回答你的问题,我不认为你所要求的是可能的,因为你在触发器之外设置了:NEW.field的值。要执行此操作,必须传递OUT参数变量以存储计算的新值,或在调用函数时返回计算的值。 在任何一种情况下,您都必须将触发器内的新值捕获到变量中,或直接捕获到:NEW.field。
2)编写动态sql语句:
您可以通过触发器将字段名称作为字符串传递给函数:
:NEW.field := auto_increment('field');
然后,在你的auto_increment函数中,你可以使用EXECUTE IMMEDIATE来编写动态的sql语句。