云数据库 GAUSSDB-执行SQL语句:Oracle兼容模式启用重载时,调用存储过程
Oracle兼容模式启用重载时,调用存储过程
打开参数behavior_compat_options='proc_outparam_override'后,JDBC调用事先创建的存储过程,步骤如下:
- 调用Connection的prepareCall方法创建调用语句对象。
1 2 3 4 5 6
// 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,password); CallableStatement cs = conn.prepareCall("{ CALL TEST_PROC(?,?,?) }");
- 调用CallableStatement的setInt方法设置参数。
1 2 3 4
PGobject pGobject = new PGobject(); pGobject.setType("public.compfoo"); // 设置复合类型名,格式为“schema.typename”。 pGobject.setValue("(1,demo)"); // 绑定复合类型值,格式为“(value1,value2)”。 cs.setObject(1, pGobject);
- 调用CallableStatement的registerOutParameter方法注册输出参数。
1 2 3 4
// 注册out类型的参数,类型为复合类型,格式为“schema.typename”。 cs.registerOutParameter(2, Types.STRUCT, "public.compfoo"); // 注册out类型的参数,类型为Table类型,格式为“schema.typename”。 cs.registerOutParameter(3, Types.ARRAY, "public.compfoo_table");
- 调用CallableStatement的execute执行方法调用。
1
cs.execute();
- 调用CallableStatement的getObject方法获取输出参数。
1 2 3 4 5 6 7 8 9 10 11 12
// 返回结构是自定义类型 PGobject result = (PGobject)cs.getObject(2); // 获取out参数 result.getValue(); // 获取复合类型字符串形式值。 result.getArrayValue(); //获取复合类型数组形式值,以复合数据类型字段顺序排序。 result.getStruct(); //获取复合类型子类型名,按创建顺序排序。 result.getAttributes(); //返回自定义类型每列组成类型的对象,对于array类型和table类型返回的是PgArray,对于自定义类型,封装的是PGobject,对于其他类型数据存储方式为字符串类型。 // 返回结果是Table类型 PgArray pgArray = (PgArray) cs.getObject(3); ResultSet rs = pgArray.getResultSet(); while (rs.next()) { rs.getObject(2);// table类型每行的数据构建成的对象 }
如果出参的table类型组成为自定义类型,例如create type compfooTable is table of compfoo,此时接收到的返回对象为PgArray,在通过rs.getObject(2)遍历获取到的组成对象也为PgArray,此时无法获取到组成它的compfoo类型对应的每列数据,需要通过getPGobject()获取到PgObject在操作获取。
- 调用CallableStatement的close方法关闭调用语句。
1
cs.close();
- oracle兼容模式开启参数后,调用存储过程必须使用{call proc_name(?,?,?)}形式调用,调用函数必须使用{? = call func_name(?,?)}形式调用(等号左侧的“?”为函数返回值的占位符,用于注册函数返回值)。
- 参数behavior_compat_options='proc_outparam_override'行为变更后,业务需要重新建立连接,否则无法正确调用存储过程和函数。
- 函数和存储过程中包含复合类型时,参数的绑定与注册需要使用schema.typename形式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 在数据库创建复合数据类型。 CREATE TYPE compfoo AS (f1 int, f3 text); // 在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure test_proc ( psv_in in compfoo, psv_out out compfoo, table_out out compfoo_table ) as begin psv_out := psv_in; table_out:=compfoo_table(); table_out.extend(2); table_out(1):=psv_out; table_out(2):=psv_out; end; / // 在数据库中创建table类型。 create type compfoo_table is table of compfoo; |
- 云数据库GaussDB(for MySQL)_兼容MySQL
- 数据库软件免费版_免费在线数据库_免费的数据库管理软件
- 免费云数据库MySQL_MySQL数据库免费_MySQL数据库是免费的吗
- GaussDB设置默认值_GaussDB存储过程_高斯数据库设置默认值-华为云
- 免费的MySQL云数据库_数据库管理系统有哪些_MySQL查询表
- GaussDB查版本命令_GaussDB命令参考_高斯数据库查版本命令-华为云
- GaussDB内核_GaussDB数据库内核_高斯数据库内核_华为云
- 云数据库RDS for MySQL存储空间自动扩容_存储空间_自动扩容_MySQL云盘
- GaussDB性能_性能统计_高斯数据库性能-华为云
- GaussDB数据库产品特性_华为gaussdb_高斯语法