GBase 8a
其他
文章

GBase8a JDBC 存储过程执行异常PROCEDURE XXX does not exist

发表于2024-09-27 08:57:55293次浏览2个评论

分别基于9.5.3.27.20_patch.9、9.5.3.27.20_patch.15、9.5.3.27.20_patch.16版本数据库验证,情形如下:

测试数据准备

create user u2 identified by 'u2';
set default_vc for u2=vc1;
create database tdb;
CREATE TABLE tdb.t2 (id int, name varchar(100));
insert into tdb.t2 values (8,'T2-机构2406存教组件开立金融客户北京市海鹰总部基地大厦盱眙埠阜中国银行北京f丰台科技园丰台科技园');
grant all on vc1.tdb.* to u2;
grant file on *.*.* to u2;


DROP PROCEDURE IF EXISTS tdb.proc_count;
DELIMITER $$
CREATE PROCEDURE tdb.PROC_COUNT (IN param1 INT, OUT param2 varchar(100))
BEGIN
 select name into param2 from tdb.t2 where id = param1;
end $$
DELIMITER ;

call tdb.proc_count(8, @name);
SELECT @name;

JDBC驱动准备

 gbase-connector-java-8.3.81.53-build52.6-bin.jar
 gbase-connector-java-8.3.81.53-build55.5.5-bin.jar

测试程序准备

package jdbc.test.pool.gbasepool;

import java.sql.*;
import java.util.Properties;
import java.util.concurrent.Callable;
import cn.gbase.pool.dataSource.GBaseComboPooledDataSource;

public class GbasePoollSamples {
	public static void main(String[] args) {
		callproc();

	}

	public static void callproc() {
		Connection conn = null;
		CallableStatement cstm = null;
		try {
			Class.forName("com.gbase.jdbc.Driver");
			String url="jdbc:gbase://192.168.195.10:5258/tdb?user=u2&password=u2";
			//如未赋予gbase.proc的select权限,则需加noAccessToProcedureBodies=true
			//String url="jdbc:gbase://192.168.195.10:5258/tdb?user=u2&password=u2&noAccessToProcedureBodies=true";
			String proc="{call tdb.proc_count(?,?)} ";
			System.out.println("proc:"+proc);

			conn = DriverManager.getConnection(url);
			cstm = conn.prepareCall(proc);
			cstm.setInt(1, 8);
            cstm.setString(2, "@name");
			cstm.registerOutParameter(2, Types.VARCHAR);
			cstm.execute();
            System.out.println("out:"+cstm.getString(2));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				cstm.close();
			} catch (NullPointerException e) {
			} catch (Exception e) {
				cstm = null;
			}
			try {
				conn.close();
			} catch (NullPointerException e) {
			} catch (Exception e) {
				conn = null;
			}
		}
	}
}

 

测试执行步骤(9.5.3.27.20_patch.9 /  9.5.3.27.20_patch.15 / 9.5.3.27.20_patch.16): 

场景1:

A:GDS工具:执行call tdb.proc_count(@bb, 't'),结果正常

B:gccli命令:执行call tdb.proc_count(@bb, 't'),结果正常

C:IDEA工具:

1)使用JDBC驱动版本为:gbase-connector-java-8.3.81.53-build55.5.5-bin.jar ,错误输出java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" to have driver generate parameters that represent INOUT strings irregardless of actual parameter types 

2)使用JDBC驱动版本为:gbase-connector-java-8.3.81.53-build52.6-bin.jar,错误输出java.sql.SQLException: PROCEDURE tdb.proc_count does not exist 

 

场景2:

用户赋权:grant select on gbase.proc to u2;

A:GDS工具:执行call tdb.proc_count(@bb, 't'),结果正常

B:gccli命令:执行call tdb.proc_count(@bb, 't'),结果正常

C:IDEA工具:

1)使用JDBC驱动版本为:gbase-connector-java-8.3.81.53-build55.5.5-bin.jar ,结果正常 

2)使用JDBC驱动版本为:gbase-connector-java-8.3.81.53-build52.6-bin.jar,,结果正常 

 

参考MySQL报错“noAccessToProcedureBodies=true”解决方法:https://dbanote.com/MySQL/noAccessToProcedureBodies.html

评论

登录后才可以发表评论
用户头像
柒柒天晴发表于 2个月前
谢谢分享
ljt98发表于 2个月前
学会了