从jdbc调用存储过程时出现异常

时间:2013-06-26 13:57:40

标签: mysql stored-procedures phpmyadmin

调用存储过程会导致此异常:

  

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-community-log - 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 ;

这适用于我的本地数据库。

2 个答案:

答案 0 :(得分:0)

您尝试使用的存储过程似乎需要访问MySQL的INFORMATION_SCHEMA。这是每个MySQL服务器内置的(假)数据库;它用于获取表,列,索引等的描述。

您使用的用户ID似乎无法访问INFORMATION_SCHEMA。这在主机服务上是可以理解的。

继续使用MyPhpAdmin并尝试这样的查询以确保这一点。

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

如果您收到某种错误,表示您没有获得许可,这绝对是您的问题。

您可以尝试重写您的存储过程,或者您可以要求您的托管服务授予您相应的权限。

答案 1 :(得分:0)

TLDR;更改Java代码,按索引而不是名称生成CallableStatement引用参数。

遇到类似问题后,我更新了我的JDBC驱动程序mysql-connector-java-5.1.26-bin.jar。 然后错误从

更改
  

用户无权访问确定存储所需的元数据   过程参数类型。如果无法授予权限,请配置   与“noAccessToProcedureBodies = true”连接以获得驱动程序   生成表示INOUT字符串的参数,无论如何   实际参数类型。

  

当连接配置为不访问过程主体时,无法按名称访问参数

我将我的Callable语句更改为通过索引而不是名称引用参数,并且嘿presto它可以工作。

当您没有元数据访问权限或例行正文访问时,可能不需要更新驱动程序,只需知道使用索引而不是名称。

祝你好运