問題タブ [callable-statement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1062 参照

java - CallableStatement でのパフォーマンスの低下

Oracle シン データベース ドライバと CallableStatement を使用して Java プログラムから呼び出している Oracle 11g のストアド プロシージャがあります。このストアド プロシージャは、同じ接続のループで何千回も呼び出されます。

最初の 10 ~ 20 回のcallableStatement.execute()呼び出しでは 200 ミリ秒未満で呼び出しが返されますが、時間の経過とともにパフォーマンスが低下し始めます。200 回の呼び出しの後、callableStatement.execute()現在 600 ミリ秒かかっており、劣化が続いています。

定期的に接続を閉じると、実行時間は通常の 200 ミリ秒未満の範囲に戻ります。ドキュメントには CallableStatements がキャッシュされていないと記載されていますが、JDBC 接続で何かが正しくキャッシュされていないことは明らかです。

C プログラムで Oracle OCI ドライバーを使用して同じストアド プロシージャを実行すると、パフォーマンスの低下は見られず、200 ミリ秒未満で継続的に戻ります。

この動作に気付いた人はいますか、または Java の回避策について考えていますか?

編集: これは、何度も実行されるコードのセクションです。接続は共有され、ループごとに CallableStatement が作成されます。CallableStatement がキャッシュされている場合は改善されません。

0 投票する
0 に答える
875 参照

java - 列に RAW データ型を持つ Oracle テーブルを Java JDBC コードにマップする方法は?

列に RAW データ型を持つ Oracle テーブルを Java JDBC コードにマップする方法は?

以下のように試しましたが、DBに到達すると値が変更されます。

DBに格納された値は次のようになります581F0A15DBB6C27F003F6F26C6A319A5

これと同じ値が上記の Java コードで変換されます3538314630413135444242364332374630303346364632364336413331394135が、DB は581F0A15DBB6C27F003F6F26C6A319A5.

0 投票する
3 に答える
3713 参照

stored-procedures - CallableStatement は本当に SQL インジェクションの影響を受けないのでしょうか?

同じボックスで複数の SQL Server データベースと通信する Java アプリケーションがあります。これらのデータベースの数と名前はさまざまです。概して、CallableStatement を使用したスト​​アド プロシージャのみを使用して、データベースにアクセスします。SQL インジェクションの回避とバインド変数の使用については、非常に優れています。

唯一の懸念事項は、データベース名自体が次のように CallableStatement に渡す SQL に連結されることです。

procName は、テンプレート メソッド パターンを使用して子クラスにハードコードされるため、文字列の安全性が保証されます。

dbName は外部で定義されます。dbName をあらゆる種類のパターンに設定して、構文をエスケープし、開発環境でこれを利用しようとしましたが、成功しませんでした。

次のSQL呼び出しを生成するために、次のように設定しました(無実を保護するためにテーブルとprocの名前が変更されました)。

になる

になる

結果はまだ行がありますIncorrect syntax near ')'.poor_victim_tableを使用しましたがtruncate table、機能しない場合は、シンプルに切り替えてセキュリティ設定を除外しました。drop tabledrop databasedelete

バインド パラメーターを受け取る proc を使用すると、予期されるパラメーターの数とThe index 1 is out of range..

になる

すべての道路で実行時エラーが発生するようで、SQL が実行されません。もちろん、これは素晴らしいことです。しかし、成功できないために失敗していることを確認したいのですが、正しい組み合わせを試していないために失敗していないことを確認したいと思います。

一般的な意見/都市伝説は、ストアド プロシージャを使用すると SQL インジェクションの影響を受けなくなるというものですが、セキュリティに関しては、そのような絶対的なステートメントを信頼したくありません。

これをしばらく調査した後、私が思いついたのは、次のスタックオーバーフローの質問です。. procコード自体が入力パラメータから動的SQLを作成しない限り、 SQLインジェクションから保護するため、CallableStatementの使用をサポートしているようです。

そこで、コミュニティへの私の質問は、proc 内の SQL コードが安全であると仮定すると、JDBC で CallableStatement を使用すると SQL インジェクションを本当に防ぐことができるのでしょうか? または、SQL Server ドライバーはそれを防ぐ方法で文字列を解析しますが、他のドライバーはそうしない可能性がありますか? それとも私の努力が足りないのでしょうか?

安全である場合、その保証はどのように行われますか? { call blah(?) }実際の SQL ではなく、SQL に変換されるusing の抽象的な構文が原因ですか?

0 投票する
2 に答える
1117 参照

java - CallableStatement arrayindexoutofbound

私はSQLユーティリティクラスのCallableStatementを試していましたプロシージャはDBで正常に実行されていますが、配列インデックスの範囲外エラーが発生しましたデバッグしようとしましたが、callablestatementの構文に何か問題があるようです

これは私が受け取るエラーです

0 投票する
1 に答える
2248 参照

mybatis - myBatis 呼び出し可能ステートメント - Java 日付の問題

mybatis-3.1.1 を使用していましたが、次のコードに問題はありませんでした。

DAO の実装

マッパー

マッパー XML。

mybatis-3.2.5 にアップグレードすると、Oracle プロシージャに DATE として null が渡されます。

これで私を助けてもらえますか?マッパー XML を更新して、正しく解析するように指示する何かを含める必要があるかどうかはわかりません。

Javaでjava.util.Dateを使用しています。

ありがとうチラグ

0 投票する
1 に答える
442 参照

sql - JDBCは関数を使用してINSERTステートメントを実行します

JDBC を使用して、句INSERTにユーザー定義の PL/SQL 関数を含むステートメントを実行する方法は?VALUES

使用する必要がありますprepareStatement()か?callablestatement()

0 投票する
1 に答える
6590 参照

java - refカーソルの戻り値の型でストアドプロシージャを呼び出すJava

ストアド プロシージャから参照カーソルを返そうとすると、常にjava.sql.SQLException: Bigger type length than Maximumエラーが発生するという問題が発生しています。

参照カーソルとして出力変数を 1 つだけ持つ非常に単純なストアド プロシージャがあります。ref_cursor は、WS_SEARCHTEST という名前の Oracle パッケージで型参照カーソルとして定義されています。

私の手順:

簡単なクエリを実行し、データベースで確認したため、接続が機能していることはわかっています。私のJavaコードでは、次のことを行います。

私も試しました:

ただし、結果セットにアクセスしようとすると、常に java.sql.SQLException: Bigger type length than Maximum が発生します。

ありがとう

0 投票する
2 に答える
3203 参照

java - 「'{' 付近の構文が正しくありません」SQL Server ストアド プロシージャの呼び出し

ストアド プロシージャから結果を取得しようとしていますが、取得していERROR: Incorrect syntax near '{'.ます。a に対して同じことを使用する多くの例を見ましたが、sql stringなぜエラーが発生するのかわかりません..同じ量のパラメータがあります...

このようにデータベースからストアドプロシージャを実行すると

exec rptGetAssetbyLocation '2122' 5 つの列を取得します

Callable Statement を使用して結果を取得するにはどうすればよいですか? 私は何か間違ったことをしていregisterOutParameterますか?

0 投票する
1 に答える
5868 参照

java - callablestatement を使用して「ビュー」を呼び出す方法

簡単なグーグル検索だと思ったのですが、これに対する答えが見つかりません:

Access db を SQL Server に移行しています。一部のクエリをビューに変換しました。私のJavaアプリケーションは、単純な方法ですべてのクエリを呼び出していました:

これは、ストアド プロシージャに対して機能します。しかし、ビューでそれを行うと、次のようになります。

ビューの名前の後ろにある括弧を削除するのと同じくらい簡単だと思っていまし()たが、うまくいきませんでした。

  • JDBC CallableStatment を使用してビューを「呼び出す」にはどうすればよいですか?
  • テーブル値関数を呼び出す別の方法もありますか?
0 投票する
1 に答える
48 参照

java - 大きな XML ファイルを引数として取る MSSQL プロシージャを呼び出すための最良の方法は何ですか?

アプリサーバーが起動するたびに、 MSSQL DB にXML ファイルのコンテンツを挿入するアプリに取り組んでいます。

XML には、関連するテーブルの複数のレコードが含まれています。ストアド プロシージャは、XML ファイルの内容を (TEXT) 引数として受け取り、ポインタ ( sp_xml_preparedocument ) を作成し、 OPENXMLを使用してテーブルに挿入します。

XML ファイルが存在するアプリケーション サーバーからJDBC (またはSQLCMDの場合もある) を使用して手順を実行する必要があります。

XML ファイルは約 160MB です。現在、CallableStatementに大きな String オブジェクトとして読み取って XML ファイルを送信していますが、非常に時間/スペース/リソースを消費します。