2017-06-06 13 views
1

私は呼び出し可能なステートメントを使用し、mysqlの "call"というスキーマの関数をjavaで呼び出します。それはうまく動作します。jdbcではmysql関数を呼び出すための呼び出しは、mysqlではなく、

しかし、私のSQLで私が書く場合:

call myFunction(); (in this case :call getNumberOfIdeasDB();) 

それは私が手に文句を言わない仕事:PROCEDURE ... doesntが存在します。

私はそれがJavaでは動作しますが、MySQLでは動作しません。理由を理解するのを助けてください。

ここでも私の機能はJavaであり、私はそれが適切ではないと信じています。

public static double getNumberOfIdeasDB() { 

    Connection co = riverManager.getConnection("jdbc:..."); 
    CallableStatement ps = co.prepareCall("{?= call getNumberOfIdeasThisWeek()}"); //10 

    ps.registerOutParameter(1, java.sql.Types.DOUBLE); 

    ps.execute(); 

    return ps.getDouble(1); 
} 

それはのtry/catchの内側にあり、正常に動作し、その単語が「コール」なぜここに私は知らないJDBCエスケープは(それがJDBC仕様で定義されている)である

+1

MySQLでは、ストアド関数を 'CALL'しません。 SELECT myFunction();(スカラを返します)またはDO DO myFunction();(voidコンテキスト、戻り値は破棄されます)。 JDBCは、いつものように、一見無作為に作られた方法で処理しています...戻り値を '? = 'は同じように無意味です。 –

+0

@ Michael-sqlbot私は同意しません。 JDBC(ODBC iircからコピーされた)で指定され、ストアドプロシージャまたは同様のオブジェクトを実行するデータベースに依存しない方法を持ちます。 '?= ..'は、単一の出力値をバインドすることを許可することです。 –

+0

あなたが正しいと確信しています、@ MarkRotteveel。私はいくらか誤った指示をしていました。 "私は疲れていて、1時間前に眠っていたはずだったはずです"と怒っています。事実とレベ​​ルに応じた回答に感謝します。 –

答えて

2

{?= call ...}作品ストアドプロシージャを実行します。このエスケープを使用すると、データベースに依存しない方法でストアドプロシージャ呼び出しを記述できます。

JDBCドライバは、それを基になるデータベースの正しい文に変換する必要があります。

関数を呼び出し可能にするかどうかはまったく別の問題ですが、MySQL Connector/Jの実装ではそう考えられます。

関連する問題