PACKAGE静态缓存数据带来的逻辑隐患

构建高可信发布流程:从代码提交到用户满意的五道质量门禁 软件发布流程本质上是工程化风险控制体系,其核心在于将不确定性拆解为可重复、可验证、可追溯、可放弃的标准化环节。基于Trunk-Based Development(TBD)与特性开关实践,现代发布已超越CI/CD流水线执行层面,演进为覆盖代码门禁、构建门禁、环境门禁、发布门禁和观测门禁的全链路质量保障机制。该体系支撑日均27次发布仍保持高稳定性,适用于微服务架构、云原生交付及SRE实践场景,尤其解决灰度放量失控、回滚数据不一致、预发与生产环境差异等高频痛点。 阅读详情

在一个项目中,有一张参数表保存了一些全局变量,比如当前会计周期等。
通过一个包(PACKAGE)来实现业务逻辑,在PACKAGE的初始化程序里,读取相关的全局参数,用于后续处理程序。
但是在调试过程中,发现对参数进行修改后,包的全局变量跟实际库里的值不一致,导致业务逻辑错误。这里重现一下当时的场景:

--参数表结构
CREATE TABLE T_PARA
(PARA_CODE  VARCHAR2(20)
,PARA_NAME  VARCHAR2(60)
,PARA_VALUE VARCHAR2(60)
);
--其中一个参数:当前会计期,值是201801
INSERT INTO T_PARA VALUES('ACCYEARMON','当前会计期','201801');
commit;
/*
--包头
--定义了当前会计期的全局变量
*/
create or replace package PKG_SESSIONDAT is
  --全局变量,当前会计期
  G_ACCYEARMON   VARCHAR2(6);
  --返回G_ACCYEARMON值
  function GET_ACCYEARMON return VARCHAR2;
  --设置参数值
  PROCEDURE SET_ACCYEARMON(V_ACCYEARMON VARCHAR2);

end PKG_SESSIONDAT;

--包体
create or replace package body PKG_SESSIONDAT is
  --函数,返回当前会计期
  function GET_ACCYEARMON return VARCHAR2 IS
    v_ret t_para.para_value%type;
  BEGIN
    v_ret:=G_ACCYEARMON;
    return v_ret;
  END GET_ACCYEARMON;
  --存储过程,设置当前会计期
  PROCEDURE SET_ACCYEARMON(V_ACCYEARMON VARCHAR2) IS
  BEGIN
    UPDATE T_PARA SET PARA_VALUE=V_ACCYEARMON WHERE PARA_CODE='ACCYEARMON';
    COMMIT;
  END SET_ACCYEARMON;

begin
  --包初始化部分,调用包程序就会执行
  SELECT PARA_VALUE INTO G_ACCYEARMON
    FROM T_PARA
    WHERE PARA_CODE='ACCYEARMON';
end PKG_SESSIONDAT;

接下来做个测试,先取出初始会计期的值,然后重新设置该值,再取出来。

SQL> declare
  2    v_true varchar2(6);
  3  begin
  4    dbms_output.put_line('G_ACCYEARMON初始值='||PKG_SESSIONDAT.G_ACCYEARMON);
  5    dbms_output.put_line('GET_ACCYEARMON返回='||PKG_SESSIONDAT.GET_ACCYEARMON);
  6    PKG_SESSIONDAT.SET_ACCYEARMON('201802');
  7    dbms_output.put_line('重置后G_ACCYEARMON='||PKG_SESSIONDAT.G_ACCYEARMON);
  8    dbms_output.put_line('重置后GET_ACCYEARMON返回='||PKG_SESSIONDAT.GET_ACCYEARMON);
  9    select PARA_VALUE into v_true
 10      from T_PARA WHERE PARA_CODE='ACCYEARMON';
 11    dbms_output.put_line('数据库内真实值='||v_true);
 12  end p_test;
 13  /
G_ACCYEARMON初始值=201801
GET_ACCYEARMON返回=201801
重置后G_ACCYEARMON=201801
重置后GET_ACCYEARMON返回=201801
数据库内真实值=201802
PL/SQL procedure successfully completed

可以发现,用包里的存储过程对数据库值进行重置后,再调用包函数,全局变量的值没有变化,尽管数据库的值已经被重写了。
合理的解释是包的初始化程序没有再次执行。
查阅资料后验证了这一点:

在同一个会话中,包的初始化只执行一次。

刚才的示例中,换一个session,得到的值是正确的:

