【问题标题】:Auto increment function, Oracle PL/SQL自动递增功能,Oracle PL/SQL
【发布时间】:2013-12-01 19:32:39
【问题描述】:

我有许多触发器可以做各种各样的事情,但在所有具有唯一整数主键的触发器中,我需要它们自动递增。目前代码如下:

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

【问题讨论】:

标签: sql oracle function arguments auto-increment


【解决方案1】:

这是两个问题合二为一:

1) 解决您的问题

你根本不需要整体。您可以执行以下一个比将其传递给函数更短的衬线(编辑:感谢 Ben 在下面的评论,我已将 NVL 替换为 COALESCE):

: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语句。

【讨论】:

  • 在这种情况下不要使用NVL();每次都会evaluate the sequence,无缘无故。最好使用COALESCE()
  • 谢谢本。我已经改了。
猜你喜欢
  • 2011-11-21
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
相关资源
最近更新 更多