【置顶】全局变量的好处与坏处

近日在做项目的过程中对plsql的使用非常多,主要是编写存储过程实现业务逻辑。但是在coding的过程中遇到非常奇怪的问题。

问题是:在package包头中定义了一个变量,current_time := sysdate,然后在procedure使用这个定义的变量,直接insert到表里。一个很简单的实现吧。

但是奇怪的是,每次insert到表里的这个时间莫名其妙的会变化,有时候是正确的,有时候就是一个不确定的时间,有时候每次都和上次的时间一样,真是令人头疼不已。

下面先看一下代码片段吧。

package包头:

 

  1. create or replace package PKG_LIFE_AML_DATA is  
  2.   
  3.   CURRENT_TIME date := sysdate;  
  4.   
  5.   procedure T_NORMAL(i_start_date in varchar2,  
  6.                      i_end_date in varchar2,  
  7.                      i_organ_id in t_company_organ.organ_id%TYPE);  


package包体(仅仅取最关键部分的代码):

 

  1. procedure T_NORMAL(i_start_date in varchar2,  
  2.                      i_end_date in varchar2,  
  3.                      i_organ_id in t_company_organ.organ_id%TYPE) is  
  4.   
  5.     insert into t_su_data  
  6.         (insert_time)  
  7.       values  
  8.          (CURRENT_TIME);  
  9.  end;  

通过上述代码不难看出,这其实是一个非常简单的conding。。。但是确实是有问题的。问题就是处在这个CURRENT_TIME的定义的位置,它其实是全局变量。

 

PLSQL中的全局变量在该包初始化的时候就被赋予了值,在同一个session中不会在变化,所以这就导致了为什么每次insert的时间都不对,但是不太清楚oracle如何判断一个session的开始和结束,因为通过测试来看,其时间有时候是正确的。

所以,正确的做法是在insert数据的时候,直接使用该sysdate,而不在包头的地方将sysdate赋值给CURRENT_TIME,因此不管是在java中还是在plsql中全局变量能不用就不用的,那么什么时候可以使用呢?

1.最简单的,它是个常量,它永远不会变,那么定义成全局变量会非常好用。

2.package_B想使用package_A中的一个值或者变量,那么这时候就可以再package_A中定义个全局变量 CURRENT_TIME(不赋值,仅定义),在存储过程中对其赋值;这时候切换到package_B,那么在package_B中只需要调用package_A.CURRENT_TIME即可,就能获得package_A中的变量值,然后在package_B中根据此值做一些操作。这样非常好用。

      总结一下,变量不要定义成全局变量!太危险啦~

转载于:https://www.cnblogs.com/jason001/p/4134033.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三个线程按顺序输出数字

当 n 3N 时&#xff0c;线程1输出 当 n 3N 1 时&#xff0c;线程2输出 当 n 3N 2 时&#xff0c;线程3输出 最终的输出为 0、1、2、3、4、5、6、7、8、10 #include <iostream> #include <thread> #include <mutex> #include <condition_variable&g…

TextView实现自动滚动滚动.

必须有要四个属性: android:ellipsize"marquee"; android:focusable"true";android"focusableInTouchMode"true";android:singleLine"true"; <TextViewandroid:layout_width"fill_parent"android:layout_height&quo…

用最少数量的箭引爆气球

在二维空间中有许多球形的气球。对于每个气球&#xff0c;提供的输入是水平方向上&#xff0c;气球直径的开始和结束坐标。由于它是水平的&#xff0c;所以y坐标并不重要&#xff0c;因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球…

ExtJS中使用ztree 不显示树的解决办法

最近部门同事碰到一个问题&#xff0c;将ztree嵌入在套了几层Panel的面板中不会正常显示&#xff0c;但是将上层面板换成window就能正常显示&#xff0c;开始以为是所在的外部容器不管嵌套了几层&#xff0c;但是必须最底层是window容器&#xff0c;但是测试后发现不是这样的&a…

寻找小镇的法官

在一个小镇里&#xff0c;按从 1 到 N 标记了 N 个人。传言称&#xff0c;这些人中有一个是小镇上的秘密法官。 如果小镇的法官真的存在&#xff0c;那么&#xff1a; 小镇的法官不相信任何人。 每个人&#xff08;除了小镇法官外&#xff09;都信任小镇的法官。 只有一个人同…

事务的隔离界别

事务的ACID特性&#xff1a; 1、Atomicity原子性 事务操作的不可分割性&#xff0c;要么全部执行&#xff0c;要么回滚。 2、Consistency一致性 数据库在事务处理前后处于的一致性状态。如银行转账&#xff0c;两个账户转账前的状态和转账后的状态必须一致。 3、Isolation隔离…

程序员福利各大平台免费接口非常适用

