调用存储过程会导致此异常:
SQLException1 java.sql.SQLException:用户无权访问 确定存储过程参数类型所需的元数据。如果 权限无法授予,配置连接 “noAccessToProcedureBodies = true”让驱动程序生成参数 代表INOUT字符串,无论实际参数类型如何。
要解决这个问题,我试过了:
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306
/database?useInformationSchema=true&noAccessToProcedureBodies=true",
"user_name", "pasword");
但它仍然不起作用。
我正在使用共享托管。
我正在使用
我的一个存储过程是:
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服务器内置的(假)数据库;它用于获取表,列,索引等的描述。
您使用的用户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它可以工作。
当您没有元数据访问权限或例行正文访问时,可能不需要更新驱动程序,只需知道使用索引而不是名称。
祝你好运