2017-02-13 1 views
0

J'ai deux tables comme ci-dessous.Oracle SQL ajouter une contrainte de vérification à plusieurs niveaux de table

créer une table emp (empno varchar2 (5), position varchar2 (5));

créer des informations de table (empno varchar2 (5), nick varchar2 (20)); Empno est la clé primaire pour les deux tables et empno est également une clé étrangère dans info, avec table parent emp.

Maintenant je veux ajouter une contrainte de vérification de sorte que, sauf pour le gm ou catcher (valeur dans la position de la colonne), le pseudo ne doit pas dépasser 16 lettres.

J'ai essayé la méthode UDF comme ci-dessous.

create function checkPos (@empno varchar2(5)) 
returns bit 
as 
begin 
declare @par bit 

select @par = CASE WHEN pos = 'gm' or pos = 'catcher' 
THEN 0 ELSE 1 END 
FROM emp 
WHERE empno = @empno 

RETURN(@par) 
END 

ALTER TABLE info ADD CONSTRAINT info_nick_ck CHECK (checkPos(empno) * length(nick) <16); 

Cependant, cela ne fonctionne pas dans Oracle Live SQL.

Aidez-nous s'il vous plaît. Merci d'avance.

+2

Vous avez dit que vous utilisez Oracle, mais votre code ressemble plus à un code TSQL me – GurV

Répondre

0

Votre code ressemble à du code TSQL.

Essayez cette fonction dans Oracle:

create function checkPos (p_empno varchar2) 
return number 
as 
    v_par number := 0; 
begin 
    select case 
      when pos = 'gm' 
       or pos = 'catcher' 
       then 0 
      else 1 
      end into v_par 
    from emp 
    where empno = p_empno; 

    return v_par; 
exception 
    when no_data_found then 
     dbms_output.put_line('No data found'); 
     -- Do something about it 
end; 
/
+0

Salut GurV, merci pour votre réponse. Je suis un new-hand et j'ai écrit l'UDF après avoir lu quelques questions et réponses précédentes. Je ne savais pas que c'était TSQL. Pardon. J'ai essayé votre conseil, mais l'oracle live sql me disait toujours des erreurs: FUNCTION CHECKPOS PLS-00103: Rencontré le symbole "ALTER" ". Des idées? –

+0

Je l'ai testé sur livesql. Avez-vous ajouté la barre oblique à la fin de la fonction? – GurV

+0

Ma faute. Je vous remercie! Après avoir ajouté la barre oblique, la fonction a fonctionné. Toutefois, l'instruction de vérification de contrainte "ALTER TABLE info ADD CONTRAINT info_nick_ck CHECK (checkPos (empno) * longueur (pseudo) <16);" donne une erreur en disant "ORA-00904:" CHECKPOS ": identifiant invalide". Pourquoi? Je vous remercie beaucoup pour votre aide! –