0

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

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 ;

这与我的本地数据库正常工作。

4

2 回答 2

0

TLDR;更改您的 Java 代码,通过索引而不是名称使 CallableStatement 引用参数。

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

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

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

我将我的 Callable Statement 更改为通过索引而不是名称来引用参数,嘿,它很快就起作用了。

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

祝你好运

于 2013-08-02T13:23:25.233 回答
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'

如果您收到某种错误说您没有权限,这绝对是您的问题。

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

于 2013-06-26T14:50:33.190 回答