【问题标题】:What is wrong with my Trigger? Oracle SQLPLUS我的触发器有什么问题?甲骨文 SQLPLUS
【发布时间】:2020-12-22 23:49:27
【问题描述】:

SQLPLUS 触发编译错误

我是 oracle sqlplus 的新手,我正在尝试创建一个触发器,当客户从他们的账户存款或取款时触发,显示 account_no、交易类型(存款/取款)、交易金额、旧余额和新平衡:

这是表格的代码(我已经创建了):

CREATE TABLE CUSTOMERS,
(
  custname VARCHAR2(20)NOT NULL,
  account_no NUMBER(20)NOT NULL,
  cur_balance NUMBER(20) NOT NULL,
  PRIMARY KEY (account_no)
 );

这是我编译的触发代码,但一直报错:

CREATE OR REPLACE TRIGGER account_tx   
AFTER INSERT OR UPDATE OF cur_balance ON customers  
FOR EACH ROW  
DECLARE   
   new_balance number;   
BEGIN CASE WHEN :NEW.cur_balance <:OLD.cur_balance THEN 'WITHDRAWAL';  
ELSE 'DEPOSIT';   
   new_balance := :NEW.cur_balance  - :OLD.cur_balance;   
   dbms_output.put_line('Old balance: ' || :OLD.cur_balance);   
   dbms_output.put_line('New balance: ' || :NEW.cur_balance);   
   dbms_output.put_line('Transaction Amount: ' || new_balance);  
END CASE;  
END;  
/  

【问题讨论】:

  • 使用此触发器我收到此错误:PLS-00103:在预期以下情况之一时遇到符号“WITHDRAWAL”:(begin case declare exit for goto if loop mod null pragma raise return select update while with
  • 你需要一个像:NEW.cur_balance := 'WITHDRAWAL';这样的赋值,而不是一个类似于布尔表达式的逻辑......顺便说一句,在create语句中表名后面有一个错字(逗号)。

标签: oracle plsql triggers sqlplus


【解决方案1】:

您的 CASE 语句搞砸了您需要将 CASE 语句的结果分配给一个变量,如下所示:

CREATE OR REPLACE TRIGGER account_tx
AFTER INSERT OR UPDATE OF cur_balance ON customers
FOR EACH ROW
DECLARE
new_balance number;
trans_type varchar2(30);
BEGIN 
trans_type := CASE WHEN :NEW.cur_balance <:OLD.cur_balance THEN 'WITHDRAWAL'ELSE 'DEPOSIT' END;
new_balance := :NEW.cur_balance  - :OLD.cur_balance;
dbms_output.put_line('Old balance: ' || :OLD.cur_balance);
dbms_output.put_line('New balance: ' || :NEW.cur_balance);
dbms_output.put_line('Transaction Amount: ' || new_balance);
dbms_output.put_line('trans type: ' || trans_type);

END;

【讨论】:

    【解决方案2】:

    您的创建表无效,第一行多余的逗号

    当您遇到错误时,您可以使用“显示错误”命令查看它们。

    运行你的代码,我看到了:

    SQL> show errors
    Errors for TRIGGER ACCOUNT_TX:
    
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    3/57     PLS-00103: Encountered the symbol "WITHDRAWAL" when expecting one
         of the following:
         ( begin case declare exit for goto if loop mod null pragma
         raise return select update while with <an identifier>
         <a double-quoted delimited-identifier> <a bind variable> <<
         continue close current delete fetch lock insert open rollback
         savepoint set sql execute commit forall merge pipe purge
         json_exists json_value json_query json_object json_array
    
    SQL> 
    

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2012-07-16
      相关资源
      最近更新 更多