如何在Oracle中进行(条件)插入后触发器触发?

时间:2018-03-29 15:34:53

标签: oracle plsql

所以我试图触发一个触发器并将数据插入到各种表中。但是,该过程将有所不同,因此我将创建两个单独的触发器。到目前为止,我已经学会了如何在每次插入表格后触发触发器。如果ID与另一个表中的某个主键(id)相关,我怎么能触发一个触发器?我希望触发器只触发与' 777'的Form_ID相关的survey_cycles。从表格表中。 Form_ID和Survey_Cycle在form_id中连接。这两个表的裸骨表结构如下:

sns = boto3.client('sns')
sns.publish(
    PhoneNumber = '+11234567890',
    Message = 'Simple text message'
)

我当前的触发器代码如下:

*Survey_Cycle:*
survey_Cycle_id
survey_form_id

*Survey_Form:*
Survey_Form_Id

1 个答案:

答案 0 :(得分:0)

也许您可以创建一个调用存储过程的触发器,并让它决定是否执行其他处理。这是一个例子:

示例表:

SQL> create table survey_cycle
  2    (survey_cycle_id number constraint pk_sc primary key,
  3     survey_form_id  number
  4    );

Table created.

SQL> create table survey_form
  2    (survey_form_id  number constraint pk_sf primary key);

Table created.

SQL>

一个过程,对于传递给它的ID,它检查SURVEY_FORM表中是否存在这样的ID。如果没有,SELECT将失败(即提升NO_DATA_FOUND),因此该程序不会做任何事情。如果它存在,它将执行其他代码(例如插入另外两个表;而不是那样,我只是显示相应的消息)。

SQL> create or replace procedure p_survey (par_survey_form_id in number)
  2  is
  3    l_survey_form_id survey_form.survey_form_id%type;
  4  begin
  5    select survey_form_id
  6      into l_survey_form_id
  7      from survey_form
  8      where survey_form_id = par_survey_form_id;
  9
 10    dbms_output.put_line('Here goes INSERT INTO survey_cycle_sample and survey_cycle_period');
 11  exception
 12    when no_data_Found then
 13      -- there's no ID like PAR_SURVEY_FORM_ID, so - do nothing
 14      null;
 15  end;
 16  /

Procedure created.

触发器非常简单:

SQL> create or replace trigger trg_ai_survey_cycle
  2    after insert on survey_cycle
  3    for each row
  4  begin
  5    p_survey(:new.survey_form_id);
  6  end;
  7  /

Trigger created.

SQL>

最后,测试:777是"现有" ID将导致其他插入。

SQL> set serveroutput on
SQL> insert into survey_form values (777);

1 row created.

SQL> --
SQL> insert into survey_cycle values (1, 100);

1 row created.

SQL> insert into survey_cycle values (2, 777);
Here goes INSERT INTO survey_cycle_sample and survey_cycle_period

1 row created.

SQL>