3

DBI モジュールを使用し、Sybase DB に接続する Perl スクリプトを作成しています。ストアド プロシージャ (アクセスできないため、サンプル コードを投稿できません) を呼び出しています。データを取得すると、「error_handler: データ変換によりオーバーフローが発生しました」というエラーが表示されます。私はまだデータを取得しており、集中的な調査を行った後、列の一部のデータ型 (BigInt、nvarchar など) が原因のようです。問題は、どうすればこれを修正できるかということです。これはクライアント側で修正できますか、それともサーバー側でのみ修正できますか?

my $dbh = DBI->connect("DBI:Sybase:server=$server", $username, $password, {PrintError => 0}) or die;
$dbh->do("use $database") or die;
my $sql = &getQuery;
my $sth = $dbh->prepare($sql) or die;
$sth->execute() or die;
while ($rowRef = $sth->fetchrow_arrayref) #Error seems to occur here
{
     #Parse through each row
}

問題を説明する FreeTDS 0.82 ログの一部:

_ct_bind_data(): column 7 is type 38 and has length 8
_ct_get_server_type(0)
_ct_get_client_type(type 38, user 0, size 8)
cs_convert(0x18dfed40, 0x7fff73216050, 0x18e44250, 0x7fff73215fa0, 0x18e387c0, 0x18e45a64)
_ct_get_server_type(30)
_ct_get_server_type(0)
converting type 127 (8 bytes) to type = 47 (9 bytes)
cs_convert() calling tds_convert
cs_convert() tds_convert returned 10
cs_prretcode(0)
cs_convert() returning  CS_FAIL
cs_convert-result = 1
4

1 に答える 1

2

問題は FreeTDS 側にあります。私は以前に同じ問題を抱えていましたが、返されたフィールドをステートメントに変換することで問題を解決しvarcharました。select

元のクエリを変更するアクセス権がない場合は$sql、コードで返された変数に対して正規表現検索と置換を実行できます。特に、元のクエリに次のような部分がある場合

SELECT field1, field2, field3 FROM ...

クエリステートメントを取得したら、実行できます

my $new_sql;
if ($sql =~ /SELECT\s+(.*)\s+FROM/i) {  # match selected field string
    my $field_str = $1;
    my @fields = split ",", $field_str; # parse individual fields
    map s/\s//g, @fields;               # get rid of spaces
    my $new_str = join ", ", (map {sprintf "convert(varchar, $_)"} @fields);    # construct new query string
    my $quoted_field_str = quotemeta($field_str);   # prepare regex replacement string
    $new_sql = $sql;    
    $new_sql =~ s/$quoted_field_str/$new_str/i  # actual replacement
}
print $new_sql;

もちろん、元のステートメントがより複雑な場合は、それを印刷して、同じ精神を持つ一般的な置換でどのように変更するかを確認する必要があります。または、DBA (またはストアド プロシージャにアクセスできる人) に、実際のクエリを直接変更するよう依頼することもできます。

お役に立てれば。

于 2011-08-11T16:05:03.343 に答える