GBase8a JDBC 存储过程执行异常PROCEDURE XXX does not exist
分别基于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
热门帖子
- 12025-12-01浏览数:182764
- 22023-05-09浏览数:25062
- 42023-09-25浏览数:18526
- 52020-05-11浏览数:17529