J'ai un script Perl insérant des données dans Postgres selon un fichier texte délimité de tuyau. Parfois, un champ est null (comme prévu). Cependant, Perl rend ce champ dans une chaîne vide et l'instruction Postgres Insert échoue.
Voici un extrait de code: p> et si l'entrée est:
Strike> P> DBD::Pg::st execute failed: ERROR: invalid input syntax for integer: ""
3 Réponses :
Undef code> est généralement en mesure de null. On dirait que vous insérez la chaîne vide qui n'est pas la même que
undef code>. P>
Ceci est vrai pour Oracle Trop {Null Maps to Undef} Cela me prend une longue recherche de trouver et mon code sera plus simple à cause de vous merci
Les cartes de paquet DBI Donc, dans votre Undef code> à
null code>. (La logique de la Ness de la Ness Vse de Perl contre le fusionS est une très bonne ajustement pour la logique trinatrice de SQL.)
pendant la boucle code>, il suffit de vérifier si le champ indiqué est une chaîne vide et Si c'est le cas, faites-le
undef code> à la place: p>
votre si n'est jamais vrai, et si vous mettez l'utilisation stricte; utiliser des avertissements; Sur votre code, vous obtenez «Utilisation de la valeur non initialisée $ DOAD [1] dans String eq '
@james, je ne suis pas sûr de ce que vous voulez dire. Cela fonctionne bien avec strict code> et
avertissements code> activé et le conditionnel réussit.
Perl -mstrict -Mwarnings -MData :: Dumper -Le 'My $ str = "A | B || D"; mon @a = Split / \ | /, $ str; Si ($ A [2] EQ "") {$ a [2] = undef; }; Imprimer Dumper \ @a ' code>
Cela fonctionne maintenant, mais comme la question a été posée à l'origine (et comme vous l'avez répondu), il n'y avait que 2 champs et le champ vide était à la fin, renvoyant UNDEF pour cet index.
Je ne suis pas sûr que vous avez testé si votre code collé et vos données ensemble, ils fonctionnent avec Perl 5.10.1, DBD :: PG 2.15.1 et Postgres 8.4. Vous devez également utiliser des stricts et des avertissements et ne pas compter sur l'emballage de vos variables.
Si vous modifiez votre code et vos données pour utiliser trois champs ou plus, laissant une erreur non terminale vide, vous pouvez alors déclencher l'erreur de DBD :: pg. Ajoutez une ligne comme celle-ci à votre code avant d'exécuter l'instruction préparée: p> pour mapper des chaînes vides dans @field à Undef P> P>
Cela a pris soin de convertir les chaînes vides en nulls. Il est étrange que la suppression d'un champ dans l'entrée a provoqué la chaîne vide pour devenir null (au moins que ce qui semble être arrivé).
Si une chaîne se termine dans les personnages que vous divisez, comme 'A | 4 |' Ensuite, l'élément de tableau final ne s'éloigne pas du tout, non transformé en une chaîne vide, il est donc indéfini, voir Perldoc -f Split.
Ce code fonctionne ici, Perl 5.10.1, DBD :: pg 2.15.1, Postgres 8.4. Aussi pourquoi utilisez-vous SELECT?,? au lieu de valeurs (?,?)?
Aussi, utiliser strict; utiliser des avertissements; et corrigez vos déclarations variables
À propos du format SQL..Le code réel a des jointures sur cette sélection.