2017-06-06 24 views
1

我有一個java中的函數,它使用可調用語句並在mysql中用「call」一詞調用模式函數。它工作正常。調用mysql函數工作在jdbc,但不是在mysql上的「調用」

但是,如果在我的SQL我寫:

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

它不會工作,我得到:PROCEDURE ......犯規存在。

它對我來說很奇怪,它適用於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語句內,工作正常我只是不知道爲什麼在這裏「呼叫」這個詞的作品

+1

你不在'CALL'中存儲函數。你可以'SELECT myFunction();'(返回一個標量)或'DO myFunction();'(void context,返回值被丟棄)。像往常一樣,JDBC是以自己看似隨機的方式完成的......注意,用'?捕獲返回值? ='同樣無意義。 –

+0

@ Michael-sqlbot我不同意;它在JDBC中指定(從ODBC iirc複製)以獨立於數據庫的方式執行存儲過程或類似對象。 '?= ..'允許綁定單個輸出值。 –

+0

我相信你是對的,@MarkRotteveel。我擔心這是一個有點誤導的「我累了,應該在一個小時前睡着了」的咆哮。感謝事實和水平的迴應。 –

回答

2

{?= call ...}是JDBC轉義(它是在JDBC規範中定義)執行存儲過程。該轉義允許您以相對獨立於數據庫的方式編寫存儲過程調用。

然後,JDBC驅動程序必須將其轉換爲底層數據庫的正確語句。

函數是否應該可調用是完全不同的問題,但MySQL Connector/J的實現認爲它的確如此。

相關問題