ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

19 篇文章 0 订阅
5 篇文章 0 订阅

陈科肇

示例:

包规范

CREATE OR REPLACE PACKAGE PACK_WMS_YX IS
  -- Author  : CKZ
  -- Created : 2015/8/28 9:52:29
  -- Purpose : 同步数据

  -- Public type declarations,游标 退休订单
  TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co_return%ROWTYPE;

  -- 同步退货订单,返回退货订单列表集合游标
  PROCEDURE sp_syn_returned(errno OUT NUMBER,errtext OUT VARCHAR2,outCursor OUT retCursor);

END PACK_WMS_YX;

包主体

CREATE OR REPLACE PACKAGE BODY PACK_WMS_YX IS
  -- Author  : CKZ
  -- Created : 2015/8/28 9:52:29
  -- Purpose : 同步数据

  -- Public variables declarations,执行状态
  v_errorcode wms_sys_sperror.errorcode%TYPE;
  v_errormsg wms_sys_sperror.errormsg%TYPE;
  v_exception EXCEPTION;--自定义异常



  -- 同步退货订单
  PROCEDURE sp_syn_returned(errno OUT NUMBER,errtext OUT VARCHAR2,outCursor OUT retCursor) IS
  BEGIN
    errno :=0;
    errtext:='success';
    --打开游标,获取数据
    OPEN outCursor FOR SELECT co_num,cust_code,qty_sum,amt_sum,crt_date,born_date FROM vi_co_co_return;
  EXCEPTION--异常
    WHEN OTHERS THEN
      ROLLBACK;
      v_errorcode:=SQLCODE;
      v_errormsg:=substr(SQLERRM,200);
      errno:=1;
      errtext:=v_errormsg;
      pack_wms_pub.sp_wms_insertSpErr('同步退货订单,返回退货订单列表集合游标',v_errorcode,v_errormsg);
  END sp_syn_returned;

BEGIN
  -- Initialization
  NULL;
END PACK_WMS_YX;

PL/SQL调用示例

选中要测试的存储过程名,右键->Test
将看到这个页面
示例图
执行Start debugger,Run
示例图
查看游标数据
示例图

JAVAWEB、HIBERNATE调用示例

注:由于后期修改,这里只有一个输出参数和一个输入参数,动态游标查询

