2016-01-22 10 views
9

この質問で説明する機能は、指定されたSQLスクリプトを実行することです。スクリプトの内容は、アプリケーション実行時にユーザーが定義することを意図しています。スクリプトは、INSERTステートメントまたは複雑なシーケンスPL/SQLステートメントのいずれかにすることができます。入力は実行時(最終的にはStringインスタンス)に利用できるので、Javaを介して実行する必要があります。JavaでのSQLスクリプト実行の一般的な方法

現在のアプローチでは、ユーザ入力をPreparedStatementでラップして実行しています。このソリューションは、既存のテストケースで機能します。主な関心事は、テストによってカバーされない可能性のある使用済みデータベースの全機能、すなわち同じユーザSQLスクリプトをデータベースベンダの提供コンソールに送ることに最も近いソリューションを提供することである。

PreparedStatementで現在のアプローチに想定されている制限はありませんか? Javaを介したSQLスクリプト実行のためのより良い一般的なアプローチはありますか?

+0

あなたは正確に何をしようとしていますか?単純にすべてを実行したいですか?http://sqlfiddle.com/のようなものを作成しようとしていますか? –

+1

ここでセキュリティの脆弱性が懸念されていますか?スクリプトが潜在的に望ましくないまたは危険なことをするのを防ぐための適切な制限がありますか? (例えば、データベースのユーザ特権​​を介して) –

+0

@SteveChambersユーザは自分自身のデータベースを変更し、完全に責任を負うので、脆弱性の懸念はありません。主な関心事は、データベースの全機能を最も効率的な方法で提供することです。 –

答えて

4

まあ、これは幅広い設計の質問ですが、私が行うことができるいくつかのステップがあると思う:

  • SQLスクリプトの解析と認識:あなたはSQLのどのタイプを検出できるようにする必要がありますが、あなたが持っているスクリプト:PL/SQL、DML、DDL、CDL、TCL、 ";"で区切られたマルチパート
  • ステートメントビルド:SQLスクリプトの各タイプについて、javaでステートメントを実行できる必要があります。
  • 結果の解析。関数で返されたSELECTおよびオプションで、影響を受ける/挿入された行の数によって返されるものを収集できる必要があります。
  • エラー処理:期待どおりに動作しなかった場合、SQLスクリプトに何が起こったかを報告する必要があります。

を検討してください:

  • を。これは、SQLクライアントのプログラミングのように思えます。もしあなたが何をしたいのか説明してください。通常のアプリケーションではこれを接続層として使用しないでください。非常に効率が悪く、SQLインジェクションに対して脆弱です(カンマをスキップするだけでははるかに複雑です)
  • 関数を呼び出して、外部パラメータを使ってクエリを実行したいことがあります。
  • これには、構文ハイライトなどのユーザーインターフェイス機能は含まれていません。パラメータインタフェース、等...
+0

@borjab新しいバージョンの質問をご検討ください –

+0

上記の手順の多くで役立つ[オープンソースプロジェクト](https://github.com/jonheller1/plsql_lexer)を構築しました。 SQL * Plusと同様のステートメントを分割して、ステートメントを分類して何をすべきかを知って、不要なセミコロンを削除したり(いくつかのステートメントでは必要ありません)、SQL * Plusに似たフィードバックを提供することができます。 MERGEステートメントの場合は "5 rows merged。")。 PL/SQLのすべてですが、Javaから呼び出すことは可能です。 –

0

頭に浮かぶPreparedStatementの最初の制限 - あなたは、ストアドプロシージャのOUTパラメータ(複数可)を登録することはできません、あなたはCallableStatementインターフェイスに見たいかもしれ。

関連する問題