熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

開發篇之—Oracle觸發器心得體會

2013-11-13 16:18:50  來源: Oracle 

  實在對象如表格Sequence索引等建在本應用對應的用戶表空間中其他對象如視圖別名創建在Apps下常見錯誤是新手把表建在APPS下以後又來建別名這個時候刪除別名時會報對象不存在而建別名的時候又報對象已存在

  如果把腳本保存在文件裡面注意一個塊比如一個創建視圖的語句不要有空行否則會出現如下情況把語句拷貝到SQL Window能正常運行用@執行文件卻報錯

  如果要執行execute_query注意要go_block到適當的Block但是go_block是個受限過程並不一定都能成功

  Masterdetail關系

  block both are database block
each block has one item based on database displayed

  在PL/SQL Develop中沒有環境變量所以如果要查詢多組織的View需要先執行設置環境變量函數:

  BEGIN
fnd_client_infoset_org_context();
END;

  GLOBAL變量對於所有form有效(可能是同一個應用這個尚未驗證)而不僅僅是你所開發的form變量比如Global和Parameter的初始化應該在preform裡面在whennewforminstance裡面初始化不行因為whennewforminstance是在進入第一個導航塊的第一個item之後才促發的沒有屬性指名Block的記錄數不過可以通過GET_BLOCK_PROPERTY(QUERY_HITS) 取得查詢到的記錄數hide_view並沒有真正hide一個畫布只是放到最下層所以如果上層的畫布沒有完全覆蓋下層畫布下層的畫布很可能用戶還看得到show_view則是把畫布放在最上層

  lov驗證的時候是驗證第一個可見的列並且會把其他的返回值返回給各個Item而不是僅僅驗證而已lov的查詢一般是針對第一列但是如果我們把%放在最前面則可以查詢所有列

  用Execute_query執行查詢的時候會把Copy Value From Item裡面的那個Item的值自動作為查詢條件當創建記錄的時候也會直接用該值初始化而且不改變記錄的狀態在更新記錄的時候不知道會不會Copy過來尚未驗證Get_Item_property的時候用ENFORCE_KEY屬性但不能Set該屬性在Masterdetail設置的時候自動創建刪除的時候自動刪除如果不希望Copy Value From Item影響查詢結果可以在PreQuery裡面把Item的值設為null

  app_queryreset(block_name);如果第一次調用會把當前的DEFAULT_WHERE然後什麼都不做以後再來調用的時候則會把第一次設置的DEFAULT_WHERE用set_block_property(SAA_HEADERSDEFAULT_WHERE)設置回來具體請參考app_core庫

  Whencreaterecord的時候給Item賦值不改變記錄狀態Sequence如果我們在Item的Initial Value裡面賦值那麼假如用戶Focus To新記錄又回到老記錄如此反復Sequence會不斷變大的

  SQL Order BY的時候null值排在最後這個一般不符合實際要求可以這樣解決ORDER BY nvl(Geography_Codechr())解決

  Trigger順序

  precommit
的preinsertoninsertpostinsert
的preinsertoninsertpostinsert

postformscommit

  Trigger順序

  whenlistchanged在前Validation item在後因為Validation item是在要離開這個item的時候才促發的


Trigger順序

  preform/whencreaterecord/preblock/
