【发布时间】:2021-01-23 02:46:28
【问题描述】:
我正在尝试编写一个触发器,当有人尝试对尚未购买的产品进行评分时会引发错误。我想出了一个查询来获取客户的购买历史:
SELECT nref
FROM CartClient a
INNER JOIN PaidCart b
ON a.idpurchase = b.idpurchase
INNER JOIN CartDetails c
ON b.idpurchase = c.idpurchase
WHERE a.Id = '12345672X'
效果很好。
所以下一个触发器应该检查新评级的产品 (:new.NRef) 是否未被购买,即不是最后一个查询结果的一部分 (NOT IN)。
CREATE OR REPLACE TRIGGER cant_rate
BEFORE INSERT ON Rating
FOR EACH ROW
BEGIN
IF (:new.NRef NOT IN (SELECT nref FROM CartClient a
INNER JOIN PaidCart b
ON a.idpurchase = b.idpurchase
INNER JOIN CartDetails c
ON b.idpurchase = c.idpurchase
WHERE a.Id =:new.Id)) THEN
RAISE_APPLICATION_ERROR(-20603,'Cant rate a not bought product');
END IF;
END;
我得到错误:
“PLS-00103:在期待其中之一时遇到符号“INNER”。
我尝试使用 SELECT INTO 将查询结果存储在一个时间变量中。但是,这是一个多行结果。我能做什么?
【问题讨论】:
-
什么是完整的错误信息?
-
如果您使用的是 11g,11G Forms 不支持 ANSI 标准连接语法。
-
表格? @eshirvana 是什么让您认为它与 Forms 相关?
-
@Littlefoot 只是猜测,根据错误信息
-
嗯,我宁愿以我看到的代码为基础——上面写着
create or replace trigger ...,这意味着它存储在数据库中;它不是表单触发器,所以......我想说你的反对在这种情况下是错误的,@eshirvana。