Oracle 11g-想知道当前行信息,尤其是PK吗

Oracle 11g-想知道当前行信息,尤其是PK吗,oracle,oracle11g,triggers,sequence,procedure,Oracle,Oracle11g,Triggers,Sequence,Procedure,我像下面那样扣动了扳机。 test\u suc\u func始终返回varchar2“00” 我希望这个PLSQL能够执行以下内容 当数据插入一个TBL时,它调用一个函数 当它失败时,它会更新该列 问题是当我在exception语句中编写时,会更新一个TBL中的所有行 由于一个TBL的PK是序列,我可以用A_seq.currVal得到它,但正如您所看到的,不能在where语句中使用序列 问:如何引用触发器中的当前行数据,比如javascript中的this关键字 我尝试了:new和:old,但它

我像下面那样扣动了扳机。
test\u suc\u func
始终返回varchar2“00”

我希望这个PLSQL能够执行以下内容

  • 当数据插入一个TBL时,它调用一个函数
  • 当它失败时,它会更新该列
  • 问题是当我在
    exception
    语句中编写时,会更新一个TBL中的所有行

    由于一个TBL的PK是序列,我可以用
    A_seq.currVal
    得到它,但正如您所看到的,不能在
    where
    语句中使用序列

    问:如何引用触发器中的当前行数据,比如javascript中的
    this
    关键字

    我尝试了
    :new
    :old
    ,但它在sqldeveloper中弹出了一个奇怪的窗口。谢谢:D bb

    ==================================2015 09 18


    我编辑了这篇文章,因为我出错了。一些
    a_seq
    s变为
    a_id
    s.

    我相信有比这更好的方法。但我找到了一条弯路

    CREATE OR REPLACE TRIGGER a_trigger
      AFTER
        INSERT ON A_TBL
      -- FOR EACH ROW    
    DECLARE
      tmp_id number;
    BEGIN
      select a_seq.currVal into tmp_id from dual;
      call_func(tmp_id);
    exception
      when others then 
      update A_TBL set rc='99'
      where a_id = tmp_id;  
    END;
    
    我在触发器中声明了一个临时变量。 并提到这一点。现在,当我失败时,我只更新当前行


    对于这个问题,我仍然在寻找更有效、更聪明的答案。谢谢

    据我所知,您需要修改插入记录的列。
    在这种情况下,触发器中不需要update语句。
    您只需在插入前使用
    为每行触发

    在这种情况下,您可以只为
    :new.created
    :new.rc
    ,它们将插入到
    created
    rc
    列中。
    大概是这样的:

    CREATE OR REPLACE TRIGGER a_trigger
      BEFORE
        INSERT ON A_TBL
        FOR EACH ROW    
    BEGIN
      :new.created = test_suc_func();
    exception
      when others then 
        :new.rc = '99';
    END;
    

    您不能在
    触发器之后修改:
    中的新变量,并且在没有
    的情况下,无法访问每行的
    选项。此外,不能从
    为同一个表(表正在发生变化)上的每一行
    触发器调用某个表上的DML(insert/update/delete)。

    不能在触发触发器的表上运行
    update
    语句。你不需要它<代码>:new.created:=test_suc_func()是您在应用程序中所需的全部内容trigger@a_horse_with_no_name这段代码是一个简单的版本。实际上,它将调用远程数据库中的函数。-我不明白你的第一句话。我提供的代码实际上是有效的。问题是它会更新所有行,因为我编写了where子句,比如
    a\u id=a\u id
    。我想写的是类似于
    a_id=this.a_id
    a_id=a_seq.currVal
    。无论如何,谢谢。在语句级触发器中没有“当前行”这样的东西,因为它是为语句而不是为每一行触发的。该语句可能影响了数百万行。我有几个问题,但不确定您为什么放弃行级触发器(并转到语句级),因为行级似乎是您想要的(因此您可以参考:new和:old)。尝试将“set define off”放在顶部,然后作为脚本运行,或者将触发器代码放在单独的编辑器窗口中,然后运行execute语句(而不是脚本)。或者,放入一个sql文件并在sqlplus(@myfile.sql)中运行。如果插入了多行,这将不起作用。我仍然不明白为什么不能(或不想)使用行级触发器并分配
    :new
    值directly@a_horse_with_no_name我是PLSQL新手,但是否有一次插入几行的情况?我假设在insert语句中,目标一次只有一条记录。我将检查我是否可以在事件后使用行级触发器。但是,在我的情况下必须更新后插入。在这个项目中,首先插入MyDB表,然后调用返回响应代码的远程函数。在我从remote收到响应代码后,更新原始行(已插入)。解决此任务有两种方法:1)将_tbl.rowtype传递给函数,或者只传递内部所需的列列表(在这种情况下,不需要在函数中查询此行,因此可以在触发器之前使用)。然后使用:新的。触发器中的变量设置从函数传递的新值。(不要在触发器或函数中使用更新)2)从触发器运行作业,它将在提交insert后启动,然后函数需要更新此行。(但在这种情况下,在函数更新此行并在未定义这两列时提交结果之前,提交后会有间隙)
    CREATE OR REPLACE TRIGGER a_trigger
      BEFORE
        INSERT ON A_TBL
        FOR EACH ROW    
    BEGIN
      :new.created = test_suc_func();
    exception
      when others then 
        :new.rc = '99';
    END;