whennewformsinstance/whenvalidaterecord/oninsert/postforms

  當定位到主塊的一個記錄會促發子塊的whenclearrecord事件和whencreaterecord事件問題是如果主塊的是新記錄(未保存)在子塊的whencreaterecord裡面取主塊的任何東西居然是主塊的上一次獲得焦點的記錄的東西連用取塊的當前記錄也是上一次獲得焦點的記錄

  Trigger順序

  postchanged在whenvalidateitem之前所有的whenvalidate事件是當forms自己驗證通過之後才促發的

  禁用Clear功能可以通過在Form的keyclrblk裡面調用app_exceptiondisabled其實只是用Bell覆蓋默認的執行

  直接放在TAB Page上的Item和放在堆疊畫布上的Item在設計時是無法所見即所得所以建議把所有的Item根據需要放在不同的堆疊畫布上再堆到TAB Page上偽列Rownum在排序之前就已經決定如果想得到排序後的Rownum應當在嵌套一個Select語句另外Where語句中的rownum只能用<或者<=不能有>或者>=

  在SQL中用Over的時候如果整個語句沒有Order by語句最後的結果還是會排序的規則是先按Over裡面的Partition排序在按Over裡面的Order by排序原因可能和分析函數的處理順序有關(ifunctionspdf有詳細介紹)先查詢到數據(Join/Where/Group By/Having)再運算分析函數(先分區然後排序再算Slide Windows最後計算)最後是Order By另外一個疑問我測試到的一個結果Group By好像無法影響Partition可是按照ifunctionspdf的說法應該先執行Group By的是不是因為Group By只是在第一階段的處理時作用在集合函數上之後進入第二階段的處理就沒用了

  同事在裝i的時候連安裝界面都沒出來而我機器可以裝後來才知道原來他的機器是P無法正常安裝

  實際執行的Where條件是我們設置DEFAULT_WHERE再加上通過賦過值的Item

  注意APP_FINDquery_range已經重載過我們調用的時候可以不區分query_number_range或者query_date_range觀察其代碼發現也是通過給Item賦值來影響查詢的只不過是賦值的時候可能是加上 # between# >=或# <=這樣導致的一個結果是Date類型的Item長度默認是被query_range這樣一搞長度根本不夠於是就導致諸如where REQUEST_DATE >= to_dat的錯誤所以記得把字段長度加長比如總的來說碰到From to的要小心長度

  當修改子類的時候會自動更改很多屬性特別是Required一定要注意

  當對塊進行刷新時會修改很多Item的屬性別以為你設置過了Oracle就會記住我碰到的情況是Insert Allowed等被自動改掉了!即使我的子類設置為Text_Item_Display_Only

  兩個變量如果都為Null判斷還是不相等所以必須用 a is null and a is null所以在Onlock裡面的if條件我們可以把所以不可以為空的字段都寫成允許為空的形式

  一般來說系統變量是很好用的然而有時候並非如此比如Current_Recordget_block_property(blocknameCurrent_Record)的結果並非總是一樣的後者更加保險!特別是剛打開Form的時候在WHENNEWRECORDINSTANCE裡面前者是後者是

  表示一個單引號表示兩個單引號應該是這樣理解一個單引號表示轉義字符首尾兩個單引號裡面的內容表示字符串

  重啟Application

  cd ?$APPLCSF
cd scripts
cd PROD
/adstpallsh apps/apps
/adstrtalsh apps/apps

  Trigger順序

  postquery只有在界面可見的記錄才會促發記錄從不可見變為可見時促發促發過的記錄不再促發

  保存的時候會引發Post Item/Record/Block事件因為要Navigate到Form

  數據庫org_id初始值to_number(decode(substrb(userenv(CLIENT_INFO)) nullsubstrb(userenv(CLIENT_INFO))))

  給非數據庫Item賦值new記錄會變成insert(所以就不能按F了)query/changed記錄不變new塊會變成queryquery/changed塊不變

  對Onlock的理解由於先入為主的緣故開始一直很苦惱為什麼If裡面只用了一個ReturnForm怎麼知道要鎖否?後來才知道On類型的數據庫觸發器是替換型的Onlock也不例外所以只要Onlock不Raise什麼東西出來Form就認為是鎖成功了至於實際的鎖我們有Select……For Update來完成至於If判斷只是進行更加嚴格的判定

  對Find的理解開始也很納悶為什麼在Prequery裡面直接給Item賦值就可不用自己拼語句現在也逐漸發現裡面大有文章回想F這個時候的block其實是處於Enterquery狀態輸入的東西Form會自動拼成Where語句(當然還要加上原來的default where如果有Copy from item也要加上)對於每個Item上輸入的值一般是用 = 如果有就解析為like如果有#則把後邊的表達式(比如between甚至是子查詢)直接作為條件而當form內部執行堆棧Navigate到Prequery時block也是處於Enterquery狀態道理和F一樣我們只管按業務查詢要求對Item賦值剩下的就交給Form去處理了需要注意的是當處於enterquery狀態的block是使用query length屬性來限制輸入的數據長度而不是通常的maximum lengh只不過query length默認是即等於maximum lengh所以會出現當用app_findquery_range時長度不夠的情況


From:http://tw.wingwit.com/Article/program/Oracle/201311/18132.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.