【问题标题】:Oracle SQL Create Trigger to insert SEQ.nextvalOracle SQL 创建触发器以插入 SEQ.nextval
【发布时间】:2018-12-02 09:56:19
【问题描述】:

我正在创建一个触发器以将相同的 SEQ.nextval 数字添加到两个字段,如下所示:

SITE_NUM  SITE_NUM_COPY  Site_Name
346        346           XYZ
347        347           ABC
348        348           DEF

每当通过应用程序添加新行时,我希望通过触发器自动生成 SITE_NUMSITE_NUM_COPY

这是我整理的:

create or replace trigger SITE_TRIGGER
before insert or update on STRATEGY_SITES for each row
begin
if updating then
    if :new.SITE_NUM is null and :new.SITE_NUM_Copy is NULL then
        :new.SITE_NUM := :old.SITE_NUM
        and :old.SITE_NUM := :new.SITE_NUM_COPY;
    end if;
end if;
if inserting then
    :new.SITE_NUM := SITENUM_SEQ.nextval 
    and :new.SITE_NUM_COPY := SITENUM_SEQ.nextval;
end if;
end;

得到以下错误:

错误 (7,31):PLS-00103:在预期以下情况之一时遇到符号“=”:
. ( * @ % & = - + ; at in is mod remaining not rem or != or ~= >= and or like2 like4 likec between || 指示符多集成员子多集
在“=”之前插入符号“*”以继续。

【问题讨论】:

    标签: oracle sequence database-trigger


    【解决方案1】:

    该错误不是很有帮助,而是源于您使用 and 显然在每个 if 块内分隔两个语句。语句终止符/分隔符是分号。

    您似乎正在尝试为第一个执行此操作:

    if updating then
        if :new.SITE_NUM is null and :new.SITE_NUM_Copy is NULL then
            :new.SITE_NUM := :old.SITE_NUM;
            :old.SITE_NUM := :new.SITE_NUM_COPY; -- illegal
        end if;
    end if;
    

    但您不能更改:old 的值;目前尚不清楚您期望发生什么,至少因为赋值必须为空。您可能只想删除该行。

    第二部分:

    if inserting then
        :new.SITE_NUM := SITENUM_SEQ.nextval;
        :new.SITE_NUM_COPY := SITENUM_SEQ.currval;
    end if;
    

    我已将第二个分配更改为使用 currval,因为您说您希望两列的值相同。如果您为这两个分配调用nextval,它们将获得不同的值,因为序列将增加两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2015-05-30
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多