自动增量功能,Oracle PL / SQL

时间:2013-11-18 15:22:47

标签: sql oracle function arguments auto-increment

我有许多触发器可以执行各种操作,但是在所有具有唯一整数主键的顶部,我需要它们自动递增。该代码目前看起来如下:

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的新手,我认为这可以作为一个好的功能介绍(如果这是我应该使用它们的地方)。感谢。

1 个答案:

答案 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语句。