2

SAP HANA のコマンドライン ツールである hdbsql に接続する perl スクリプトを作成しました。SAP Hana に対する Hdbsql は、Oracle に対する sqlplus と同じです。

バックティックを使用して hdbsql で SQL クエリを実行しています。クエリの結果を配列にキャプチャしています。以下は、この操作を実行するコードの一部です。

my $sql_statement = 'SELECT some_column FROM some_table WHERE  
                     some_condition';

my $hdb_sql = "/PROGRA~1/sap/hdbclient/hdbsql.exe";

my $connection = "-i 11 -n 100.450.10.20:31115 -u myUser -p myPwd -j -F   
                  \"|\"";

my @queryResults = `$hdb_sql $connection $sql_statement`;

ここで私は問題に直面しています。クエリが正常に実行されると、hdbsql の戻りコードは 0 になり、戻りコードは perl 変数 "$?" に格納されます。もゼロです。しかし、エラーの場合、これは私が観察したものです:

クエリにいくつかの構文の問題がある場合、次のエラー メッセージが表示されます。

* 257: sql syntax error: incorrect syntax near "SELECTS": line 1 col 1 (at 
pos 1) SQLSTATE: HY000

上記のメッセージから、Hana sql エラー コードは 257 であることがわかります。しかし、perl 変数 "$?" を出力すると。エラー/リターン コードとして 256 が返されます。

同様に、

  • 無効な列名の場合、hana sql エラー コードは 260 ですが、perl リターン コードは 1024 です。
  • 集計またはグループ化が欠落している場合、hana sql エラー コードは 276 ですが、perl リターン コードは 5120 です。
  • 関数の引数の数が間違っている場合、hana sql エラー コードは 316 ですが、perl リターン コードは 15360 です。
  • 無効なテーブル名の場合、hana sql エラー コードは 259 ですが、perl リターン コードは 768 です。

等々...

エラーコードが「$?」と表示されるのはなぜですか? 実際のhana sqlリターンコードとは異なりますか? 私のスクリプトでは、実際のハナ エラー コードを出力したいと考えています。Perl で行うにはどうすればよいですか。2 つのコード間に数学的な関係はありますか?

バックティックの使用に熱心であることを述べなければなりません。system() 、 perl pipe に切り替えたり、perl DBI またはその他のモジュールを使用して hdbsql クエリを起動したりしたくありません。

このフォーラムで同様の質問がいくつかありましたが、私の場合はほとんど役に立ちませんでした。

コメント/回答に感謝します。ありがとうございました!!!!

4

1 に答える 1

2

$?は通常 256 の倍数です。参照してください(ただし、これはバッククォートperldoc -f systemの後の代入にも適用されます)。$?wait

(exitおよびPOSIX::_exit) 関数は、0 ~ 255 の範囲の入力を想定しています。これはオペレーティング システムの規則であり、Perl の制限ではありません。その範囲外の引数を渡すと、Perl またはオペレーティング システムはそれを呼び出したものとして扱いますexit($arg % 256)

exitだから、hana sql がsql エラー コードでシステム コールを行っていると思います。通常、このエラー コードは 255 より大きいため、オペレーティング システムに反映される終了コードはhana error code % 256.

Perl がこのエラー コードを受け取り、 に値を割り当てると、$?その値に 256 を掛けます (「 」をperldoc -f system参照)。そのため、hana SQL コード と の関係は、$?おそらく次のようになります。

 $? = (<hana-sql-code> % 256) * 256

またはもっと衒学的に

 $? = (<hana-sql-code> & 255) << 8
于 2013-09-06T17:49:54.017 に答える