Mysql 从jdbc调用存储过程时发生异常
调用存储过程会导致此异常: SQLException 1 java.sql.SQLException:用户无权访问 确定存储过程参数类型所需的元数据。如果 无法授予权限,请使用配置连接 “noAccessToProcedureBodies=true”让驱动程序生成参数 表示与实际参数类型无关的INOUT字符串 为了解决这个问题,我尝试:Mysql 从jdbc调用存储过程时发生异常,mysql,stored-procedures,phpmyadmin,Mysql,Stored Procedures,Phpmyadmin,调用存储过程会导致此异常: SQLException 1 java.sql.SQLException:用户无权访问 确定存储过程参数类型所需的元数据。如果 无法授予权限,请使用配置连接 “noAccessToProcedureBodies=true”让驱动程序生成参数 表示与实际参数类型无关的INOUT字符串 为了解决这个问题,我尝试: Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306 /databas
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 ;
这在我的本地数据库中正常工作。您尝试使用的存储过程似乎需要访问MySQL的
信息\u架构。这是在每个MySQL服务器中构建的(假的)数据库;它用于获取表、列、索引等的描述
您使用的用户id似乎无法访问信息\u架构
。这在托管服务上是可以理解的
继续MyPhpAdmin并尝试类似这样的查询以确保这一点
SELECT table_schema, table_name
FROM information_schema.columns
WHERE column_name = 'something'
AND table_schema = 'your database name'
如果你得到某种错误,说你没有权限,这肯定是你的问题
您可以尝试重写存储过程,也可以要求托管服务授予您相应的权限。TLDR;更改Java代码,使CallableStatement按索引而不是名称引用参数
遇到类似问题后,我更新了JDBC驱动程序mysql-connector-java-5.1.26-bin.jar。
然后错误从
用户无权访问确定存储的数据所需的元数据
过程参数类型。如果无法授予权限,请配置
连接“NoAccessTopProcedureBodies=true”以获得驱动程序
生成表示输入输出字符串的参数,而不考虑
实际参数类型
到
如果已将连接配置为不访问过程主体,则无法通过名称访问参数
我将我的可调用语句改为按索引而不是按名称引用参数,这样就可以了
更新驱动程序可能没有必要,只是知道在没有元数据访问或例程正文访问权限时使用索引而不是名称
祝您好运发布存储过程的文本?我已经尝试了上面的查询,该查询正在正确执行,并给出了表\u schema和表\u name最初我尝试了“jdbc:mysql://localhost:3306 /数据库?noAccessToProcedureBodies=true”、“用户名”、“密码”)
然后我加入了useInformationSchema=true