4

コンテクスト

インストールスクリプトを変更して、独自のSQLクライアントであるsqlplus(oracle)とosql(msft)ではなく、antの「sql」タスクとjdbcを使用します。

更新:コンテキストを追加しました。「ベースデータ」(シードデータ)は、「ベンダーニュートラル」(つまり、oracleとmssqlの両方で機能する)SQLステートメントを含む.sqlファイルのコレクションで構成されています。

問題

スクリプトは正常に実行されますが、1つの例外があります。

このSQLはOracleで失敗します。具体的には、何か(antまたはjdbcドライバー)は、ダッシュ/ハイフンが文字列に埋め込まれている場合でも、「コメントの始まり」として扱います。同じSQLがant/sqlとmicrosoftのjdbcドライバーで正常に機能することに注意してください。

INSERT INTO email_client (email_client_id,generated_reply_text) VALUES(100002,'----- Original Message -----');

関連するバグ

このアリのバグは問題を特定しているようです。それはまだ開いているので(8年後)、私はすぐに修正されることを望んでいません。ただし、問題はOracleでのみ発生するため、ドライバにある可能性があります。

oracleドライバー:jdbcシンドライバー、バージョン10.2.0.1.0

質問

誰かがmssqlとoracleの両方で機能する回避策を持っていますか?(たとえば、問題のある行を変更してエスケープ文字を定義しますか?「挿入」sql92構文に「エスケープ」が表示されません)

ありがとう

4

2 に答える 2

5

「SQLExec」ソースを表示して詳細ログを有効にした後、回避策を見つけました。

回避策

SQL ステートメントに「--」を含む文字列が含まれている場合は、区切り文字 (セミコロン) を次の行に配置します。

これは失敗します

INSERT INTO email_client (email_client_id,generated_reply_text) VALUES(100002,'----- Original Message -----');

これは成功する

セミコロンは別の行にあることに注意してください

INSERT INTO email_client (email_client_id,generated_reply_text) VALUES(100002,'----- Original Message -----')
;

詳細

詳細ロギングを有効にすると、Ant が問題のある sql ステートメントに遭遇したとき、実際には一度に 3 つの sql ステートメントが jdbc ドライバーに渡されたことがわかりました。問題のあるステートメント、次のステートメント (埋め込みの '--' も含む)、および後続のステートメント (埋め込みの '--' を含まない)。

Ant のコードをざっと見てみましたが、明らかなエラーは見当たりませんでした。Ant にパッチを当てるつもりはなかったので、回避策を探しました。

それを微調整すると、「--」が埋め込まれたステートメントの区切り文字(セミコロン)を次の行に移動するだけで、スクリプトが正常に実行されることがわかりました。

体重を測ってくれてありがとう

于 2012-09-18T19:33:11.963 に答える
0

これを試すことができます:

INSERT INTO email_client (email_client_id,generated_reply_text)
VALUES(100002,LPAD('-',5,'-') || ' Original Message ' || LPAD('-',5,'-'));
于 2012-09-18T04:25:46.210 に答える