【问题标题】:I am having PLS-00103: Encountered the symbol我有 PLS-00103:遇到符号
【发布时间】:2022-01-22 03:59:28
【问题描述】:

我有

PLS-00103:在期待其中一个时遇到符号“END” 以下:(开始 case 声明退出 goto if loop mod null pragma raise return select update while with

我到处搜索,但找不到解决方法

CREATE TABLE UPAYMENT AS SELECT * FROM PAYMENT ;


DROP TRIGGER A;
CREATE OR REPLACE TRIGGER A
    after insert ON Upayment
    FOR EACH ROW
    DECLARE
    ERROR_ EXCEPTION ;
    h varchar2(20);
    NOFOUND EXCEPTION ;
    CURSOR Y3 IS 
    SELECT PAYMENT_DATE FROM UPAYMENT ;
BEGIN
OPEN Y3;
loop fetch Y3 into h;
IF Y3%NOTFOUND THEN RAISE NOTFOUND;
    IF (:NEW.PAYMENT_DATE >= '01-JAN-22'and INSERTING)
    THEN
        :NEW.AMOUNT := :NEW.AMOUNT * 1.5;
       ELSE
        END LOOP;
    END IF;
    CLOSE Y3;
 END IF;
    exception when ERROR_
then DBMS_OUTPUT.PUT_LINE('ERROR');
END;

【问题讨论】:

  • 您在内部IFELSE 分支中有一个END LOOP
  • 在关系数据库中,游标通常是一个坏主意,它擅长基于集合的操作。尤其是在可能导致严重性能问题的触发器中。你没有解释你想要达到的目标。所以只是一个一般性的建议。
  • 命令DROP TRIGGER A; 是多余的,因为CREATE TRIGGER 语句的REPLACE 选项已经可以做到这一点。

标签: oracle plsql triggers database-cursor


【解决方案1】:

很多错误。

  • 插入时触发;你不必检查你是否是inserting(此外,你不能像以前那样做)
  • 不要将日期与字符串进行比较;使用带有适当格式掩码的日期文字或 TO_DATE 函数
  • 您不能在after 触发器中修改:new 值;必须是before
  • 您不能(实际上,您不应该)在IF 中间结束循环
  • 无论如何,您需要循环做什么?

修复后,触发器看起来像这样工作

SQL> create or replace trigger a
  2    before insert on upayment
  3    for each row
  4  declare
  5    error_ exception ;
  6    h varchar2(20);
  7    nofound exception ;
  8    cursor y3 is
  9      select payment_date from upayment ;
 10  begin
 11    open y3;
 12    loop
 13      fetch y3 into h;
 14
 15      if y3%notfound then
 16         raise nofound;
 17      else
 18         if :new.payment_date >= date '2022-01-01' then
 19            :new.amount := :new.amount * 1.5;
 20         end if;
 21      end if;
 22    end loop;
 23    close y3;
 24
 25  exception when nofound then
 26    dbms_output.put_line('ERROR');
 27  end;
 28  /

Trigger created.

SQL> desc upayment
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PAYMENT_DATE                                       DATE
 AMOUNT                                             NUMBER

SQL> insert into upayment (payment_date, amount) values (sysdate, 100);
ERROR

1 row created.

SQL>

不过,我想您可以将其简化为(删除光标、循环、用户定义的异常……等等)

SQL> create or replace trigger a
  2    before insert on upayment
  3    for each row
  4  begin
  5    if :new.payment_date >= date '2022-01-01' then
  6       :new.amount := :new.amount * 1.5;
  7    end if;
  8  end;
  9  /

Trigger created.

SQL> insert into upayment (payment_date, amount) values (sysdate, 500);

1 row created.

SQL> select * from upayment;

PAYMENT_DATE            AMOUNT
------------------- ----------
19.01.2022 22:28:03        150
19.01.2022 22:32:57        750

SQL>

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多