SQL> declare
  2    v_true varchar2(6);
  3  begin
  4    select PARA_VALUE into v_true
  5      from T_PARA WHERE PARA_CODE='ACCYEARMON';
  6    dbms_output.put_line('数据库内真实值='||v_true);
  7    dbms_output.put_line('另一个会话G_ACCYEARMON值='||PKG_SESSIONDAT.G_ACCYEARMON);
  8    dbms_output.put_line('另一个会话GET_ACCYEARMON返回='||PKG_SESSIONDAT.GET_ACCYEARMON);
  9  end;
 10  /
数据库内真实值=201802
另一个会话G_ACCYEARMON值=201802
另一个会话GET_ACCYEARMON返回=201802
PL/SQL procedure successfully completed

Oracle这样做的目的是提高效率、节省资源。但一不留心会给开发人员带来副作用,如何避免这类情况的产生,建议是:
将初始化程序单独封装成存储过程,在适当的时候进行调用。
比如上述案例:

  PROCEDURE Initialization IS
  BEGIN
    SELECT PARA_VALUE INTO G_ACCYEARMON
      FROM T_PARA
      WHERE PARA_CODE='ACCYEARMON';
  END Initialization;
【信息科学与工程学】【通信工程】第七十三篇 分组网络中服务质量保障的算法 16 编号类别领域模型配方模块跨区域算法与数学过程(含对比、方程、参数优化、QoS配置,结合SRv6 URPSF切片+FlexE切片)A238​央企:国家电网/南方电网 — 配电线路智能断路器储能弹簧状态监测(前端)关键基础设施弹簧位移传感器/电流传感器 → 边缘终端 → 配电云 → 储能弹簧疲劳/断裂预警(跨省,多Region双AZ)接入/边缘/骨干各智能断路器 ⇄ 边缘终端(5G‑A/LoRa)⇄ 省配电中心 ⇄ 国网/南网配电云(双Region双AZ)三种弹簧状态评估对比(人工机械检查 / 分合闸时间变化 阅读详情

相关推荐

SpringBoot固定资产管理系统:从数据库设计到部署上线全解析

固定资产管理系统是企业后端开发中最高频的业务场景之一,核心围绕资产入库、领用、归还、盘点等生命周期管理展开。SpringBoot凭借自动配置能力与成熟的生态,大幅降低了这类管理系统的开发门槛,同时通过MyBatis-Plus简化持久层操作,利用Redis缓存热点数据并保障编号生成的原子性,结合Spring Security与JWT实现无状态权限认证。本文从需求拆分出发,阐述数据库表结构的关键设计原则,包括金额字段精度控制、树形分类建模与索引优化,随后介绍统一返回结构、全局异常处理、参数校验等工程化实现细节,

weixin_33976072的博客 460

数据库总结第四章

第四章 数据库安全性 数据库安全性 问题的提出 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享 例: 军事秘密、国家机密、新产品实验数据、         市场需求分析、市场营销策略、销售计划、         客户档案、医疗档案、银行储蓄数据   数据库的安全性是指保护数据库以防止不合法使用所造成的数据...

程序员凯小白的博客 2185

用App Inventor做个蓝牙温湿度计,手机自动连Arduino,5分钟搞定硬件数据上屏

本文详细介绍了如何使用App Inventor和Arduino快速搭建一个蓝牙温湿度监测系统,实现手机自动连接并显示实时数据。通过图形化编程和硬件组装指南,零代码基础的用户也能在5分钟内完成硬件数据上屏,适用于智能家居、教学演示等多种场景。

weixin_30813225的博客 172

Oracle Package的全局变量与Session

Oracle Package的全局变量与Session2012-07-26 aaie_ 阅 3595 转 10简单讲,同一个session下pageckage中的全局变量时公共的,会导致冲突。以下是一些相关的资料和文章。 Oracle数据库程序包全局变量的应用1 前言  在程序实现过程中,经常用遇到一些全局变量或常数。在程序开发过程中,往往会将该变量或常数存储于临时表或前台程序的...

weixin_30732825的博客 681

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战

本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。

weixin_42103128的博客 149

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》

摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。

Celine的博客 4554

数据库 - 授权与回收安全性

计算机系统安全性为计算机系统建立和采取的各种安全保护措施,以保护计算机系统中的硬件、软件及数据,防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等。 问题的提出 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享 例: 军事秘密、国家机密、新产品实验数据、 市场需求分析、市场营销策略、销售计划、 客户

陆讯 2640

3D点云目标检测Complex-YOLO(训练篇)(一)———KITTI数据集预处理与制作

KITTI dataset Download dataset KITTI 3D Object Detection Evaluation 2017 link 下载四个部分,共41.4GB 解压后为四部分内容(相机校准矩阵calib、RGB图像image_2、标签label_2、点云数据velodyne) 对应的testing和training数据。其中,training数据为7481张(图片和点云对应的场景),testing数据 7518张(无label_2数据)。 Data Preprocess

“知识最大的敌人不是无知,而是错觉” 7152

数据库总结(四)

数据库的安全性 4.1  数据库安全性概述 4.1.1 数据库的不安全因素 1.非授权用户对数据库的恶意存取和破坏 一些黑客(Hacker)和犯罪分子在用户存取数据库时猎取用户名和用户口令,然后假冒合法用户偷取、修改甚至破坏用户数据。 数据库管理系统提供的安全措施主要包括用户身份鉴别、存取控制和视图等技术。 2.数据库中重要或敏感的数据被泄露 黑客和敌对分子千方百计盗窃数据库中的重要数据,一些机...

wangkf666的博客 354

HINT: High-quality INpainting Transformer with Mask-Aware Encoding and Enhanced Attention 训练自己的数据集

HINT(高质量图像修复变换器)通过创新的掩码感知像素洗牌下采样模块(MPD)和空间激活通道注意力层(SCAL),显著提高了图像修复的质量,尤其在大面积缺失区域的情况下。实验表明,HINT在CelebA、CelebA-HQ、Places2和敦煌数据集上超越了现有的最先进模型,提升了图像的细节和结构一致性。

LJ1147517021的博客 313

Android车载蓝牙开发全攻略:从基础到高级优化

本文系统介绍了Android车载蓝牙开发的核心技术与实践指南。文章首先阐述了蓝牙在智能汽车中的关键作用,包括免提通话、音频流媒体等应用场景。随后详细解析了蓝牙协议基础,重点介绍了HFP、A2DP等车载常用协议。开发实战部分提供了设备发现、连接、数据传输的完整代码示例,并融入多线程和内存优化技巧。通过真实车载案例,展示了启动时间、流畅度和资源使用的优化策略。最后针对面试需求,提供了专业的技术问答,涵盖蓝牙开发全流程。全文紧密结合Android车载开发职位要求,为开发者提供了一套完整的蓝牙技术解决方案。

郑伟强dev的专栏 119

package中全局变量特性

Oracle中的package对象是其他数据库中所不存在的特性之一,这是oracle面向对象编程的一种体现.我们可以像定义面向对象语言的对象一样定义oracle的package.     并为package定义对应的属性(全局变量)全局变量(可以定义在包头,也可以在包体,赋值一定在包体)和方法(function,procedure).     package的全局变量在oracle编程过程中有

Daniel's Blog 1299

YOLOv5 自定义模型 Android 部署完整指南

本文详细介绍了将YOLOv5模型部署到Android设备的完整流程,包含三个核心部分:首先验证官方模型测试,确保基础环境配置正确;随后进行模型转换,从PyTorch导出ONNX格式并优化,再转换为NCNN格式;最后在Android项目中集成自定义模型,包括文件替换、参数修改和代码适配。教程基于YOLOv5 6.1版本,使用NCNN框架进行移动端推理,涵盖了常见问题解决方案和关键配置要点,为开发者提供了从训练到部署的完整技术路线。

FJN110的博客 592

应用层隐重启机制:Spring Boot实现状态复位与流程再入

状态管理是分布式系统和应用架构设计的核心概念,涉及数据一致性、会话保持和故障恢复等关键技术原理。在业务逻辑层面,状态复位与流程再入机制能够实现应用层的透明重启,对上游调用者无感知。这种隐重启技术通过精细的状态控制和资源清理,为游戏存档、长业务流程演练、测试数据回滚等场景提供高可用保障。基于Spring Boot框架,结合事务控制和JPA持久化,可以构建稳健的隐重启逻辑,有效解决状态污染和并发安全等挑战。本文通过具体代码示例,展示如何实现支持单人反复轮回的业务流程重置机制。

weixin_34364071的博客 456

Buck电源设计常见的一些问题(四)MOS管振荡抑制方法(二)

另一方面,开关振铃为远超开关频率的高频振铃,并伴随很高的 dV/dt,会带来传导和辐射的 EMI 问题,可能会使得终端产品不能通过 EMI 标准测试,更严重时甚至会干扰开关电源自身的信号电路或临近的其他功能电路的正常工作。选用二极管反向特性好的器件;该电路可等效成图 3 中 LC 谐振电路,新的 LR和 CR为 Lp1、Lp5,Lp3, Lp4, CD等所有参与振铃的寄生感容的复合值。通常 Snubber 的 Csnub取值在数 nF 以上,在振铃频率 fR(加了 snubber 后)下的阻抗很小。

小幽余生不加糖 2893

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

构建自清洁任务系统:基于任务上下文的资源生命周期管理实践

在分布式系统和微服务架构中,任务执行过程中产生的日志文件、临时数据和缓存记录等数字足迹,若管理不当会引发安全风险与资源浪费。资源生命周期管理是解决这一问题的核心设计模式,其原理是通过统一的上下文(Task Context)绑定资源的创建与清理动作,确保任务结束时自动释放所有关联资源。这一机制的技术价值在于提升系统的安全性、可维护性和资源利用率,尤其适用于数据处理流水线、金融交易系统等高安全要求场景。本文以Spring Boot项目为例,详细演示了如何通过任务上下文和CleanableResource接口实现

weixin_33861800的博客 333

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

用热力学熵模型量化代码混乱度:软件可维护性工程实践

在软件工程中,‘可维护性’长期缺乏可测量、可建模的底层依据。本文从热力学第二定律出发,将‘熵’这一物理系统无序度的核心概念引入开发实践,构建可计算的‘代码熵值’体系——涵盖结构熵、语义熵、演化熵与运行熵四维诊断模型。通过量化混乱增长规律(如dH/dt=0.21/月),使技术债从主观感受变为可观测、可干预的工程变量;结合熵流守恒方程与负熵工坊机制,实现对设计腐化、胶水代码、配置漂移等典型熵源的精准识别与主动抑制。该方法已在电商订单、支付回调等高稳定性要求场景落地验证,显著降低P0故障率与MTTR,为中大型生产

dejz8829的专栏 440

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

微服务静默故障诊断:从可观测性到实战的圆环坠机防御方案

在分布式系统和微服务架构中,服务间的复杂依赖和资源竞争常常导致一种隐蔽的故障模式——服务进程看似存活,但已丧失处理能力,即“静默崩溃”。理解其核心原理,关键在于构建以指标、日志、链路追踪三大支柱为核心的可观测性体系。指标监控如同系统仪表盘,能实时捕捉JVM内存、线程状态、请求延迟等异常信号;链路追踪则像一张精细的地图,能精准定位请求在服务间流转的瓶颈点;而集中化的日志聚合则为根因分析提供了完整的“黑匣子”数据。这套体系的技术价值在于,它能将事后被动的故障排查,转变为事前主动的风险预警和事中快速的故障定位,是

weixin_33695450的博客 375

Vue 完整版系统知识文档

《Vue全栈开发实战手册》摘要 本手册系统整合Vue2/Vue3全栈知识体系,涵盖基础语法、组件开发、状态管理、工程化等核心内容,适合从入门到精通的完整学习路径。主要特点: 基础核心 详解MVVM架构和响应式原理(Vue2的Object.defineProperty vs Vue3的Proxy) 完整模板语法规则与16种内置指令解析 组件系统核心:通信机制(8种方案)、插槽、动态组件、递归组件 进阶实战 状态管理:Vuex/Pinia完整解决方案 路由开发:动态路由、权限控制、懒加载 工程化:Webpack

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 402

跟我一起学“网络安全”通识-Linux

本篇文章是《跟我一起学“网络安全”通识》的第三章,介绍了Linux操作系统里的一系列基础知识,包括:Linux常用Shell命令、Linux文件和目录操作、Linux磁盘管理、Linux安装Nginx、docker等。

Cool_foolisher的博客 1143

数据库第四章

                                     第四章 数据库安全性 1 .什么是数据库的安全性?         数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。 2 .数据库安全性和计算机系统的安全性有什么关系?         安全性问题不是数据库系统所独有的,所有计算机系统都有这个问题。只是在数据库系统中大量数据集中存放,而且...

Source_Roc 1156

数据库的安全性

数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。 系统安全保护措施是否有效是数据库系统主要的性能指标之一。 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。 系统安全保护措施是否有效是数据库系统主要的性能指标之一   非授权用户对数据库的恶意存取和破坏 一些黑客(Hacker)和犯罪分子在用户存取数据库时猎取用户名和用户口令...

xiamubawei的博客 3434

对于package中全局变量的一点点初级理解

首先自己将全局变量和包中的gong'y

光耀天下 3604

package的全局变量特性

摘要:Oracle中的package对象是其他数据库中所不存在的特性之一,这是oracle面向对象编程的一种体现.我们可以像定义面向对象语言的对象一样定义oracle的package.并为package定义对应的属性(全局变量)和方法(function,procedure).    package的全局变量在oracle编程过程中有很多有趣并非常实用的作用.比如,我们可以利用这个特性定义带

47522341的专栏 4862
上一篇: 行列转换之字符串拼接(三)、自定义聚合函数
下一篇: ORACLE行列转换之字符串拆分
观想
博客等级 码龄24年 70粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值