DM8 jdbc调用存储过程传参list<实体类>

一、前提

jdbc的连接串参数prepareOptimize,表示是否对预编译SQL做优化,取值true/false,默认false不开启优化。

开启prepare优化可绕过该问题,jdbc url添加参数prepareOptimize=true,服务器和jdbc都需升级到最新版本。数据库版本最低需要V8.1.2.73

二、建表语句

-- 第一步:创建一个对象类型create or replace type STUDENT as object(id        number(4),name    varchar2(50),age        number(3));-- 第二步:创建一个数组类型 (任意选择下面的一句执行)-- 方式1:用table来盛放对象
create or replace type STU_LIST as table of STUDENT;
/
-- 方式2:用数组来盛放对象,同时可指定数组的大小[用as varray(100)也是可以滴]
create or replace type STU_LIST as array(100) of STUDENT;-- 第三步:创建一个过程引用集合类型的参数create or replace procedure test_in_list(
-- 参数区域studentlist in STU_LIST,message out varchar2
)
is
-- 变量区域
begin
-- 执行区域for i in 1 .. studentlist.count loopmessage:=message||'{id:'||studentlist(i).id||', name:'||studentlist(i).name||', age'||studentlist(i).age||'},';end loop;
end test_in_list;

三、java代码

package com.dameng.dm;import com.dameng.domain.Student;
import dm.jdbc.desc.ArrayDescriptor;
import dm.jdbc.desc.StructDescriptor;
import dm.jdbc.driver.DmdbArray;
import dm.jdbc.driver.DmdbConnection;
import dm.jdbc.driver.DmdbStruct;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;/*** SQl语句** -- 1. 创建一个对象类型* create or replace type STUDENT as object(*     id          number(4),*     name        varchar2(50),*     age         number(3)*  );* -- 2. 创建一个数组类型 (任意选择下面的一句执行)* -- 方式1:用table来盛放对象* create or replace type STU_LIST as table of STUDENT;** -- 方式2:用数组来盛放对象,同时可指定数组的大小[用as varray(100)也是可以滴]* create or replace type STU_LIST as array(100) of STUDENT;** -- 3. 创建一个过程引用集合类型的参数* create or replace procedure test_in_list(* -- 参数区域*     studentlist in STU_LIST,*     message out varchar2* )* is* -- 变量区域* begin* -- 执行区域*     for i in 1 .. studentlist.count loop*         message:=message||'{id:'||studentlist(i).id||', name:'||studentlist(i).name||', age'||studentlist(i).age||'},';*     end loop;* end test_in_list;*/public class TestList_Dm {// 测试mainpublic static void main(String[] args) {testProInList();}// 调用存储过程并返回执行结果public static void testProInList() {try {String url = "jdbc:dm://192.168.60.167?prepareOptimize=true";String user = "SYSDBA";String password = "SYSDBA";Class.forName("dm.jdbc.driver.DmDriver");Connection connection = null;connection = DriverManager.getConnection(url,user,password);String sql = "{call TEST_IN_LIST(?,?)}";// 创建CallableStatement接口CallableStatement callableStatement = connection.prepareCall(sql);DmdbConnection dmcon = connection.unwrap(DmdbConnection.class);// 给in?赋值ArrayList<Student> list = new ArrayList<Student>() {{this.add(new Student(1, "ZhangSan", 23));this.add(new Student(2, "LiSi", 22));this.add(new Student(3, "WangWu", 21));}};DmdbArray array = getArray(dmcon, "STUDENT", "STU_LIST", list);// 设置入参`callableStatement.setArray(1, array);// 注册出参callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);// callableStatement.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);// 执行callableStatement.execute();// 获取返回结果String message = callableStatement.getString(2);System.out.println(message);// 打印结果:// {id:1, name:ZhangSan, age23},{id:2, name:LiSi, age22},{id:3,// name:WangWu, age21},} catch (Exception e) {e.printStackTrace();} finally {}}private static DmdbArray getArray(DmdbConnection con, String DmObjType, String DmArrType, ArrayList<Student> stuList)throws Exception {DmdbArray list = null;if (stuList != null && stuList.size() > 0) {DmdbStruct[] structs = new DmdbStruct[stuList.size()];StructDescriptor structdesc = new StructDescriptor(DmObjType, con);// 遍历stuList,将每个Student对象转换为 可识别的模板对象for (int i = 0; i < stuList.size(); i++) {// java对象Student student = stuList.get(i);// 数组大小应和你定义的数据库对象(STUDENT)的属性的个数Object[] oneRow = new Object[3];oneRow[0] = student.getId(); // 将Student对象的每个属性按顺序设置到oneRow数组中oneRow[1] = student.getName();oneRow[2] = student.getAge();structs[i] = new DmdbStruct(structdesc, con, oneRow);}// 匹配listArrayDescriptor desc = new ArrayDescriptor(DmArrType, con);list = new DmdbArray(desc, con, structs);}return list;}}

DM8 jdbc调用存储过程传参list<实体类>相关推荐

  1. ajax传参到实体类对应字段

    之前看公司的代码,从页面ajax传参数到接口类,接口类用一个实体接收.我一直以为c#会自动识别,赋值到同名的字段. 我曾和朋友讨论过,双方辩论.朋友认为c#没有这种功能,没有这样高级匹配的机制.而我因 ...

  2. ajax传值 实体类_ajax传参到实体类对应字段

    之前看公司的代码,从页面ajax传参数到接口类,接口类用一个实体接收.我一直以为c#会自动识别,赋值到同名的字段. 我曾和朋友讨论过,双方辩论.朋友认为c#没有这种功能,没有这样高级匹配的机制.而我因 ...

  3. jdbc批量调用oracle存储过程,oracle学习笔记(二十三)——JDBC调用存储过程以及批量操作...

    jdbc调用存储过程 使用并获得out模式的参数返回值 //存储过程为sum_sal(deptno department.deptno%type,sum in out number) Callable ...

  4. 使用jdbc调用存储过程

    存储过程是指保存在数据库并在数据库端执行的程序.你可以使用特殊的语法在Java类中通过JDBC调用存储过程.在调用时,存储过程的名称及指定的参数通过JDBC连接发送给DBMS,执行存储过程并通过连接( ...

  5. MySQL 存储过程传参之in, out, inout 参数用法

    存储过程传参:存储过程的括号里,可以声明参数. 语法是 create procedure p([in/out/inout] 参数名  参数类型 ..) in :给参数传入值,定义的参数就得到了值 ou ...

  6. jdbc调用存储过程的方法

    ----------------------------jdbc调用存储过程的方法--------------------------------------------------- private ...

  7. python调用so库输出传入指针_python中使用ctypes调用so传参设置遇到的问题及解决方法...

    问题 近日在做一组声纹聚类时,使用了另一团队同学开发的声纹距离算法.该算法对外提供的是一组so包,需要使用方自己去使用.在python中调用纯so包一般使用ctypes类库,用起来看起来简单但也有不少 ...

  8. MySQL在脚本中执行传参数_ZZW_shell脚本中的调用MYSQL传参及注意的问题

    [oracle@ip9140 db_pcc]$ cat zzw_cc.sh #!/bin/bash z_user='pcc_csuser22' z_pass='pcc_csuser22' z_db=' ...

  9. 【漏网之鱼】Ansible AWX调用playbook传参问题

    [漏网之鱼]Ansible AWX调用playbook传参问题 问题背景 问题一:读不到inventory.ini中的变量 问题二:读到的变量与定义值不同 问题背景 通过ansible AWX使用We ...

最新文章

  1. Redis数据库简介与(CentOS 7)编译安装
  2. faster rcnn结构
  3. 波卡链Substrate (5)托盘Pallets进阶
  4. MySQL INT、TINYINT、SMALLINT、MEDIUMINT、BIGINT(整数类型)
  5. 志愿者招募 | 2021 .NET Conf China
  6. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf
  7. HOW-TO:在Spring 4和Java 7中使用@PropertySource批注
  8. LeetCode 6055. 转化时间需要的最少操作数(贪心)
  9. Understand源代码分析工具
  10. Javascript: IE中命名函数直接量的Bug?
  11. javase开发工具包中的什么命令负责运行应用程序_想当程序员?先搞懂JavaSE、JavaEE和JavaME之间的区别吧!...
  12. Django 查询表的几种方式
  13. Nodejs BFF 开发 8 个月的心路历程
  14. adb server is out of date 最新解决方案
  15. Calcite parser config介绍
  16. CometOJ国庆欢乐赛 C两排房子 二分 D1 二分贪心 E贪心特判
  17. 常用通信协议——IIC协议编程实现
  18. luoguP3397 地毯
  19. webstorm 风扇一直响_在 Webstorm 伤透我的心后,我决定尝试 VS Code
  20. 简单操作破解PDF加密文件

热门文章

  1. 求组合数的算法 java,求一个整数的组合数算法(java)
  2. ios 开发证书导出p12文件_开发者在上传企业签名的应用到后,做到如下几点
  3. POJ 2083 递归画分形图
  4. P4198 楼房重建
  5. 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
  6. Python之迭代器
  7. jquery对radio的操作汇总
  8. Jboss/Wildfly安装配置
  9. tcpdump使用实例——基于ip统计流量
  10. Bind 9.5安装入门指南