Bonjour,

Je cherche à écrire une requête pour me permettre de vérifier l'existence d'une contrainte NOT NULL sur une colonne donnée.

Ma base:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
Je voulais passer par les vues USER_CONSTRAINTS et USER_CONS_COLUMNS avec quelque chose du genre:

Table de test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE TABLE ADA_TEST1
(
  ID NUMBER NOT NULL,
  VAL VARCHAR2(15)
);
Requete:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
SELECT COUNT(*)
FROM USER_CONS_COLUMNS CC
  INNER JOIN USER_CONSTRAINTS C ON (C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME)
WHERE C.TABLE_NAME='ADA_TEST1' 
AND CC.COLUMN_NAME='ID'
AND C.CONSTRAINT_TYPE='C'
AND C.SEARCH_CONDITION like '% NOT NULL';
Ce qui me renvoie une splendide:
ORA-00932: types de données incohérents ; attendu : NUMBER ; obtenu : LONG
En effet la colonne USER_CONSTRAINTS.SEARCH_CONDITION est un LONG...

Un tour sur ask tom, et je vois que:
  1. Il ne faut pas utiliser de LONG (oui mais là je suis innocent)
  2. On peut créer une fonction PL pour faire un SUBSTR()


Avant de créer la fonction PL qui ressemble plus à un palliatif qu'a autre chose, est-ce que quelqu'un verrait un autre moyen de tester l'existence d'une contrainte not null sur un colonne donnée?

Merci