2013-06-26 46 views
0

調用存儲過程調用在此異常的存儲過程的結果:異常而從JDBC

SQLException1 java.sql.SQLException中:用戶不具有訪問來確定存儲過程參數類型所需 元數據。如果不能授予 權限,請將配置爲 「noAccessToProcedureBodies = true」的連接使驅動程序生成代表INOUT字符串的參數 ,而不管實際參數類型如何。

要解決這個問題,我想:

Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306 
/database?useInformationSchema=true&noAccessToProcedureBodies=true", 
"user_name", "pasword"); 

但它仍然無法正常工作。

我正在使用共享主機。

我使用

  • 軟件版本:5.0.91社區日誌 - MySQL社區版(GPL)
  • 協議版本:10
  • 的Java 1.6
  • 使用mysql-connector-java的-5.1.14-bin.jar

我的一個存儲過程是:

DROP PROCEDURE IF EXISTS `share_message` 

DELIMITER // 


CREATE PROCEDURE share_message(in messageid1 int(200),in received_by1 int(20), 
in sent_by1 int(20),in shared_of1 int(20),author1 int(20), OUT query_status1 TINYINT) 

BEGIN 


DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN 
    -- ERROR 
    SET query_status1 = -1; 
    rollback; 
    END; 

DECLARE EXIT HANDLER FOR SQLWARNING 
    BEGIN 
    -- WARNING 
    SET query_status1 = -1; 
    rollback; 
    END; 

START TRANSACTION; 
SET query_status1 = 0; 



INSERT INTO post_message_users(messageid,received_by,sent_by,shared_of,author) 
VALUES(messageid1,received_by1,sent_by1,shared_of1,author1); 

UPDATE post_messages SET total_share=total_share+1 WHERE messageid=messageid1; 


SET query_status1 =1; 


COMMIT; 
END// 

DELIMITER ; 

這與我的本地數據庫正常工作。

+0

發佈存儲過程的文本? –

回答

0

看來你正在嘗試使用的存儲過程需要訪問MySQL的INFORMATION_SCHEMA。這是每個MySQL服務器中建立的(假的)數據庫;它用於獲取表,列,索引等的描述。

看起來您正在使用的用戶標識無權訪問INFORMATION_SCHEMA。這在託管服務上是可以理解的。

繼續MyPhpAdmin並嘗試這樣的查詢以確保這一點。

SELECT table_schema, table_name 
    FROM information_schema.columns  
    WHERE column_name = 'something' 
    AND table_schema = 'your database name' 

如果您遇到某種錯誤,說您沒有權限,這肯定是您的問題。

您可以嘗試重寫您的存儲過程,或者您可以要求您的託管服務授予您相應的權限。

+0

我已經嘗試過上面的查詢,它正在執行正確並給出table_schema和table_name – user2302288

+0

最初我嘗試了''jdbc:mysql:// localhost:3306 /database?noAccessToProcedureBodies = true「, 」user_name「,」pasword「)'then我包含'useInformationSchema = true' – user2302288

0

TLDR;更改您的Java代碼,通過索引而不是名稱來創建CallableStatement引用參數。

在發生類似問題後,我更新了我的JDBC驅動程序mysql-connector-java-5.1.26-bin.jar。然後 誤差從

用戶改變不具有訪問所需的,以確定存儲 過程參數類型的元數據。如果不能授予權限,則使用「noAccessToProcedureBodies = true」配置 連接,使驅動程序 生成代表INOUT字符串的參數,而不管 實際參數類型。

按名稱不能訪問參數時,連接已被配置爲不訪問過程主體

我改變了我的調用語句通過索引而不是名稱引用參數,嘿presto它的作品。

更新驅動程序可能不是必需的,只知道在沒有元數據訪問或常規正文訪問時使用索引而不是名稱。

好運