oracle 存储过程返回数组
2016-12-29 16:00
363 查看
oracle存储过程想要返回数组,需要使用到临时表,具体的操作流程如下
使用java程序调用该存储过程,核心代码为:
CREATE OR REPLACE TYPE TYPE_ORDER AS OBJECT (ORDER_ID NUMBER); -- 创建对象 CREATE OR REPLACE TYPE TABLE_ORDER AS TABLE OF TYPE_ORDER; -- 创建临时表 CREATE OR REPLACE PACKAGE PACKAGE_ORDER AS -- 创建包头部 PROCEDURE PROC_ORDER (RETURN_ORDERS OUT TABLE_ORDER); -- 使用到的存储过程 END; CREATE OR REPLACE PACKAGE BODY PACKAGE_ORDER -- 创建包体,具体实现 AS PROCEDURE PROC_ORDER (RETURN_ORDERS OUT TABLE_ORDER) -- 实现存储过程 AS N NUMBER; TEMP_ID NUMBER; COUNTS NUMBER; TEMP_TYPE_ORDER TYPE_ORDER; BEGIN N := 0; RETURN_ORDERS := TABLE_ORDER(); WHILE N < 5 LOOP UPDATE TEST_ORDER O SET O.O_FLAG = '2', O.O_STAFF = 9988 WHERE O.O_FLAG = '0' AND ROWNUM = 1 RETURNING O.O_ID INTO TEMP_ID; COUNTS := SQL%ROWCOUNT; COMMIT; IF COUNTS > 0 THEN RETURN_ORDERS.EXTEND; DBMS_OUTPUT.PUT_LINE(RETURN_ORDERS.COUNT); TEMP_TYPE_ORDER := TYPE_ORDER(TEMP_ID); RETURN_ORDERS(RETURN_ORDERS.COUNT) := TEMP_TYPE_ORDER; ELSE -- 如果没有更新了,就不要保存数据到数组并且直接返回,防止重复数据以及避免不必要的执行 RETURN; END IF; N := N + 1; END LOOP; END; END; -- 测试,打印出被更新记录的id DECLARE RETURN_ORDER TABLE_ORDER; COUNTS NUMBER; INDEXS NUMBER; BEGIN INDEXS := 0; PACKAGE_ORDER.PROC_ORDER(RETURN_ORDER); COUNTS := RETURN_ORDER.COUNT; WHILE INDEXS < COUNTS LOOP DBMS_OUTPUT.PUT_LINE(RETURN_ORDER(INDEXS + 1).ORDER_ID); -- 数组下标从一开始 INDEXS := INDEXS + 1; END LOOP; END;
使用java程序调用该存储过程,核心代码为:
private static void returnArray() { try { Connection connection = getConnection(); CallableStatement statement = connection.prepareCall("{call PACKAGE_ORDER.PROC_ORDER(?)}"); statement.registerOutParameter(1, Types.ARRAY, "TABLE_ORDER"); statement.execute(); Array array = statement.getArray(1); ResultSet resultSet = array.getResultSet(); while (resultSet.next()) { STRUCT struct = (STRUCT) resultSet.getObject(2); Object[] os = struct.getAttributes(); for (Object o : os) { System.out.println(o); } } connection.close(); } catch (SQLException e) { e.printStackTrace(); } }
相关文章推荐
- oracle 存储过程返回对象数组的方法
- Oracle 存储过程返回数组记录集
- 一个oracle函数返回数组的例子
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- java调用oracle返回结果集的存储过程
- 解决C#中用Oracle执行存储过程返回DataSet的问题
- Oracle程序包(存储过程)返回记录集
- Oracle 存储过程返回结果集怎么这么费劲?
- oracle 实现 split 函数 (返回数组)
- [Oracle]分割字符串返回数组
- 解决C#中用Oracle执行存储过程返回DataSet的问题
- 一个简单的oracle函数返回数组的例子
- Oracle 实现 split 函数 (返回数组)
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- oracle 动态调用存储过程,返回游标类型
- Ms Sql 和 Oracle 调用返回多条记录的存储过程
- Oracle 函数/存储过程返回结果
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- 分割字符串成数组并返回数组的长度(Oracle)