6
votes

Comment insérer des champs null avec DBD de Perl :: pg?

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> xxx pré>

et si l'entrée est: Strike> P>

DBD::Pg::st execute failed: ERROR:  invalid input syntax for integer: ""


3 commentaires

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.


3 Réponses :


1
votes

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


1 commentaires

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



2
votes

Les cartes de paquet DBI Undef à null . (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.)

Donc, dans votre pendant la boucle , il suffit de vérifier si le champ indiqué est une chaîne vide et Si c'est le cas, faites-le undef à la place: xxx


3 commentaires

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 et avertissements 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 '


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.



5
votes

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

pour mapper des chaînes vides dans @field à Undef


2 commentaires

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.