Oracle数据库查询表中记录为空,Empty result set fetched

本文介绍在Oracle数据库中如何处理查询空结果集的问题,通过使用COUNT()函数和CASE...WHEN语句进行条件判断,确保即使在无数据的情况下也能进行求和计算,避免程序因空结果集而中断。

Oracle数据库查询表中记录为空,Empty result set fetched,此时没有数据,获取不到任何值,但是此时我们需要根据结果来做计算,因此可以使用count()函数来做结果统计,将统计结果用来做判断。

场景:需要查询出结果用于求和计算,没有结果时取0。
方案:使用case...when做sql的条件判断,当有结果为1时表示有记录,此时使用查询到的记录,当结果是其他时表示没有记录,此时count()统计数据为0,用统计结果做结果返回用于求和运算;

sql如下:

select count(1) from ldsysvar where sysvar='onerow' and ((
select Mult*50 from lspol where contno='?ContNo?' and riskcode='00963000'
)+(
(
case (select count(STANDBYFLAG1*100) from lspol where contno='?ContNo?' and riskcode in ('00958100') )
when 1 then (select STANDBYFLAG1*100 from lspol where contno='?ContNo?' and riskcode in ('00958100'))
else (select count(STANDBYFLAG1*100) from lspol where contno='?ContNo?' and riskcode in ('00958100') )
end
)
))>500 and '?RiskCode?' in ('00963000','00554000');


 

### Oracle 数据库中的回表概念 在Oracle数据库中,“回表”通常指的是当查询涉及多个列时,如果这些列并未全部存储在一个索引结构中,则需要返回到实际的数据块(即基表)去获取额外的信息。这种行为会增加I/O成本和延迟,从而影响整体性能。 #### 回表的工作机制 假设存在一张名为`employees`的表,并且该表上有一个基于`employee_id`字段的B树索引。当执行如下SQL语句: ```sql SELECT employee_name FROM employees WHERE employee_id = 10; ``` 在这种情况下,优化器可能会利用`employee_id`上的索引来快速定位符合条件的记录位置。然而,如果目标列`employee_name`并不包含在索引节点中,则即使找到了匹配的键值,仍需访问对应的基表数据块以提取所需的`employee_name`信息。这就是所谓的“回表”。 #### 性能问题分析 频繁发生回表现象可能导致以下几方面的问题: - **高磁盘读取量**:每次回表都需要从磁盘加载新的数据页。 - **CPU资源消耗增大**:更多的逻辑操作意味着更高的处理器负载。 - **响应时间延长**:增加了每条请求完成所需的时间长度。 以上情况均可以通过适当调整设计策略加以缓解[^1]。 #### 解决方案与优化建议 ##### 创建覆盖索引(Covering Indexes) 为了减少甚至消除不必要的回表动作,可以考虑构建复合型或功能性的索引使得所有需要用到的字段都能够被包含进来形成所谓"覆盖索引". 这样一来,在满足特定查询需求的时候就无需再回到原始表格里寻找缺失部分了. 例如对于上述例子而言,我们可以在建立联合索引的同时也将经常检索的目标属性加入其中: ```sql CREATE INDEX idx_emp_id_name ON employees(employee_id, employee_name); ``` 这样做的好处在于一旦命中此新创建出来的组合索引之后便可以直接从中获得想要的结果而不必再去触碰底层物理文件系统层面的东西了[^2]. ##### 调整查询逻辑 有时也可以通过对应用程序端发出的具体命令稍作修改达到相同目的;比如尽量选取那些已经存在于现有单一索引内部成员变量集合内的项目作为最终输出项之一即可有效降低此类事件发生的概率水平。 另外需要注意的是合理安排过滤条件的位置也很重要——按照优先级先后次序排列能够帮助引擎更快锁定范围进而缩短整个流程耗时时长[^3]. ##### 使用缓存技术或其他高级特性 除了单纯依赖于传统意义上的二级索引之外还可以探索更多可能性比如说引入分区表、物化视图等手段进一步增强系统的吞吐能力同时兼顾灵活性方面的考量因素[^4]. ```python # Python 示例展示如何模拟简单的缓存机制 class CacheSimulator: def __init__(self): self.cache_store = {} def fetch_data(self, key): if key not in self.cache_store: # Simulate fetching from database and caching it. value = f"Fetched Value For {key}" self.cache_store[key] = value return self.cache_store.get(key) cache_sim = CacheSimulator() print(cache_sim.fetch_data('EMPLOYEE_ID_1')) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值