5

初めて Oracle を使用し、通常は SQLServer を使用し、興味深い問題に遭遇しました。私はこの問題で髪を引き裂いていて、ランダムなことを試していて、たまたまうまくいきました。

そのため、最初は 2 つのパラメーターしかなく、すべて正常に機能していました。次に、ブール値を追加して、ストアド プロシージャに複数のパスを許可したいと考えました。私は自分の db 環境でテストしましたが、エラーはなく、期待どおりのデータが返されました。次に、このデータを取得するために Java コードに数行追加すると、突然 " wrong number or types of parameters" エラーが発生します。

いくつかのことを試した後、Oracle の型を Boolean から Int に変更し、Java コードを " setBoolean(3, true)" のままにして、すべてが機能するようにしました。

だから私の質問は:

1) Java 側でこの setBoolean() を使用して送信しているのは何ですか? Oracle は何を取得していますか?

2) 以前は「 」タイプだったのに何を期待していたのですか?Booleanなぜこれが と互換性がないのsetBoolean()ですか?

3) 速度を上げるには、Java setBoolean() または Oracle Varchar と setString() などの他の組み合わせで Oracle 型 int を使用する必要がありますか?

ジャワ:

String jobquery =   "{call PKG_TEST.GET_PLAN_DATA(?,?,?)}";  
            CallableStatement callStmt = con.prepareCall(jobquery);

            callStmt.setString(1,"15105");
            callStmt.setString(2, "");
            callStmt.setBoolean(3, true);

Oracle SP (以前):

PROCEDURE GET_PLAN_DATA(
        NAME_N_IN IN VARCHAR2,
        TYPE_C_IN IN VARCHAR2 DEFAULT NULL,
        ONLY_RESTRICTIONS_IN IN BOOLEAN DEFAULT FALSE)

オラクルは次のように変更されました:

 PROCEDURE GET_PLAN_DATA(
            NAME_N_IN IN VARCHAR2,
            TYPE_C_IN IN VARCHAR2 DEFAULT NULL,
            ONLY_RESTRICTIONS_IN IN INT DEFAULT 0)
4

2 に答える 2

2

1) Java 側でこの setBoolean() を使用して送信しているのは何ですか? Oracle は何を取得していますか?

Javaドキュメントから:

Sets the designated parameter to the given Java boolean value. The driver converts this to an SQL BIT value when it sends it to the database.

したがって、Boolean値は値に変換されBITます。

2) タイプが だったとき、以前は何が期待されていましたBooleanか? また、これが setBoolean() と互換性がないのはなぜですか?"

前述のとおり、それを値に変換するBITので、同じことを期待していました。以前Booleanは oracle 用の変数もありました。しかし、あなたが言ったように、いくつかのことを試した後、私は単に Oracle の型を Boolean から Int に変更し、Java コードを「setBoolean(3, true)」のままにして、すべてが機能します。、理由は、オラクルにはもうブール変数がありません。なんで?この問題に関する深い議論については、これをお読みください。

3) 速度を上げるには、Java setBoolean() または Oracle Varchar と setString() などの他の組み合わせで Oracle 型 int を使用する必要がありますか?

と. varchar_ setString()理由、setString()メソッドはそれを に変換varcharます。したがって、 からに移動する と に比べsetBoolean()て時間を節約できます。intBooleanBITint


編集

問題をより明確にするために、上記のリンクのいずれかからコピーしたものだけを貼り付けます。

こんにちはトム、ブール型のデータ型について質問があります。

以下は、クライアントが作成した SP であり、これをアプリケーションに統合する必要があります。

PROCEDURE sp_xxxx_map (
                ic_opt_number       IN  VARCHAR2,
                in_cast_number    IN  NUMBER,
                in_tyre_amount          IN  NUMBER,
                ob_is_valid             OUT BOOLEAN,
                ob_is_obgr_obgt_valid   OUT BOOLEAN,

--------------- いくつかのパラメーターを追加します....

上記を統合している間、ブール値の OUT パラメータを除いてすべて問題ありません。
「ob_is_valid」、「ob_is_obgr_obgt_valid」パラメーターをキャッチするためのSQLデータ型がJava(JDBCクラス)にないと思います(間違っている場合は修正してください) 。どうすればこの問題を解決できますか。1つのアイデアは次のとおりです。別のSP(たとえばSP1)を作成できますか。これは、上記のSPを呼び出し、ブール型を真の場合は「Y」、偽の場合は「N」などのCHARに変換します。最後に、新しく作成した SP1 をアプリケーションに呼び出させます。

フォローアップ 2003 年 2 月 5 日 - 中央時間帯の午前 9 時:

準備して実行するだけです:

declare
   b1 boolean;
   b2 boolean;
   n1 number := 0;
   n2 number := 0; 
begin
   sp_xxxx_map( ?, ?, ?, b1, b2 );
   if (b1) then n1 := 1; end if;
   if (b2) then n2 := 1; end if;
   ? := n1;
   ? := n2;
end;

jdbcアプリから。

于 2012-05-29T15:02:40.143 に答える