Я пишу perl-скрипт, который считывает номера социального страхования из файла, ищет информацию в нескольких таблицах и выводит в файл с разделителями. Я пишу на PERL 5 и имею дело с IBM informix. У меня такое ощущение, что проблема в моем REGEX. Я получаю несколько строк следующей ошибки:
Ошибка выполнения DBD::Informix::st: SQL: -1213: Ошибка процесса преобразования символа в числовое в ./corylist.pl, строка 61, строка 461. Ошибка DBD::Informix::st fetchrow_array: SQL: -400: Fetch попытка на неоткрытом курсоре. на ./corylist.pl строка 63, строка 461.
Может ли кто-нибудь подтолкнуть меня в правильном направлении? Спасибо!
while(<IN>) {
$id = $_;
chomp $id;
$id =~ m/^\d{3}-\d{2}-\d{4}$/;
#print "$id\n";
$STMT = <<EOF;
select i.ss_no,
i.fullname, i.firstname,i.lastname,i.addr_line1,i.addr_line2,i.city,i.st,i.zip,r.res_ctry,r.res_cty,
i.phone,NVL(aa.phone," ") cell,NVL(a.line1," ") stuemail,NVL(pa.line1," ") peremail
from id i,
prof r,
outer aa_rec a,
outer aa_rec aa,
outer aa_rec pa
where i.ss_no = $id
and i.id = r.id
and i.decsd <> "Y"
and a.id = i.id and a.aa = "EML" and a.end_date is null
and pa.id = i.id and pa.aa = "OEML" and pa.end_date is null
and pa.beg_date = (select max(beg_date) from aa_rec where aa = "OEML" and id=$id and end_date is null)
and aa.id = i.id and aa.aa = "CELL" and aa.end_date is null
group by ss_no,fullname,firstname,lastname,addr_line1,addr_line2,city,st,zip,res_ctry,res_cty,phone,cell,stuemail,peremail
order by fullname, ss_no
EOF
$sth = $db1->prepare($STMT);
$sth->execute();
while (($id,$fullname,$fname,$lname,$addr1,$addr2,$city,$st,$zip,$ctry,$cnty,$phone,$cell,$stuemail,$peremail) = $sth->fetchrow_array()) {
$x = $id." | ". $fullname." | ";
$x .= $fname." | ".$lname." | ".$addr1." | ".$addr2." | ".$city." | ".$st." | ".$zip." | ".$ctry." | ".$cnty." | ";
$x .= $phone." | ".$cell." | ".$stuemail." | ".$peremail." | \n";
print $out_fh $x;
}
$id
. Вместо этого вы должны использовать заполнитель. И из сообщения об ошибке я бы сказал, что это числовое поле, поэтому вам нужно избавиться от тире. - person simbabque   schedule 13.02.2017$x .= $fname." | ".$lname." | ".$addr1." | ".$addr2." | ".$city." | ".$st." | ".$zip." | ".$ctry." | ".$cnty." | "
можно записать как$x .= "$fname|$lname|$addr1|$addr2|$city|$st|$zip|$ctry|$cnty|"
? - person Borodin   schedule 13.02.2017prepare
выполнять один и тот же оператор каждый раз в циклеwhile
.$sth = $db1->prepare($STMT)
следует вынести за пределы блока. - person Borodin   schedule 13.02.2017prepare
был в петле. Я подумывал предложитьjoin '|', ...
, но ладно. Text::CSV это. - person simbabque   schedule 13.02.2017$id
, спрятанного во всем этом SQL! - person Borodin   schedule 13.02.2017