J'ai une base de données Oracle et une table avec plusieurs colonnes NON NULLL, toutes avec des valeurs par défaut.
Je voudrais utiliser une instruction insertion pour toutes les données que je souhaite insérer et ne vous embauchez pas pour vérifier si les valeurs insérées sont des nuls ou non. P>
Y a-t-il un moyen de revenir à la valeur de colonne par défaut lorsque NULL est inséré? P>
J'ai ce code: P>
INSERT INTO schema.my_table ( pk_column, other_column, not_null_column_with_default_value) VALUES (:pk_column,:other_column, NVL(:not_null_column_with_default_value, DEFAULT) );
5 Réponses :
Comme expliqué dans ce Disktom thread , le mot clé code> par défaut code> ne fonctionnera que comme une expression autonome dans une colonne Insérer et ne fonctionnera pas lorsqu'il est mélangé avec des fonctions ou des expressions telles que NVL.
En d'autres termes, il s'agit d'une requête valide: p> Vous pouvez utiliser une requête dynamique avec toutes les lignes et une variable de liaison ou la valeur par défaut constante si la variable est null. Cela pourrait être aussi simple que le remplacement de la chaîne vous pouviez Requête également la vue : no_null_column_with_default_value code> avec la chaîne
par défaut code> dans votre
$ insérer code>. P>
all_tab_columns code> et utilisez
nvl (: votre_variable,: colonne_default) code>. La valeur par défaut est la colonne
data_default code>. P> p>
Merci pour une suggestion sur Data_Default. Je pense que je vais créer une fonction get_default (: schéma,: table,: colonne) code> qui utilisera le cache Oracle, donc je ne devrai pas être très lent. Je ne devrai que vérifier si le type
@Swilk: Le type trunc (sysdate ) +1 code>)
Interroger le dictionnaire de données pour la valeur par défaut sur chaque insert ruinera définitivement vos performances. Je n'utiliserais que si insérer les performances n'est pas un problème pour votre application.
Je pense que le moyen le plus propre est de ne pas les mentionner dans votre déclaration d'insertion. Vous pouvez commencer à écrire des déclencheurs pour remplir des valeurs par défaut, mais c'est une armure lourde pour ce que vous voulez.
n'est-il pas possible de restructurer un peu votre code d'application? En PHP, vous pouvez construire une déclaration d'insertion propre sans messy si, par exemple. Comme ceci: p>
Et puis "O'Neil" vient comme la valeur et le bum! Cela fonctionnerait réellement si converti sur des variables liées (valeurs). Quoi qu'il en soit, je suis au courant de ce modèle, mais je cherchais une sorte de déclaration Oracle qui ferait le travail. Je pensais que Oracle pourrait avoir une solution prête pour cela.
@Swilk tu as raison. Mon exemple peut facilement être modifié pour utiliser des variables liées. En fait, je viens de le faire.
Je voudrais utiliser un insert déclaration pour toutes les données que je veux insérer et ne vous inquiétez pas de vérifier si Les valeurs insérées sont des nuls ou non. P>
Définissez votre table avec une valeur par défaut pour cette colonne. Par exemple: p>
xxx pré> ou altérer une table existante: p>
xxx pré> maintenant vous (ou quiconque utilise MyTable) ne pas avoir à vous soucier des valeurs par défaut, comme cela devrait être. Sachez simplement que pour cet exemple, la colonne est toujours nullable, alors quelqu'un pourrait explicitement insérer une null. Si ce n'est pas le cas, faites aussi la colonne NULL NULL. P>
EDIT: En supposant que ce qui précède est déjà effectué, vous pouvez utiliser le mot-clé par défaut dans votre relevé d'insertion. Je voudrais éviter les déclencheurs pour cela. P> blockQquote>
Les colonnes ont des valeurs par défaut. La chose est que je veux insérer la valeur par défaut lorsque la variable liée est null. Insérer dans les valeurs TMP_TABLE_TAB (AAA, BBB, CCC) (9, 8, NVL (: my_Value, défaut)) CODE> Résultats dans ORA-00936 Expression manquante. Tandis que
insérer dans les valeurs TMP_TABLE_TAB (AAA, BBB, CCC) (9, 8, par défaut) CODE> exécuterait correctement, il fait autre chose que nécessaire. Je voudrais oublier la valeur de: my_value et utilisez une instruction insertion pour tous les inserts.
OK je comprends maintenant. Malheureusement, vous n'allez probablement pas trouver une solution éloquente pour avoir un insert maître pour toutes les colonnes null ou non. Si vous ne pouvez pas modifier votre insert STMT sur la base duquel les cols sont des nuls, un déclencheur avant l'insertion serait la meilleure chose. N'oubliez pas que si une colonne est modifiée de NO NULL à NULLABLABLE, vous devez également modifier la gâchette pour exclure à l'aide de valeurs par défaut pour cette colonne. (ajoute des frais de maintenance supplémentaires ainsi que des frais généraux de traitement).
La meilleure option pour la performance est la première.
Quoi qu'il en soit, si je comprends, vous ne voulez pas répéter les noms de colonne Insertion et les valeurs en raison du difficile à apporter des modifications. Une autre option que vous pouvez utiliser est d'exécuter un insert avec Renvoie la clause suivie d'une mise à jour: p> Il semble Après cela, vous pouvez rechercher null code> sur
inserted_value code> variable de liaison. Si c'est null, vous pouvez exécuter la mise à jour suivante: p>
Pour ceux qui le lisent maintenant:
dans Oracle 12C Il y a une nouvelle fonctionnalité: Par défaut sur NULL . Par exemple: p> Ainsi, lorsque vous essayez d'insérer NULL dans COL2, cela sera automatiquement 7. P> P>
Pourquoi n'entrez-vous pas de valeur par défaut de la colonne "NOT_NULL_COLUMN_WITH_DEFAULT_VALUE" au lieu du mot "Par défaut" à l'intérieur de la "requête hypothétique"?
Parce que je ne sais pas quelle est la valeur par défaut au moment de l'insertion. Mais commevince Malgrat a suggéré que je puisse chercher cela formulaire all_tab_columns