У меня есть сценарий Perl, вставляющий данные в Пост-ГРЭС согласно файлу разделенного текста канала. Иногда, поле является пустым (как ожидалось). Однако Perl превращает это поле в пустую строку, и Пост-ГРЭС вставляет сбои оператора.
Вот отрывок кода:
use DBI;
#Connect to the database.
$dbh=DBI->connect('dbi:Pg:dbname=mydb','mydb','mydb',{AutoCommit=>1,RaiseError=>1,PrintError=>1});
#Prepare an insert.
$sth=$dbh->prepare("INSERT INTO mytable (field0,field1) SELECT ?,?");
while (<>){
#Remove the whitespace
chomp;
#Parse the fields.
@field=split(/\|/,$_);
print "$_\n";
#Do the insert.
$sth->execute($field[0],$field[1]);
}
И если вход:
a|1 b| c|3
Править: Используйте этот вход вместо этого.
a|1|x b||x c|3|x
Это перестанет работать в b|
.
DBD::Pg::st execute failed: ERROR: invalid input syntax for integer: ""
Я просто хочу, чтобы это вставило пустой указатель на field1 вместо этого. Какие-либо идеи?
Править: Я упростил вход в последнюю минуту. Старый вход на самом деле заставил его работать по некоторым причинам. Таким образом, теперь я изменил вход на что-то, что сделает сбой программы. Также обратите внимание, что field1 является nullable целочисленным типом данных.
Я не уверен, что вы проверили, работают ли ваш вставленный код и данные вместе с Perl 5.10.1, DBD :: Pg 2.15.1 и Postgres 8.4. Также вы должны использовать строгие и предупреждения и не полагаться на область пакета для ваших переменных.
Если вы измените свой код и данные для использования трех или более полей, оставив нетерминальное одно пустым, вы можете вызвать ошибку из DBD :: Pg. Добавьте такую строку в свой код перед выполнением подготовленного оператора:
map { $_ eq '' and $_ = undef } @field;
Сопоставить пустые строки в @field с undef
Пакет DBI преобразует undef
в NULL
. (Логика Perl определенности и ложности на самом деле очень хорошо подходит для троичной логики SQL.)
Итак, в вашем цикле while
просто проверьте, является ли указанное поле пустой строкой, и если поэтому сделайте вместо него undef
:
while (<>){
...
#Parse the fields.
@field=split(/\|/,$_);
if ( $field[1] eq '' ) {
# handle NULLs
$field[1] = undef;
}
#Do the insert.
$sth->execute($field[0],$field[1]);
}
undef
обычно отображается в NULL. Похоже, вы вставляете пустую строку, которая отличается от undef
.