【Oracle-PLsql】全局变量的好处与坏处
来源:互联网 发布:淘宝高中语文教材卷子 编辑:程序博客网 时间:2024/04/30 21:40
近日在做项目的过程中对plsql的使用非常多,主要是编写存储过程实现业务逻辑。但是在coding的过程中遇到非常奇怪的问题。
问题是:在package包头中定义了一个变量,current_time := sysdate,然后在procedure使用这个定义的变量,直接insert到表里。一个很简单的实现吧。
但是奇怪的是,每次insert到表里的这个时间莫名其妙的会变化,有时候是正确的,有时候就是一个不确定的时间,有时候每次都和上次的时间一样,真是令人头疼不已。
下面先看一下代码片段吧。
package包头:
create or replace package PKG_LIFE_AML_DATA is CURRENT_TIME date := sysdate; procedure T_NORMAL(i_start_date in varchar2, i_end_date in varchar2, i_organ_id in t_company_organ.organ_id%TYPE);
package包体(仅仅取最关键部分的代码):
procedure T_NORMAL(i_start_date in varchar2, i_end_date in varchar2, i_organ_id in t_company_organ.organ_id%TYPE) is insert into t_su_data (insert_time) values (CURRENT_TIME); 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中根据此值做一些操作。这样非常好用。
总结一下,变量不要定义成全局变量!太危险啦~
- 【Oracle-PLsql】全局变量的好处与坏处
- 索引使用的好处与坏处(Oracle)
- 索引使用的好处与坏处(Oracle)
- 宏的好处与坏处
- 创业的好处与坏处
- 喝茶的好处与坏处
- 豆芽的好处与坏处
- 索引使用的好处与坏处(Oracle)<转>
- 使用索引(index)的好处与坏处(Oracle)
- spring IOC的好处与坏处
- 数据库索引使用的好处与坏处
- 微服务架构的好处与坏处
- 微服务架构的好处与坏处
- 结对编程的好处与坏处
- Jquery 中 bind 和 live 的好处与坏处!
- 使用iframe的好处与坏处详细比拼
- 使用iframe的好处与坏处详细比拼
- php标签不闭合的好处与坏处
- Android ---->文件下载
- JNI 介绍(一)
- 再讲配置java开发与运行环境
- ubuntu下安装tftp步骤
- (高精度运算4.7.27)UVA 10494If We Were a Child Again(大数除法&&大数取余)
- 【Oracle-PLsql】全局变量的好处与坏处
- 加密,壓縮 備份
- java.lang.OutOfMemoryError处理错误
- 记录一下八款开源 Android 游戏引擎
- SM2 签名前要进行的预处理操作
- 提高开发人员工作效率的7个技巧
- C|C++模拟反射
- 自定义控件的属性(attrs.xml,TypedArray)的使用
- 正则表达式