云数据库 GAUSSDB-执行SQL语句:创建和调用存储过程(入参为复合数据类型)
创建和调用存储过程(入参为复合数据类型)
以下用例展示A兼容模式下,入参为复合数据类型的存储过程创建和调用情况。前置条件是数据库建连完成、连接对象为conn。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 在数据库创建复合数据类型。 CREATE TYPE compfoo AS (f1 int, f3 text); // 在数据库中创建table类型。 create type compfoo_table is table of compfoo; // 在数据库中创建如下存储过程,它带有out参数。 create or replace procedure test_proc ( psv_in in compfoo, table_in in compfoo_table, psv_out out compfoo, table_out out compfoo_table ) as begin psv_out := psv_in; table_out:=compfoo_table(); table_out.extend(table_in.count); for i in 1..table_in.count loop table_out(i):=table_in(i); end loop; end; / |
调用存储过程test_proc如下:
- 设置参数behavior_compat_options='proc_outparam_override'后,调用Connection的prepareCall方法创建调用语句对象cs。
1 2 3
Statement statement = conn.createStatement(); statement.execute("set behavior_compat_options='proc_outparam_override'"); CallableStatement cs = conn.prepareCall("{ CALL TEST_PROC(?,?,?,?) }");
- 调用CallableStatement的set方法设置参数。
1 2 3 4 5 6 7 8
PGobject pGobject = new PGobject(); pGobject.setType("public.compfoo"); // 设置复合类型名,格式为“schema.typename”。 pGobject.setValue("(1,demo)"); // 绑定复合类型值,格式为“(value1,value2)”。 cs.setObject(1, pGobject); pGobject = new PGobject(); pGobject.setType("public.compfoo_table"); // 设置Table类型名,格式为"schema.typename"。 pGobject.setValue("{\"(10,demo10)\",\"(11,demo111)\"}"); //绑定Table类型值,格式为"{\"(value1,value2)\",\"(value1,value2)\",...}"。 cs.setObject(2, pGobject);
- 调用CallableStatement的registerOutParameter方法注册输出参数。
1 2 3 4
// 注册out类型的参数,类型为复合类型,格式为“schema.typename”。 cs.registerOutParameter(3, Types.STRUCT, "public.compfoo"); // 注册out类型的参数,类型为Table类型,格式为“schema.typename”。 cs.registerOutParameter(4, Types.ARRAY, "public.compfoo_table");
- 调用CallableStatement的execute方法执行SQL语句。
1
cs.execute();
- 调用CallableStatement的getObject方法获取输出参数。
1 2 3 4 5 6 7 8 9 10 11 12
// 返回结构是自定义类型。 PGobject result = (PGobject)cs.getObject(3); // 获取out参数 result.getValue(); // 获取复合类型字符串形式值。 result.getArrayValue(); //获取复合类型数组形式值,以复合数据类型字段顺序排序。 result.getStruct(); //获取复合类型子类型名,按创建顺序排序。 result.getAttributes(); //返回自定义类型每列组成类型的对象,对于array类型和table类型返回的是PgArray,对于自定义类型,封装的是PGobject,对于其他类型数据存储方式为字符串类型。 // 返回结果是Table类型。 PgArray pgArray = (PgArray) cs.getObject(4); ResultSet rs = pgArray.getResultSet(); while (rs.next()) { rs.getObject(2);// table类型每行的数据构建成的对象。 }
如果出参的table类型组成为自定义类型,例如create type compfoo_table is table of compfoo,此时接收到的返回对象为PgArray,在通过rs.getObject(2)遍历获取到的组成对象也为PgArray,此时无法获取到组成它的compfoo类型对应的每列数据,需要通过getPGobject()获取到PgObject再操作获取。
- 调用CallableStatement的close方法关闭调用语句对象cs。
1
cs.close();
- A兼容模式开启参数后,调用存储过程必须使用{call proc_name(?,?,?)}形式调用,调用函数必须使用{? = call func_name(?,?)}形式调用(等号左侧的“?”为函数返回值的占位符,用于注册函数返回值)。
- 参数behavior_compat_options='proc_outparam_override'变更后,业务需要重新建立连接,否则无法正确调用存储过程和函数。
- 函数和存储过程中包含复合类型时,参数的绑定与注册需要使用schema.typename形式。
- GaussDB设置默认值_GaussDB存储过程_高斯数据库设置默认值-华为云
- GaussDB如何建主键_数据库索引设计规范_高斯数据库如何建主键-华为云
- GaussDB主键生成_GaussDB存储过程_高斯数据库主键生成_华为云
- GaussDB数据库产品特性_华为gaussdb_高斯语法
- 云数据库Gaussdb快速入门_gaussdb连接__gaussdb案例
- GaussDB计算性能_gaussdb递归_高斯数据库计算性能_华为云
- 连接GaussDB数据库_华为高斯数据库_新建数据库_语法
- GaussDB内核_GaussDB数据库内核_高斯数据库内核_华为云
- GaussDB数据库函数和字符串_高斯数据库优势_新建高斯数据库_高斯协议
- RDS for MySQL限流_华为云数据库RDS_自治限流_SQL限流