/**
     * 查询所有报损报溢单信息
     * 
     * @return 报损报溢单列表信息
     * @throws Exception
     */
    public List queryReturnedBillByCondition(HashMap conditionMap)
            throws Exception {
        HashMap<String, String> configMap = new HashMap<String, String>();
        int start = 0;
        int limit = 12;
        String condition = "";
        if (!conditionMap.isEmpty()) {
            if (!ConvertUtil.getConditonMapValue(conditionMap, "start").equals("")) {
                start = Integer.parseInt(ConvertUtil.getConditonMapValue(conditionMap, "start"));
            }
            if (!ConvertUtil.getConditonMapValue(conditionMap, "limit").equals("")) {
                limit = Integer.parseInt(ConvertUtil.getConditonMapValue(conditionMap, "limit"));
            }
        }
        condition = GetCondition(conditionMap);
        Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
        String procName = "{CALL pack_wms_yx.sp_syn_returned(?,?)}";
        CallableStatement proc = citePro(session, procName);
        String querySql = "SELECT r.co_num,r.cust_code,r.qty_sum,r.amt_sum,r.crt_date,r.born_date" +
                            " FROM vi_co_co_return r" +
                            " WHERE 1=1 "+condition;
        proc.setString(1, querySql);
        proc.registerOutParameter(2, OracleTypes.CURSOR);
        ResultSet rs = null;
        List list = null;
        try {
            proc.execute();
            rs = (ResultSet) proc.getObject(2);
            list = ResultUtils.toList(rs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

ResultUtils.java处理工具

原文:GITHUB

package com.usercard.jdbc;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;

public class ResultSetUtils
{
    /**
     * @author 王威 
     * 用于将ResultSet结果集转化成实体类列表或者List<Map<String,Object>>结果集的工具类,
     * 用于调用存储过程返回游标结果集转换成实体列表或者List<Map<String,Object>>结果集
     * @param <T>
     */
    public static List<Map<String, Object>> toList(ResultSet rs)
    {
        Map<String, Object> record = null;
        List<String> columnNameList = new ArrayList<String>();
        List<Map<String, Object>> recordSet = new ArrayList<Map<String, Object>>();
        try
        {
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
            {
                String columnName = rs.getMetaData().getColumnName(i)
                        .toLowerCase();
                columnNameList.add(columnName);
            }
            while (rs.next())
            {
                record = new HashMap<String, Object>();
                for (String columnName : columnNameList)
                    record.put(columnName, rs.getObject(columnName));

                recordSet.add(record);
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException(e.getMessage());
        }

        return recordSet;
    }

    public static <T> List<T> toList(ResultSet rs, Class<T> classType)
    {
        List<String> columnNameList = new ArrayList<String>();
        List<T> entityList = null;
        try
        {
            entityList = new ArrayList<T>();
            Field[] fields = classType.getDeclaredFields();

            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
            {
                String columnName = rs.getMetaData().getColumnName(i)
                        .toUpperCase();
//                System.out.println("columnName=> " + columnName);
                columnNameList.add(columnName);
            }
            while (rs.next())
            {
                T entity = classType.newInstance();
                for (Field field : fields)
                {
                    String fieldName = field.getName();
                    // 如果实体类中的fieldName在ResultSet中没有,不索引取值,防止出现异常
                    if (columnNameList.contains(fieldName.toUpperCase()))
                    {
//                        System.out.println("fieldName=> " + fieldName);
                        BeanUtils.setProperty(entity, fieldName, rs
                                .getObject(fieldName));
                    }
                }
                entityList.add(entity);
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException(e.getMessage());
        }

        return entityList;
    }

    public static Object toSingleResult(ResultSet rs)
    {
        Object result = null;
        try
        {
            while (rs.next())
            {
                result = rs.getObject(1);
                break;
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException(e.getMessage());
        }

        return result;
    }

    @SuppressWarnings("unchecked")
    public static List toArrayList(ResultSet rs)
    {
        List arrayList = null;
        try
        {
            arrayList = new ArrayList();
            int iCol = rs.getMetaData().getColumnCount();
            while (rs.next())
            {
                Object[] objArray = new Object[iCol];
                for (int i = 1; i <= iCol; i++)
                {
                    objArray[i - 1] = rs.getObject(i);
                }
                arrayList.add(objArray);
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException(e.getMessage());
        }

        return arrayList;
    }

    public static Map<String, Object> toHashMap(ResultSet rs)
    {
        List<String> columnNameList = new ArrayList<String>();
        Map<String, Object> record = new HashMap<String, Object>();
        try
        {
            int iRow = 0;
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
            {
                String columnName = rs.getMetaData().getColumnName(i)
                        .toLowerCase();
                columnNameList.add(columnName);
            }
            while (rs.next())
            {
                if (iRow > 1)
                    throw new RuntimeException(
                            "返回Map<String,Object>类型只能存放一条记录!");
                for (String columnName : columnNameList)
                    record.put(columnName, rs.getObject(columnName));
                iRow++;
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException(e.getMessage());
        }

        return record;
    }

    public static <T> T toBean(ResultSet rs, Class<T> classType)
    {
        T entity = null;
        List<String> ColumnNameList = new ArrayList<String>();
        try
        {
            entity = classType.newInstance();
            Field[] fields = classType.getDeclaredFields();
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
            {
                String columnName = rs.getMetaData().getColumnName(i)
                        .toUpperCase();
//                System.out.println("columnName=> " + columnName);
                ColumnNameList.add(columnName);
            }
            while (rs.next())
            {
                for (Field field : fields)
                {
                    String fieldName = field.getName();
                    // 如果实体类中的fieldName在ResultSet中没有,不索引取值,防止出现异常
                    if (ColumnNameList.contains(fieldName.toUpperCase()))
                    {
//                        System.out.println("fieldName=> " + fieldName);
                        BeanUtils.setProperty(entity, fieldName, rs
                                .getObject(fieldName));
                    }
                }
                break;
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException(e.getMessage());
        }

        return entity;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle 存储过程中可以使用游标处理结果游标是一种指向结果的命名数据结构,可以通过游标来访问结果中的数据行。下面是一个简单的示例,演示了如何在 Oracle 存储过程中使用游标。 ```sql CREATE OR REPLACE PROCEDURE my_proc IS -- 声明游标类型 CURSOR my_cursor IS SELECT column1, column2, column3 FROM my_table WHERE column4 = 'some condition'; -- 声明游标返回的数据类型 TYPE my_cursor_type IS RECORD ( column1 my_table.column1%TYPE, column2 my_table.column2%TYPE, column3 my_table.column3%TYPE ); -- 声明变量来存储游标返回的数据 my_data my_cursor_type; BEGIN -- 打开游标 OPEN my_cursor; -- 循环遍历游标返回的结果 LOOP -- 获取下一行数据 FETCH my_cursor INTO my_data; -- 判断是否还有数据 EXIT WHEN my_cursor%NOTFOUND; -- 处理游标返回的数据 -- ... END LOOP; -- 关闭游标 CLOSE my_cursor; END; ``` 在这个示例中,我们首先声明了一个游标类型 `my_cursor`,并且定义了游标返回的数据类型 `my_cursor_type`。然后我们声明了一个变量 `my_data`,用来存储游标返回的数据。 在存储过程主体中,我们首先打开游标 `my_cursor`,然后使用 `LOOP` 循环遍历游标返回的结果。在循环体中,我们使用 `FETCH` 语句获取下一行数据,并且判断是否还有数据。如果没有数据了,我们使用 `EXIT` 语句退出循环。否则,我们可以处理游标返回的数据,比如将其插入到另外一个表中。最后,我们关闭游标 `my_cursor`,释放资源。 需要注意的是,在存储过程中使用游标可能会影响性能,特别是当处理大量数据时。因此,我们应该尽可能地使用 SQL 查询语句来处理结果,而不是使用游标

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值