J'ai les tables suivantes:
CREATE OR REPLACE TRIGGER review_check_validity AFTER INSERT ON review FOR EACH ROW BEGIN SELECT testing_start FROM testing WHERE driver_no = :new.driver_no; SELECT vehicle_id FROM testing WHERE driver_no = :new.driver_no; IF :new.review_date < testing_end THEN raise_application_error(-20000, 'Review date cannot be before testing end date'); END IF; IF :new.vehicle_id != vehicle_id THEN raise_application_error(-20000, 'Driver has never driven this vehicle'); END IF; END; /
3 Réponses :
Je pense que vous devriez avoir une clause dans vos extratures sélectionnées. J'ai ajouté des notes dans votre requête pour essayer de vous aider à le nettoyer.
CREATE OR REPLACE TRIGGER review_check_validity AFTER INSERT ON review FOR EACH ROW -- Need to declare variables for usage in your SELECT fetches. DECLARE var_revdate number; -- or date, if applicable var_revvehi number; -- or varchar(n), if applicable BEGIN -- In here you should have an INTO clause to assign your date parameter into -- the predefined variable. As well, you need to ensure this fetch will provide -- only one row. SELECT testing_start INTO var_revdate -- why are you fetching "testing_start"? FROM testing WHERE driver_no = :new.driver_no; -- Same case, it can only retrieve one row. If you need to do more than one row, -- you may need to use a BULK & a LOOP. SELECT vehicle_id INTO var_vehicid FROM testing WHERE driver_no = :new.driver_no; IF :new.review_date < testing_end THEN raise_application_error(-20000, 'Review date cannot be before testing end date'); END IF; IF :new.vehicle_id != var_vehicid THEN raise_application_error(-20000, 'Driver has never driven this vehicle'); END IF; END; /
Je réorganiserais la logique ici et:
dans Oracle Pl / SQL, qui inclut le code de déclenchement, vous ne pouvez pas simplement tout aussi important, lorsque vous Enfin, votre structure de table permet de multiples tests du même véhicule par le même pilote. Si elle devrait em> laisser cela, alors la table SELECT CODE>. Vous devez
SELECT dans CODE> une variable. Ensuite, vous pouvez utiliser la variable dans votre logique. P>
Sélectionnez dans CODE> une variable La requête ne peut renvoyer qu'un seul résultat. Plusieurs lignes déclencheront l'erreur que vous avez rencontrée. P>
code> doit être un lien vers la table code> Test code> par
test_id code> plutôt que
pilote_no code> et
véhicule_id code>. p> p>
Il y a quelques erreurs dans votre code:
dans pl / sql Select Les requêtes doivent avoir un Vous recherchez dans la table de test avec le seul Donc, votre code de déclenchement peut être ré-écrit comme suit: p> acclamations !! p> p> p> dans la clause code> où les données récupérées à partir de la requête SELECT sont stockées dans certaines variables. - Cette partie manque dans votre code p> li>
driverno code>, qui vous donnera tous les enregistrements de ce
driverno code> (tous les véhicules testés par cela < code> driveno code>). Vous devez inclure
véhiculeID code> avec
driverno code> pour aller chercher les détails des tests pertinents à l'examen actuel. p> li>
ul>
Tout d'abord, vous choisissez de revenir à une variable. - oraclettorial.com/plsql-storial/plsql-select-intOntO/a > En outre, si vos requêtes renvoient plus d'une ligne, vous ne pouvez pas faire cela.
Que se passe-t-il si un conducteur examine ou teste le même véhicule plusieurs fois?
@Gordonlinoff L'hypothèse est que le pilote ne teste pas la même voiture deux fois. Certes, ce n'est pas une hypothèse réaliste, mais c'est l'une des contraintes qui m'ont donné dans la question.