### Java代码常用技巧:Oracle数据库表操作返回值处理方法 #### 概述 在实际的软件开发工作中,处理数据库查询结果是一项常见的任务。本篇主要介绍如何利用Java语言结合Oracle数据库进行表操作,并通过示例代码展示了一种复杂的查询结构。这种结构能够支持对特定项目下的多个业务场景进行数据抽取,例如项目的创建日期、开票日期、收款日期及付款日期等信息。本文将详细介绍这一过程,以及如何使用`List<Map<String,List<Map<String,String>>>>`来存储这些查询结果。 #### Oracle数据库表操作 我们来看一下Oracle数据库中的存储过程`COST_PAID`。此过程的主要功能是根据提供的`project_id`查询与该项目相关的各种财务信息,并将其封装为一个复杂的数据结构返回。 #### 存储过程定义 ```sql CREATE OR REPLACE PROCEDURE COST_PAID ( project_id VARCHAR2, Cost_paid SYS_REFCURSOR ) IS BEGIN OPEN Cost_paid FOR SELECT tmp.*, cc.customer_name received_company_name, cc2.customer_name paied_company_name FROM (SELECT '' AS received_company, '' AS paied_company, '' AS currency_des, 0 AS tamount, p.created_dtm_loc AS pcreateDtmLoc, '0' AS dtype FROM prj_project p WHERE p.project_id = '2881821536584e8b013658b84890002f' UNION ALL -- 开票日期invoice_date SELECT i.invoice_company AS received_company, '' AS paied_company, i.target_currency_name AS currency_des, i.target_amount AS tamount, i.invoice_date AS invoiceDate, '1' AS dtype FROM inv_invoice i LEFT JOIN oam_oa_invoice_assn o ON (i.invoice_id = o.invoice_id AND o.process_type = 'GRI') LEFT JOIN prj_cost c ON (o.cost_id = c.cost_id) WHERE c.project_id = '2881821536584e8b013658b84890002f' AND i.invoice_date IS NOT NULL UNION ALL -- 收款日期 SELECT icb.received_company, icb.paied_company, (SELECT cc.currency_description FROM com_currency cc WHERE cc.currency_code = icb.currency_code) AS currency_des, icb.amount AS tamount, icb.created_dtm_loc AS icbCreateDtmLoc, '2' AS dtype FROM inv_cash_bill icb INNER JOIN oam_oa_invoice_assn oia ON (icb.cash_bill_id = oia.cash_bill_id) INNER JOIN (SELECT i.* FROM inv_invoice i LEFT JOIN oam_oa_invoice_assn ON (i.invoice_id = oam_oa_invoice_assn.invoice_id AND oam_oa_invoice_assn.process_type = 'GRI') LEFT JOIN prj_cost c ON (oam_oa_invoice_assn.cost_id = c.cost_id) WHERE c.project_id = '2881821536584e8b013658b84890002f' AND i.invoice_date IS NOT NULL) invoice_table ON (oia.invoice_id = invoice_table.invoice_id) WHERE oia.invoice_id IS NOT NULL AND icb.receive_flag = 1 UNION ALL SELECT icb.received_company, icb.paied_company, '' AS currency_des, icb.amount AS tamount, icb.created_dtm_loc AS icbCreateDtmLoc, '2' AS dtype FROM inv_cash_bill icb INNER JOIN oam_oa_invoice_assn oia ON (icb.cash_bill_id = oia.cash_bill_id) LEFT JOIN prj_cost c ON (oia.cost_id = c.cost_id) WHERE c.project_id = '2881821536584e8b013658b84890002f' AND oia.invoice_id IS NULL AND icb.receive_flag = 1 UNION ALL -- 付款日期 SELECT icb.received_company, icb.paied_company, ``` #### Java端处理逻辑 在Java端,为了能够灵活地处理这种复杂的数据结构,可以采用`List<Map<String,List<Map<String,String>>>>`这样的形式。这种多层嵌套的集合结构能够很好地适应不同的数据需求。 - **第一层**:`List`用于存储所有记录。 - **第二层**:`Map<String,List<Map<String,String>>>`用于按类型(`dtype`)分组。 - **第三层**:`List<Map<String,String>>`用于存储每一类型的记录。 - **第四层**:`Map<String,String>`表示每一条具体的记录。 #### 实现细节 1. **建立连接与执行存储过程**: - 使用`DriverManager.getConnection()`获取数据库连接。 - 创建CallableStatement对象,并设置IN参数`project_id`。 - 执行存储过程并获取ResultSet。 2. **解析结果集**: - 遍历ResultSet,构建相应的数据结构。 - 对于每一行记录,提取字段信息,并按照`dtype`进行分类。 3. **数据结构构建**: - 使用HashMap和ArrayList组合实现多层嵌套结构。 - 按照`dtype`的值,将数据放入对应的列表或映射中。 #### 总结 通过上述分析,我们可以看到,使用Java处理Oracle数据库的复杂查询结果时,不仅需要熟悉SQL语法,还需要掌握如何在Java中构建灵活的数据结构来适应各种查询结果。这种能力对于提高软件开发效率和质量非常重要。希望这篇内容能帮助读者更好地理解Java在处理数据库查询方面的应用技巧。














- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 发展的现状国家教委全国中小学计算机教育研究中心王珏(1).docx
- 大数据背景下提升高校财务人员服务态度的思考(1).docx
- 企业管理信息化项目建设风险研究-1(1).docx
- 数据挖掘考试题.doc
- Linux服务器系统常用服务器配置手册模板.doc
- 《计算机导论》课程教学实践与研究(1).docx
- 会计实务:十条EXCEL使用技巧(1).doc
- 一节不定积分概念及其计算法概述市公开课一等奖百校联赛特等奖课件.pptx
- 数据库设计综合规范和值得注意的问题.docx
- 通信无线设备施工安全技术交底记录表(1).doc
- 白皮书-DSG-ETLPlus数据实时抽取增强解决方案-Oracle(1).doc
- 整数指数幂的运算法则pp市公开课一等奖百校联赛获奖课件.pptx
- 数据库及其应用.ppt
- 多媒体教室计算机室制度(4)(1).doc
- 叉车液压系统集成块及其加工工艺的设计模板.doc
- 网站编辑员工的辞职报告-(1).docx


