【问题标题】:PL SQL Loop Table after insert and update插入和更新后的 PL SQL 循环表
【发布时间】:2020-07-07 07:22:03
【问题描述】:

在插入到另一个名为约会的表后,我正在尝试遍历一个名为 broker 的表,并更新我所拥有的 broker 表上的值。当我尝试创建触发器时,会出现一条错误消息“触发器创建时出现编译错误”

CREATE OR REPLACE TRIGGER broker_level_trigger
AFTER INSERT ON appointment

DECLARE
    counter integer := 1;

BEGIN
for o in (SELECT * FROM broker)
loop
    SELECT COUNT(appointment.broker_id) INTO app_number FROM appointment INNER JOIN broker ON broker.broker_id = appointment.broker_id WHERE broker.broker_id = counter;
    IF app_number > 15 THEN
    UPDATE broker SET broker_level = 'gold' WHERE broker_id = counter;
    counter := counter + 1;
end loop;

end;
/ 

broker 表有一个名为 broker_level 的字段,它会根据约会而改变,如果约会上的 broker_id 字段超过 15,我希望它改变

【问题讨论】:

    标签: sql oracle plsql sqlplus database-trigger


    【解决方案1】:

    show err 是一个很棒的东西。 (我创建了您使用的虚拟表)。

    SQL> CREATE OR REPLACE TRIGGER broker_level_trigger
      2    AFTER INSERT ON appointment
      3  DECLARE
      4    counter integer := 1;
      5  BEGIN
      6    for o in (SELECT * FROM broker)
      7    loop
      8      SELECT COUNT(appointment.broker_id)
      9        INTO app_number
     10        FROM appointment INNER JOIN broker
     11          ON broker.broker_id = appointment.broker_id
     12        WHERE broker.broker_id = counter;
     13
     14      IF app_number > 15 THEN
     15         UPDATE broker SET
     16           broker_level = 'gold'
     17           WHERE broker_id = counter;
     18         counter := counter + 1;
     19
     20    end loop;
     21  end;
     22  /
    
    Warning: Trigger created with compilation errors.
    
    SQL> show err
    Errors for TRIGGER BROKER_LEVEL_TRIGGER:
    
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    18/7     PLS-00103: Encountered the symbol "LOOP" when expecting one of
             the following:
             if
    

    如果您仔细观察,您会发现IF 错过了它的END IF。让我们添加它:

    SQL> CREATE OR REPLACE TRIGGER broker_level_trigger
      2    AFTER INSERT ON appointment
      3  DECLARE
      4    counter integer := 1;
      5  BEGIN
      6    for o in (SELECT * FROM broker)
      7    loop
      8      SELECT COUNT(appointment.broker_id)
      9        INTO app_number
     10        FROM appointment INNER JOIN broker
     11          ON broker.broker_id = appointment.broker_id
     12        WHERE broker.broker_id = counter;
     13
     14      IF app_number > 15 THEN
     15         UPDATE broker SET
     16           broker_level = 'gold'
     17           WHERE broker_id = counter;
     18         counter := counter + 1;
     19      END IF;                          --> missing
     20    end loop;
     21  end;
     22  /
    
    Warning: Trigger created with compilation errors.
    
    SQL> show err
    Errors for TRIGGER BROKER_LEVEL_TRIGGER:
    
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    6/5      PL/SQL: SQL Statement ignored
    7/12     PLS-00201: identifier 'APP_NUMBER' must be declared
    8/7      PL/SQL: ORA-00904: : invalid identifier
    12/5     PL/SQL: Statement ignored
    12/8     PLS-00201: identifier 'APP_NUMBER' must be declared
    

    APP_NUMBER 现在不见了;你使用它,但从未声明它。现在就开始吧:

    SQL> CREATE OR REPLACE TRIGGER broker_level_trigger
      2    AFTER INSERT ON appointment
      3  DECLARE
      4    counter integer := 1;
      5    app_number number;                   --> missing
      6  BEGIN
      7    for o in (SELECT * FROM broker)
      8    loop
      9      SELECT COUNT(appointment.broker_id)
     10        INTO app_number
     11        FROM appointment INNER JOIN broker
     12          ON broker.broker_id = appointment.broker_id
     13        WHERE broker.broker_id = counter;
     14
     15      IF app_number > 15 THEN
     16         UPDATE broker SET
     17           broker_level = 'gold'
     18           WHERE broker_id = counter;
     19         counter := counter + 1;
     20      END IF;                          --> missing
     21    end loop;
     22  end;
     23  /
    
    Trigger created.
    
    SQL>
    

    就是这样。


    如果你不使用 SQL*Plus 而使用其他工具,你可以随时查询user_errors

    Warning: Trigger created with compilation errors.
    
    SQL> select line, position, text from user_errors where name = 'BROKER_LEVEL_TRIGGER' order by sequence;
    
     LINE  POSITION TEXT
    ----- --------- ------------------------------------------------------------
        8        12 PLS-00201: identifier 'APP_NUMBER' must be declared
        9         7 PL/SQL: ORA-00904: : invalid identifier
        7         5 PL/SQL: SQL Statement ignored
       13         8 PLS-00201: identifier 'APP_NUMBER' must be declared
       13         5 PL/SQL: Statement ignored
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2021-07-07
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多