您的位置:首页 > 数据库 > Oracle

oracle 存储过程返回数组

2016-12-29 16:00 363 查看
oracle存储过程想要返回数组,需要使用到临时表,具体的操作流程如下

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 存储过程