2

AIX スクリプトを Linux に移行しています。特定のスクリプトで

$sql_stmt6 = "SELECT CHAR(DATE(MAX(TIMESTAMP)),USA) FROM SCHEMA.TABLENAME WHERE COL1 = 194 and COL2 ='P'";
$sth6= $dbh1->prepare($sql_stmt6);
$sth6->execute();
while (@rows = $sth6->fetchrow)
{
    $var = $rows[0];
    $var =~ s/\s+$//;
    print "var = $var\n";
}
$sth6->finish();

select が行を返す場合、fetchrow は正常に動作しますが、select が 0 レコードを返す場合、fetchrow は次のエラーをスローします。

エラー: 列 0 のデータが 10 バイトに切り捨てられました。./test.pl 行 46 で最大 -1 バイトが使用可能です。

助けてください...ありがとう...

4

2 に答える 2

0

これを行う標準的な方法は、DBI ドキュメントに示されているように、fetchrow_arrayを使用することです。ドキュメントでは、行が返されない場合の動作を明確に説明しています。

私は何fetchrowがわからない。ドキュメントの例で使用されているのを見ますDBD::DB2が (それがあなたがそれを使用している理由だと思います)、どこにもドキュメント化されていません。私の推測では、これは時代遅れであるか、適切なエラー処理をバイパスする内部関数のいずれかです。fetchrow_array代わりに切り替えてみてください。

その他の重要な考慮事項:

ステートメントを準備して実行するときは、必ずエラーを確認してください。

$sth6 = $dbh1->prepare($sql_stmt6) or die 'Cannot prepare: ' . $dbh1->errstr;
$sth6->execute() or die 'Cannot execute: ' . $sth6->errstr;

必ず

use strict;
use warnings;

まだそうしていない場合( で宣言された変数が表示されないため、疑わしいように見えますmy)。

これらの両方の手順により、エラーの検出がはるかに簡単になります。

また、変数にわかりやすい名前を付けることも大いに役立ちます。この名前$sth6は、コード内に類似した名前の異なるステートメントが少なくとも 6 つあることを示しています。のように意味のある名前を付けると、より明確になります$max_time_sth

于 2013-04-02T11:03:11.147 に答える
0

AIX または Zos データベースへの接続時に同じ問題が発生しました。接続属性を試す必要があります。私にとっては、utf8 に変換された一部の外国文字が、列のサイズを許容サイズよりも長くし、その後fetchrow_array および fetchrow_hash メソッドはエラーをスローします。以下の設定で修正されました。

LongTruncOk         => 1,
LongReadLen         => 2147483647,

DBD::DB2 固有の接続属性も確認する必要がある場合があります。

https://metacpan.org/pod/distribution/DBD-DB2/DB2.pod#Connection-Attributes

于 2014-02-25T14:29:57.950 に答える