2017-06-06 38 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的实现认为它的确如此。

相关问题