我的触发器有什么问题?甲骨文SQLPLUS
What is wrong with my Trigger? Oracle SQLPLUS
SQLPLUS 触发器编译错误
我是 oracle sqlplus 的新手,我正在尝试创建一个触发器,当客户从他们的帐户存款或取款时触发,显示 account_no,交易类型(deposit/withdraw ), 交易金额, 旧余额和新余额:
这里是 table 的代码(我已经创建了):
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;
/
您的创建 table 无效,第一行额外逗号
当您遇到错误时,您可以使用 'show errors' 命令查看它们。
运行 你的代码,我看到了:
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>
你的CASE语句是messed-up你需要把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;
SQLPLUS 触发器编译错误
我是 oracle sqlplus 的新手,我正在尝试创建一个触发器,当客户从他们的帐户存款或取款时触发,显示 account_no,交易类型(deposit/withdraw ), 交易金额, 旧余额和新余额:
这里是 table 的代码(我已经创建了):
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;
/
您的创建 table 无效,第一行额外逗号
当您遇到错误时,您可以使用 'show errors' 命令查看它们。
运行 你的代码,我看到了:
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>
你的CASE语句是messed-up你需要把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;