暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 识别是否在触发器中 “默认” 生成条目

askTom 2017-08-04
301

问题描述

亲爱的汤姆,

当具有这样的自动生成ID的表:
create table ids (
id number generated by default as identity,
t varchar2(300));
复制


并创建这样的触发器:

create or replace trigger ids_trig before insert on ids for each row begin
dbms_output.put_line(:new.id || ' ' || :new.t);
end;
复制


现在添加这样的行:
insert into ids (t) values ('Sometext');

insert into ids (id,t) values (7,'SomeOthertext');
复制


我确实得到了这样的dbms_output:
1 Sometext
7 SomeOthertext
复制



我想知道: 是否有可能在triger中找出 “id” 列是自动生成的还是在insert语句中显式设置的?

谢谢你的帮助!

致以最诚挚的问候,
菲利普

专家解答

查找为标识创建的序列Oracle数据库的名称。然后,您可以检查其currval是否与新id匹配:

create table ids (
  id   number
    generated by default as identity,
  t    varchar2(300)
);

select column_name, data_default 
from   user_tab_cols
where  table_name = 'IDS';

COLUMN_NAME  DATA_DEFAULT                     
ID           "CHRIS"."ISEQ$$_147783".nextval  
T

create or replace trigger ids_trig before
  insert on ids
  for each row
begin
  if :new.id = ISEQ$$_147783.currval then
    dbms_output.put_line('SAME');
  else
    dbms_output.put_line('DIFF');
  end if;
end;
/

set serveroutput on
insert into ids ( t ) values ( 'Sometext' );
SAME

1 row created.

insert into ids ( id,t ) values ( 7,'SomeOthertext' );
DIFF

1 row created.
复制


不过请注意,这并不是100% 万无一失的。如果您提供的值恰好与currval匹配,则会得到一个误报:

insert into ids ( id,t ) values ( 1,'SomeOthertext' );
SAME

1 row created.
复制


希望您对identity列有一个主要或唯一的约束,因此至少在发生这种情况时会得到一个ORA-1。

另外请注意,要访问currval,您必须首先调用nextval来初始化它。所以在一个新的会话中,你可能会遇到这个错误:

insert into ids ( id,t ) values ( 1,'SomeOthertext' );
insert into ids ( id,t ) values ( 1,'SomeOthertext' )
            *
ERROR at line 1:
ORA-08002: sequence ISEQ$$_147785.CURRVAL is not yet defined in this session
ORA-04088: error during execution of trigger 'CHRIS.IDS_TRIG'
复制


所以你需要适当的异常处理。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论