1. 程式人生 > >JDBC連線執行MySQL儲存過程報空指標或許可權錯誤

JDBC連線執行MySQL儲存過程報空指標或許可權錯誤

 最近使用root使用者編寫了幾個儲存過程,但是使用普通使用者通過JDBC連線執行卻報錯:

java.lang.NullPointerException......

java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.

報哪個錯要看你使用的Connector/J版本了。

這是因為JDBC呼叫儲存過程時需要有show create procudure 許可權或是有表mysql.proc的select許可權。通過在JDBC連線屬性中設定noAccessToProcedureBodies=true(預設false)解決或是授予普通使用者相應的許可權或者是按http://lists.mysql.com/commits/17817中的patch修改。

該noAccessToProcedureBodies=true的影響:
1. 呼叫儲存過程時,將沒有型別檢查,設為字串型別,並且所有的引數設為in型別,但是在呼叫registerOutParameter時,不丟擲異常。
2. 儲存過程的查詢結果無法使用getXXX(String parameterName)的形式獲取,只能通過getXXX(int parameterIndex)的方式獲取。

參考: