2
sub loadFileRecon {
    my $self = shift;
    my $days = shift;
    if($days eq '') {
        $days = 1;
    }
    my $insert = $self->{rba}->rbdb->prepare(q{
        insert into rba.filerecon (
            filename,
            records,
            start_dtm,
            file_type,
            managed_file_id,
            mf_dtm,
            processed_tidemark,
            mm_records,
            mm_dropped,
            mm_erred,
            mm_duplicate,
            file_source
        )
        select
            i.filename,
            i.records,
            i.file_dtm start_dtm,
            i.file_type,
            mf.managed_file_id,
            mf.created_dtm mf_dtm,
            NULL,
            i.orig_records,
            i.dropped,
            i.erred,
            i.duplicate,
            i.file_source
        from rba.mmfilestats i, managedfile mf, filelog fl
        where
            i.filename = fl.file_name and
            trunc(i.file_dtm) = trunc(sysdate - ?) and
            mf.managed_file_id = fl.managed_file_id
    }) or die $DBI::errstr;
    $insert->execute($days);
    $insert->finish;
    $self->{rba}->rbdb->commit;
    my $update = $self->{rba}->rbdb->prepare(q{
        update rba.filerecon fr
        set processed_tidemark = (
            select processed_tidemark
            from jobhasfile j
            where j.managed_file_id = fr.managed_file_id
        )
        where
            trunc(start_dtm) = trunc(sysdate - ?) and
            processed_tidemark is null
    });
    $update->execute($days);
    $insert->finish;
    $self->{rba}->rbdb->commit;
}

テーブルまたはビューが存在しないために上記の準備ステートメントが失敗した場合、perl モジュールに値を返す必要があります。

4

3 に答える 3

1

prepareがfalseを返す場合、プログラムを終了するように指示しています。

   }) or die $DBI::errstr;

それをあなたが探しているものに置き換えてください:

   }) or return $somevalue;

またはor完全に削除して、ステートメントハンドルの値を確認してください。

   my $insert = $self->{rba}->rbdb->prepare(q{       
      ...
   });
   return $somevalue if ( !$insert ); 
于 2012-12-15T15:54:52.927 に答える
0

あなたがする必要があるのは、DBI::errstr を返すことです。エラーで死なないでください。したがって、次のようなことを行います(準備から始まり、場所で終わりますが、「または死ぬ」を取り除きます):

    ...prepare( ......

    where
        i.filename = fl.file_name and
        trunc(i.file_dtm) = trunc(sysdate - ?) and
        mf.managed_file_id = fl.managed_file_id
    });

    if ($DBI::errstr) {
        # oops something is wrong
        print $DBI::errstr;
        call_error($DBI::errstr);
    }

幸運を

于 2012-12-18T11:42:23.807 に答える
0

エラーログの投稿は、準備の時点ではなく実行の時点でエラーが発生したことを示しています。したがって、実行後に行うことは次のとおりです。

    #your execute statement first
    $insert->execute($days);
    #Now the check on the execute
    if ($DBI::errstr) {
       # oops something is wrong
       return -1;
    }

これがうまくいくかどうか教えてください

于 2012-12-23T10:40:00.787 に答える