2017-01-24 1 views
1

Je suis nouveau dans la programmation pl/sql. J'ai une affectation: "Brewbean's veut ajouter une contrainte de vérification sur la colonne QUANTITY de la table BB_BASKETITEM Si un client entre une valeur de quantité supérieure à 20 pour un article, Brewbean veut afficher le message" Vérifier la quantité "à l'écran. A l'aide d'un éditeur de texte, ouvrez le fichier assignment04-06.txt dans le dossier Chapter04. La première instruction, ALTER TABLE, doit être exécutée pour ajouter la contrainte de vérification.L'élément suivant est un bloc PL/SQL contenant une action INSERT qui teste cette Vérifiez la contrainte Ajoutez du code à ce bloc pour intercepter la violation de contrainte de vérification et afficher le message. " J'ai essayé, comme this-erreur non définie gestion des exceptions inpl/sql

set serveroutput on; 
declare 
ex_basket exception; 
pragma EXCEPTION_INIT(ex_basket, -02290); 
BEGIN 
ALTER TABLE bb_basketitem 
    ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20); 
    INSERT INTO bb_basketitem 
    VALUES (88,8,10.8,21,16,2,3); 
exception 
when ex_basket then 
DBMS_OUTPUT.PUT_LINE('Check Quantity'); 
END; 

Je suis le rapport d'erreur comme ceci:

ORA-06550: ligne 5, colonne 1: PLS-00103: Rencontrés le symbole "ALTER" quand attendant un des suivants:

(commencer cas déclarer la sortie pour goto si raise pragma null mod boucle retour mise à jour sélectionnez tout avec

Désolé pour cette question pas cher. J'aimerais quelqu'un qui aide à ce sujet.

Répondre

1

Vous devez comprendre que SQL et PL/SQL sont deux langues différentes. ALTER TABLE est une instruction SQL et non PL/SQL. Vous ne pouvez pas exécuter d'instructions SQL DDL statiques dans un bloc PL/SQL. Cependant, PL/SQL s'intègre facilement dans SQL avec les nombreuses fonctionnalités qu'il fournit. L'une de ces caractéristiques est EXECUTE IMMEDIATE.

, vous devez donc DTO changement yoru être ALTER quelque chose comme ceci:

EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);' 
0

très spécifi avec votre code. Le code ci-dessous suffira à votre problème.

SET serveroutput ON; 
DECLARE 
    ex_basket EXCEPTION; 
    pragma EXCEPTION_INIT(ex_basket, -02290); 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);'; 
    INSERT INTO testab VALUES 
    (88 
    ); 
EXCEPTION 
WHEN ex_basket THEN 
    dbms_output.put_line('Check Quantity'); 
END; 
0

En ce qui concerne la gestion des exceptions, cela se produit lors de l'exécution. Cependant, si vous avez un mot clé non reconnu comme ALTER dans votre code, il ne sera même pas compilé en premier lieu, donc il ne fonctionnera pas du tout. Au lieu de cela, le bloc entier est rejeté comme non valide.

En outre, dbms_output n'est généralement pas un bon choix pour la gestion des exceptions, car il met un message de débogage sur le tampon de sortie et permet au bloc de se terminer avec succès, de sorte que tout script fait partie de que quelque chose a mal tourné. Vous pouvez envisager d'utiliser raise or raise_application_error.