누군가가 구매하지 않은 제품을 평가하려고 할 때 오류를 발생시키는 트리거를 작성하려고합니다. 클라이언트의 구매 내역을 가져 오는 쿼리가 있습니다.
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를 사용하여 쿼리 결과를 시간 변수에 저장하려고했습니다. 그러나 그것은 다중 행 결과입니다. 내가 뭘 할 수 있니?
그런 접근은 어떻습니까?
CREATE OR REPLACE TRIGGER cant_rate
BEFORE INSERT ON Rating
FOR EACH ROW
DECLARE
l_exists NUMBER(1) := 0;
BEGIN
SELECT MAX(1)
INTO l_exists
FROM dual
WHERE EXISTS (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
AND a.nref = :NEW.nref --> is it "a.nref"?
);
IF l_exists = 0 THEN
RAISE_APPLICATION_ERROR(-20603,'Cant rate a not bought product');
END IF;
END;
참고 "is it a.nref?" -어떤 테이블이 그 nref
열을 소유하고 있는지 결코 말하지 않았 으므로 나는 그것이 있다고 가정했습니다 cartclient
. 필요한 경우 수정하십시오.
시도 할 때 SQL * Plus 또는 SQL Developer에서 실행 한 경우 하위 쿼리에 대한 메시지가 표시됩니다 IF
. 이 같은:
LINE/COL ERROR
--------- -------------------------------------------------------------
2/3 PL/SQL: Statement ignored
2/21 PLS-00405: subquery not allowed in this context
그래서, 당신은 그렇게 할 수 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다