問題タブ [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 投票する
3 に答える
22404 参照

java - 単一の CallableStatement から複数の結果セットを取得するにはどうすればよいですか?

コマンドラインからストアド プロシージャを呼び出すと、次のようになります。

ここに私のJavaコードのスニペットがあります

ステートメントを実行すると、event_table の結果のみが返されます。次のクエリを読みました。

非常に遅いため、データベースに複数のリクエストを送信しないようにしています (結果の数によっては 300 ミリ秒)。

それは可能ですか?

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

java - null を返すストアド プロシージャの出力パラメータ

ストアド プロシージャがあり、標準の構文を使用して呼び出しています (そう言いますが、これまでプロシージャを呼び出したことはありません)。

ストアド プロシージャは、Toad または SQLDeveloper を介して呼び出されると、正しい値 (数値) を返します。ストアド プロシージャは、あるテーブルからデータを取得し、別のテーブルに挿入します。プロシージャは機能し、呼び出すと機能しますが、正しい値が返されません。

ただし、以下のコードを使用すると、getInt を使用すると 0 になります (これは null に相当します)。

これがnullを返す理由について誰かが私に何かガイダンスを与えることができれば、それは大歓迎です。手順コードを見ないと難しいかもしれませんが(かなり長いので投稿しません)、ガイダンスは素晴らしいです。

ありがとう。

編集:

プロシージャの宣言は次のとおりです。

手順から値を返すセクションは次のとおりです。

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()