`

Java调用oracle存储过程输出自定义对象或二维表

阅读更多
CREATE TABLE SFZ_TEST_MANAGER_XG(
       yxgh VARCHAR2(100),
       ygxm VARCHAR2(100),
       position_name VARCHAR2(100)
);
CREATE TABLE SFZ_TEST_MANAGER_XG AS select T.CCUST_ID as yxgh,T.ACCS_NBR as ygxm,T.CCUST_NAME as position_name from HEMS_FILTER_CUST_LIST t where t.ccust_id is not null and t.accs_nbr is not null and t.ccust_name is not null;

DROP TABLE SFZ_TEST_MANAGER_XG;

select * from SFZ_TEST_MANAGER_XG;
select count(*) from SFZ_TEST_MANAGER_XG;

create or replace TYPE SFZ_MANAG_M_OBJ_TYPE AS OBJECT(
      yxgh VARCHAR2(100),
       ygxm VARCHAR2(100),
       position_name VARCHAR2(100));
      
DROP TYPE SFZ_MANAG_M_OBJ_TYPE;

select * from user_objects t where t.object_name not like '%SFZ_MANAG_M_OBJ_TYPE%' and t.object_type = 'TYPE';

CREATE OR REPLACE TYPE SFZ_MANAG_M_TAB_TYPE IS TABLE OF SFZ_MANAG_M_OBJ_TYPE;

DROP TYPE SFZ_MANAG_M_TAB_TYPE;

create or replace procedure proc_sfz_proc_test(user_yxgh IN VARCHAR2,v_table out SFZ_MANAG_M_TAB_TYPE)
is
  cursor cursor_cur_type is select * from SFZ_TEST_MANAGER_XG; --可以增加条件
  i NUMBER(8) :=1;
BEGIN
   v_table:=SFZ_MANAG_M_TAB_TYPE();
   for cursor_record in cursor_cur_type loop
        v_table.EXTEND;
        v_table(i) := NEW SFZ_MANAG_M_OBJ_TYPE(cursor_record.yxgh,cursor_record.ygxm,cursor_record.position_name);
        --v_table(i) := NEW SFZ_MANAG_M_OBJ_TYPE('123','124','125');
        i:=i+1;
   end loop;
end proc_sfz_proc_test;

DROP PROCEDURE proc_sfz_proc_test;


package com.zjhcsoft.test.utl;

import java.sql.Connection;
import java.sql.DriverManager;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.Datum;
import oracle.sql.STRUCT;

public class TestOracleProc {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}

		Connection conn = null;
		String DBurl = "jdbc:oracle:thin:@134.224.40.73:1521:orcl";
		try {
			conn = DriverManager.getConnection(DBurl, "hems", "hems");
			System.out.println("Getting Connection...");
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			conn = DriverManager.getConnection(DBurl, "hems", "hems");
			long start = System.currentTimeMillis();
			OracleCallableStatement  cs = (OracleCallableStatement)conn.prepareCall("{call proc_sfz_proc_test(?,?)}");
			cs.setString(1, "fruitking");
			cs.registerOutParameter(2, OracleTypes.ARRAY,"SFZ_MANAG_M_TAB_TYPE");
			cs.execute();
			long end = System.currentTimeMillis();
			System.out.println("this procedure consumes "+((end-start)/1000)+" excute time.");
			start = System.currentTimeMillis();
			ARRAY array = (ARRAY)cs.getArray(2);
			Datum[] datas = array.getOracleArray();
			if(datas.length>0){
				System.out.println("this procedure has "+datas.length+" data.");
				for (int i = 0; i < datas.length; i++){
					if(datas[i]!=null&&((STRUCT) datas[i])!=null){
					Datum[] personAttributes = ((STRUCT) datas[i]).getOracleAttributes();
					System.out.println("column"+(i+1)+":"+new String(personAttributes[0].getBytes())+",  "+new String(personAttributes[1].getBytes())+",  "+new String(personAttributes[2].getBytes()));
					}else{
						System.out.println("datas["+i+"] is null.");
					}
				}
			}else{
				System.out.println("this procedure is not result data...");
			}
			end = System.currentTimeMillis();
			System.out.println("show this procedure data consumes "+((end-start)/1000)+" excute time.");
			cs.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

分享到:
评论

相关推荐

    java调用存储过程实现批量入库.docx

    通过这种方式,Java程序创建一个包含100个元素的二维数组,每个元素代表一条要插入的数据,然后将其转换为Oracle数组类型,并传递给存储过程执行批量插入。 调用存储过程的好处在于,它减少了与数据库的交互次数,...

    java操作Oracle数据库——ARRAY、TABLE类型批量入库

    在Java中,调用存储过程并传递ARRAY或TABLE参数。例如: ```java CallableStatement cs = connection.prepareCall("{call PROC_NAME(?, ?)}"); ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("MY_...

    JAVA上百实例源码以及开源项目源代码

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    Oracle 笔记.docx

    - **关系数据库**:由二维表组成的数据库。 #### 二、Oracle简介 - **Oracle公司背景**:甲骨文公司,主要生产中间件和数据库产品。 - **发展历程**: - **Oracle8**:基础版本。 - **Oracle8i**:开始支持...

    Oracle-ERP开发笔记

    - 矩阵报表是一种特殊的报表形式,常用于展示二维数据。 **11. Report编译出错** - 探讨了常见的Report编译错误及其解决方案。 --- #### 三、Oracle数据库基础 **1. 常用函数** - Oracle提供了丰富的内置函数来...

    Java基础笔记-笔试用

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一次编写,到处运行”的特性而闻名,因为Java代码可以被编译成字节码,然后在任何支持Java的平台上运行。Java...

    Java基础整理

    - **二维数组**:实际上是一维数组的元素也是数组的形式。 - **数组常用方法**:Java中提供了多个内置方法来操作数组,如`sort()`用于排序、`equals()`用于比较等。 **2.9 面试题** 针对初学者可能遇到的一些常见...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    3. 关系结构模型:关系式数据结构把一些复杂的数据结构归结为简单的二元关系(即二维表格形式)。常见的有Oracle、mssql、mysql等 二、 主流数据库 数据库名 公司 特点 工作环境 mssql 微软 只能能运行在windows平台,...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例043 将二维数组中的行列互换 53 实例044 利用数组随机抽取幸运观众 54 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例...

    非常实用的树形菜单,有数据库表

    数据库表是数据的二维表格形式,每个表由列和行组成,列定义了数据类型,行代表具体的数据实例。在本案例中,可能存在一个或多个表来存储菜单的层次结构和相关信息。 4. **yangwen_test_tree_t_org.dmp**:这个...

    教学实施大纲(javaWEB方向)

    - **二维数组及其使用**:二维数组本质上是一组一维数组的组合,可以通过索引访问其中的元素。 - **Arrays类操作数组**:Java提供了Arrays类来简化数组的操作,如排序、填充等。 #### 二、Java面向对象 **1. 类和...

    curso-java-dia-2

    9. **对象比较与equals()与hashCode()**: 理解如何正确重写`equals()`和`hashCode()`方法,这对于实现自定义对象的比较和在哈希表中存储对象非常重要。 10. **接口与抽象类**: 接口定义了一组方法签名,而抽象类...

    用Java编程:该存储库包含一些有用的代码,技术,算法和问题解决方案

    在Java中,有固定大小的一维数组和二维数组等。 2. **链表**:节点之间通过引用相连的数据结构,分为单链表、双链表等。Java中的LinkedList类实现了链表。 3. **栈**:后进先出(LIFO)的数据结构,如Java的Stack类...

    2021-2022计算机二级等级考试试题及答案No.10391.docx

    3. **知识点**: 二维表的每一行表示关系的一个记录。 - **解释**: 关系数据库中的数据以二维表格形式组织,每行代表一条记录(即实体),每列代表一个属性(即实体的特征)。例如,在学生表中,每行可能代表一个...

Global site tag (gtag.js) - Google Analytics