【置頂】全局變量的好處與壞處

近日在做項目的過程中對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.pswp.cn/news/375460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375460.shtml
英文地址,請注明出處:http://en.pswp.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…