电商接口 京东获取单个商品价格接口: http://p.3.cn/prices/mgets?skuIdsJ_商品ID&type1 ps:商品ID这么获取:http://item.jd.com/954086.html 物流接口 快递接口: http://www.kuaidi100.com/query?type快递公司代号&postid快递单号 ps:快递公司编码:申通”shentong”…

WriteN, RTMP send error

WriteN, RTMP send error 32 (133 bytes) WriteN, RTMP send error 32 (49 bytes) WriteN, RTMP send error 9 (42 bytes)现象&#xff1a; 推流失败&#xff0c;srs服务出错。 原因 视频流较慢&#xff0c;音频流较快。 复现 视频解码得到帧数据&#xff0c;用异步接口处…

样式公用代码

/************** bug ************/.clearfix:after {content:""; display:block; height:0px; clear:both; overflow:hidden;}.clearfix {display:inline-block;}.clearfix {display:block;} /************** 公共用 ************/html {overflow:-moz-scrollbars-v…

即时聊天IM之二 openfire 整合现有系统用户

合肥程序员群&#xff1a;49313181。 合肥实名程序员群&#xff1a;128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojitqq.com 综述&#xff1a; 每天利用中午时间更新下这个知识点的的博客如果感兴趣的觉得更新慢了也别介意&#xff08;其它时间还是…

cannot convert ‘_IO_FILE*’ to ‘const char*

错误代码 #ifdef NDEBUG#define DBUG_PRINT(fmt, ...) #else#define DBUG_PRINT(fmt, ...) printf(fmt, ##__VA_ARGS__) #endifBUG_PRINT(stderr, "decode %s does not support device type cuda.\n", dec->name);修改 BUG_PRINT("decode %s does not supp…

找出数组中前K大的值

将数组划分为两部分&#xff0c;前K项为前K大值的集合&#xff0c;无需有序。 while(true) {int flag nums[k];while(i < k && nums[i] > flag) {i;}while(j>k && nums[j] < flag) {j--;}if (i j || nums[i] nums[j]) {break;}int tmp nums[i]…

C#在ASP.NET4.5框架下的首次网页应用

运行效果预览: 先看实践应用要求: 1&#xff0e;编写一个函数&#xff0c;用于计算1&#xff01;2&#xff01;3&#xff01;4&#xff01;5&#xff01;&#xff0c;在控制台或页面输出运行结果。 2&#xff0e;在控制台或页面输出九九乘法表。 3&#xff0e;输入10个以内的整…

javascript的变态位运算

javascript的变态位运算 var a "10" | 0; alert(a); alert (typeof a);结果为10,number。 这就是说这条语句可以将字符串转化为number。 如果&#xff1a;var a "sss" | 0;alert(a);结果为0.parseInt("sss")的话&#xff0c;会返回NaN。这个太…

CUDA: OpenCV requires enabled ‘cudev‘ module from ‘opencv_contrib

wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.X.X.zip unzip opencv_contrib.zip cmake -D OPENCV_EXTRA_MODULES_PATH~/opencv_contrib-4.X.X/modules参考

Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解...

转 一、介绍 Android-Universal-Image-Loader是 一个开源的UI组件程序&#xff0c;该项目的目的是提供一个可重复使用的仪器为异步图像加载&#xff0c;缓存和显示。所以&#xff0c;如果你的程序里需要这个功能的话&#xff0c;那么不妨试试它。 因为已经封装好了一些类和方法…

营销类文章 SEO

如何有效的推广网站 适合没钱的中小站长 唐世军 a5总经理 博客 门户网站广告报价—以新浪为例 贵的一天30多万 碧蓝天营销学院 网络营销&#xff0c;你真的了解吗&#xff1f; SEO工具mozBar介绍、友情链接新参考mozRank 谈谈网络推广团队每天工作流程、工作标准、考核 请问安卓…

显示 grep 结果的指定行

用grep查找特定关键字&#xff0c;结果很多&#xff0c;但是有用的在中间的某几行&#xff0c;即grep得到结果之后再次过滤出指定几行。 首先查找指定行 grep -a "X" filename | grep -an "X"记下指定行&#xff0c;然后用awk打印指定行 grep -a "…

Java小知识

内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。(1)、内部类仍然是一个独立的类&#xff0c;在编译之后内部类会被编译成独立的.class文件&#xff0c;但是前面冠以外部类的类名和$符号。(2)、内部类不能用普通的方式访问。成员变量成员变量静态成员变量。List遍…

C++ 设置线程名字

使用 std::thread #include <thread> #include <pthread.h>std::thread t(funs, args); pthread_setname_np(t.native_handle(), threadName);通过 pthread_create 创建 #define _GNU_SOURCE #include <pthread.h>pthread_t tid; pthread_create(&ti…