12
votes

Insérez la valeur par défaut lorsque NULL est inséré

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) );


2 commentaires

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


5 Réponses :


3
votes

Comme expliqué dans ce Disktom thread , le mot clé par défaut 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: xxx

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 : no_null_column_with_default_value avec la chaîne par défaut dans votre $ insérer .

vous pouviez Requête également la vue all_tab_columns et utilisez nvl (: votre_variable,: colonne_default) . La valeur par défaut est la colonne data_default .


3 commentaires

Merci pour une suggestion sur Data_Default. Je pense que je vais créer une fonction get_default (: schéma,: table,: colonne) qui utilisera le cache Oracle, donc je ne devrai pas être très lent. Je ne devrai que vérifier si le type peut être converti en d'autres types sans problèmes.


@Swilk: Le type est l'ancien clob. Ce n'est que du texte et devrait être converti en une chaîne. Dans votre requête, vous devriez Remplacer par défaut par la valeur de cette colonne, et non lier la valeur car la valeur par défaut peut être une expression (telle que trunc (sysdate ) +1 )


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.



1
votes

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: xxx


2 commentaires

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.



0
votes

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.

Définissez votre table avec une valeur par défaut pour cette colonne. Par exemple: xxx

ou altérer une table existante: xxx

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.

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.


2 commentaires

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)) 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) 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).



1
votes

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: xxx

Il semble fonctionne avec PHP .

Après cela, vous pouvez rechercher null sur inserted_value variable de liaison. Si c'est null, vous pouvez exécuter la mise à jour suivante: xxx


0 commentaires

16
votes

Pour ceux qui le lisent maintenant:

dans Oracle 12C Il y a une nouvelle fonctionnalité: Par défaut sur NULL . Par exemple: xxx

Ainsi, lorsque vous essayez d'insérer NULL dans COL2, cela sera automatiquement 7.


0 commentaires