Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/10/2011, 16h31   #1
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
Par défaut Vérifier l'existence d'une contrainte NOT NULL

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:
Citation:
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 :
1
2
3
4
5
CREATE TABLE ADA_TEST1
(
  ID NUMBER NOT NULL,
  VAL VARCHAR2(15)
);
Requete:
Code :
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:
Citation:
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
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 16h39   #2
Membre régulier
 
Inscription : septembre 2008
Messages : 84
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 84
Points : 88
Points : 88
Bonjour,

Pourquoi ne pas utiliser ceci :
Code :
1
2
3
4
5
6
 
SELECT *
  FROM SYS.ALL_TAB_COLUMNS C
 WHERE C.TABLE_NAME = 'ADA_TEST1'
   AND C.COLUMN_NAME = 'ID'
   AND C.NULLABLE = 'Y'
spdev666 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/10/2011, 16h40   #3
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Vous pouvez passer par la vue user_tab_columns :

Code :
1
2
3
4
 
SELECT *
  FROM user_tab_columns c
 WHERE c.nullable = 'N'
Edit : grillé
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/10/2011, 16h43   #4
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
mwarf, l'art de chercher midi à 14h

Merci
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 17h16   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
C'est moitié de la solution
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> CREATE TABLE ADA_TEST1
  2  (
  3    ID NUMBER NOT NULL,
  4    VAL VARCHAR2(15) constraint chk_ada_test1_val CHECK (val IS NOT NULL)
  5  )
  6  /
 
TABLE created
SQL> SELECT c.TABLE_NAME, c.TABLE_NAME, c.NULLABLE
  2    FROM user_tab_columns c
  3   WHERE c.nullable = 'N'
  4     AND c.TABLE_NAME = 'ADA_TEST1'
  5  /
 
TABLE_NAME                     TABLE_NAME                     NULLABLE
------------------------------ ------------------------------ --------
ADA_TEST1                      ADA_TEST1                      N
 
SQL> INSERT INTO ada_test1 VALUES (1, NULL);
 
INSERT INTO ada_test1 VALUES (1, NULL)
 
ORA-02290: violation de contraintes (MNI.CHK_ADA_TEST1_VAL) de vérification
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 17h38   #6
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
C'est intéressant ça, je ne savais pas que le 'NOT NULL' après une colonne n'était pas strictement équivalent à une contrainte CHECK not null, au niveau du dictionnaire.

Mais du coup, c'est la piste esquissée dans ma requête initiale qui semble répondre aux deux cas.

Ce qui veux dire que je suis obligé de cast le LONG en VARCHAR avec une fonction en PL, en utilisant la méthode expliquée dans le lien de mon premier post...

C'est dommage, je ne trouve pas ça très "propre".

Merci mnitu en tout cas
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 08h36   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Lisez cet excellent article "working with long columns" et profitez de la coïncidence.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/10/2011, 09h57   #8
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
En effet, belle coïncidence!

Merci pour l'article

Finalement, c'était moins trivial que ce que je pensais, et si je n'avais pas oublié l'existence de user_tab_columns.nullable, je n'aurais jamais vu que cela ne fonctionnait pas tout le temps.

Encore merci
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h06.


 
 
 
 
Partenaires

Hébergement Web