Sql 使用编译错误创建的触发器
我编写此触发器是为了在进行新购买时将数据库中的顶级客户折扣10%:Sql 使用编译错误创建的触发器,sql,oracle,triggers,oracle10g,Sql,Oracle,Triggers,Oracle10g,我编写此触发器是为了在进行新购买时将数据库中的顶级客户折扣10%: CREATE or REPLACE TRIGGER CLIENT_DISCOUNT BEFORE INSERT ON PURCHASE FOR EACH ROW DECLARE CLIENTNO NUMBER(5); BEGIN SELECT (SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL FROM CLIENT, (SELECT CLIEN
CREATE or REPLACE TRIGGER CLIENT_DISCOUNT
BEFORE INSERT
ON PURCHASE
FOR EACH ROW
DECLARE
CLIENTNO NUMBER(5);
BEGIN
SELECT (SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL FROM CLIENT,
(SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 ORDER BY TOTALS.TOTAL DESC).CLIENTNO INTO CLIENTNO;
IF :NEW.CLIENTNO = CLIENTNO THEN
:NEW.AMOUNT = (:NEW.AMOUNT * 0.1);
END IF;
END;
有人能告诉我我做错了什么吗
谢谢,
亚历克斯
更新-错误:
Errors for TRIGGER CLIENT_DISCOUNT:
LINE/COL
--------------------------------------------------------------------------------
ERROR
--------------------------------------------------------------------------------
4/3
PL/SQL: SQL Statement ignored
5/141
PL/SQL: ORA-00907: missing right parenthesis
7/17
PLS-00103: Encountered the symbol "=" when expecting one of the following:
LINE/COL
--------------------------------------------------------------------------------
ERROR
--------------------------------------------------------------------------------
:= . ( @ % ; indicator
8/3
PLS-00103: Encountered the symbol "END"
解决方案:
CREATE or REPLACE TRIGGER CLIENT_DISCOUNT
BEFORE INSERT
ON PURCHASE
FOR EACH ROW
DECLARE
vCLIENTNO NUMBER(5);
BEGIN
SELECT TOPCLIENT.CLIENTNO INTO vCLIENTNO FROM (SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 ORDER BY TOTALS.TOTAL DESC) TOPCLIENT;
IF :NEW.CLIENTNO = vCLIENTNO THEN
:NEW.AMOUNT := (:NEW.AMOUNT * 0.9);
END IF;
END;
/
试一试
我手头没有你的桌子,所以我不能保证我发现了你所有的错误。不过,我可以说: 我不相信你能做选择…客户不。请尝试从…中选择x.CLIENTNO。。。。而是x。 最外层的SELECT没有FROM子句。尝试从DUAL添加,因为此最外层的SELECT不是从任何表中选择的。 PL/SQL赋值运算符为:=,而不是=。要分配给:NEW.AMOUNT,您需要写入:NEW.AMOUNT:=:NEW.AMOUNT*0.1;。 将金额乘以0.1,客户可以享受90%的折扣,而不是10%的折扣。
除了其他人识别的语法错误外,很可能是由于无法从插入的表中进行选择而导致触发器发生变化
如果可以更改数据模型,则可能需要在另一个表中标识顶级客户机,而不是在插入到该表中时尝试选择金额总和购买表问题显示错误描述列表。我添加了SealError Salx的输出,您可能需要考虑命名您的本地变量与您的SQL查询中的表列不同。也许用v_u前缀表示变量,或用l_u前缀表示局部变量。在我看来有点混乱,如果顶级客户频繁更改会发生什么,您如何知道折扣已正确应用。这只是一个学习练习,我遇到了麻烦,因此它不会用于任何生产系统。
CREATE or REPLACE TRIGGER CLIENT_DISCOUNT
BEFORE INSERT
ON PURCHASE
FOR EACH ROW
DECLARE
vCLIENTNO NUMBER(5);
BEGIN
SELECT TOPCLIENT.CLIENTNO INTO vCLIENTNO FROM (SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 ORDER BY TOTALS.TOTAL DESC) TOPCLIENT;
IF :NEW.CLIENTNO = vCLIENTNO THEN
:NEW.AMOUNT := (:NEW.AMOUNT * 0.9);
END IF;
END;
/
CREATE or REPLACE TRIGGER CLIENT_DISCOUNT
BEFORE INSERT
ON PURCHASE
FOR EACH ROW
DECLARE
vCLIENTNO NUMBER(5);
BEGIN
SELECT Z.CLIENTNO INTO vCLIENTNO FROM (SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL FROM CLIENT,
(SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 ORDER BY TOTALS.TOTAL DESC) Z;
IF :NEW.CLIENTNO = vCLIENTNO THEN
:NEW.AMOUNT := (:NEW.AMOUNT * 1.091);
END IF;
END;