簡體   English   中英

插入和更新后的 PL SQL 循環表

[英]PL SQL Loop Table after insert and update

我正在嘗試在插入到名為約會的不同表后循環遍歷名為 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_level 的字段,它根據約會而改變,如果約會上的 broker_id 字段超過 15,我希望它改變

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM