Oracle ERP 萬用編碼原則

投影片, 目前只限站長瀏覽, Sorry :

Oracle DB 得知 DML動作是否成功與處理的筆數

在 Oracle Database 中, 做 "Insert、Update、Delete" 之後, 可利用 "SQL%RowCount", 即可得知 DML 處理的筆數.

若 "SQL%RowCount = 0", 則表示 "DML無處理任何資料" or "DML執行失敗".

若 "SQL%RowCount > 0", 則表示 "DML有處理資料成功", 且 "其值" 便是處理的資料筆數.

 範例
create table tom1 ( aa varchar2(100) );

insert into tom1 values( '1' );
insert into tom1 values( '11' );
insert into tom1 values( '2' );

begin
insert into tom1 values( '3' );
dbms_output.put_line( '新增筆數 = ' || SQL%ROWCOUNT );

update tom1
set aa = 'test' || aa
where aa like '1%';
dbms_output.put_line( '修改筆數 = ' || SQL%ROWCOUNT );

delete
from tom1;
dbms_output.put_line( '刪除筆數 = ' || SQL%ROWCOUNT );

commit;
end;

drop table tom1;

--結果
新增筆數 = 1
修改筆數 = 2
刪除筆數 = 4

Windows Mobile 超好用的 Register 編輯器: PHM Registry Editor

若你是一個常安裝軟體, 常不滿 Windows Mobile 的人,

有時候, 藉由修改 Register 會有讓你驚喜的效果 (當然, 也包含危險成份在),

在此, 介紹一個在 Windows Mobile 中, 非常好用且免費的 Register 修改軟體 : PHM Registry Editor,

網址 : http://www.phm.lu/products/PocketPC/RegEdit/.

這是它的畫面 (官網圖片) :


提醒一下, 在修改 Regsiter 之前, 最好將 Register 備份起來 or 記下來, 避免改錯了, 還可以回復到當初狀態, 而不致於悔恨.

在 Oracle ERP AP Server 上編譯 Form 與 Library 檔案

將製作好的 Form 程式或 PLL 程式, 還必須將程式上傳, 並且做程式的編譯,

若是 Form, 則從 fmb 編譯成 fmx,

若是 Library, 則從 pll 編譯成 plx,

按照下面步驟進行 compile :


1) 程式上傳路徑

Form : 請上傳到 Oracle ERP 的 Ap Server 上, 路徑為 $AU_TOP/forms/US 目錄中.

Library : 請上傳到 Oracle ERP 的 Ap Server 上, 路徑為 $AU_TOP/resource 目錄中.


2) 程式編譯指令

Form : f60gen module=<fmb_fileName> userid=<User_Name>/<Password>

Library : f60gen module=<fmb_fileName> userid=<User_Name>/<Password> module_type=library


3) Form 執行檔 (fmx) 搬移到指定的目錄

mv <fmx_fileName>.fmx <Specified_Path>

如: mv XXFNDCUSTOM.fmx $TOM_TOP/forms/US


這樣, 就已完成 FormLibrary 的編譯作業,

Form 程式, 從編譯之後, 第一次要讓程式可運行於 Oracle ERP, 仍需註冊 Form 的動作, 待續 ...

讓 SQL Tools 可同時顯示 UTF8 與 Big5 語系的中文字

若有多台 Oracle Database, 有的是 UTF8 語系, 有的是 Big5 語系, 如何讓 SQL Tools (如: Toad, SQL Developer, ...) 都可正常顯示中文字, 可以參考下面的作法 :

步驟 1) 利用 regedit 進入 registry.


步驟 2) 在最後一個 Oracle Home (HLM / SOFTWARE / ORACLE / HOME??? / KEY_???) 中, 設定 NLS_LANG = AMERICAN_AMERICA.ZHT16MSWIN950 即可.


這樣, 就可正常顯示 UTF8 與 Big5 中文字了.

Oracle Character Set Migration 資料庫字元集轉換

幾篇關於 Oracle Character Set Migration 不錯的文章,

在此分享一下 :

Oracle Character Set Migration - PDF 檔 :
http://www.oracle.com/technology/tech/globalization/pdf/TWP_Character_Set_Migration_Best_Practices_10gR2.pdf

Oracle Character Set Migration - 網頁 :
http://download.oracle.com/docs/cd/B10501_01/server.920/a96529/ch10.htm

Oracle Character Set Migration using CSSCAN and CSALTER 網頁 :
http://www.oracle-base.com/articles/10g/CharacterSetMigration.php

希望對各位有所幫助.

Java iText 如何在 PDF 顯示中文字

利用 Java iText 產生 PDF 檔時, 最常遇到如何正常顯示 PDF, 下面就大致介紹一下 :

使用 iText 提供的兩個 class : com.lowagie.text.pdf.BaseFontcom.lowagie.text.Font,

說明, 請見程式碼 :
 程式碼
// 預設中文字型
// 優 : 產生的檔案較小一些
// 缺 : 資料不易對齊

BaseFont bf = BaseFont.createFont( "MHei-Medium", "UniCNS-UCS2-H", BaseFont.EMBEDDED );

// kaiu.ttf 為標楷體
// 優 : 資料容易對齊
// 缺 : 產生的檔案較大一些, 且小字體列印較不清楚

BaseFont bf = BaseFont.createFont( request.getRealPath("") + "/Font/kaiu.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED );

// mingliu.ttc,0 代表 "細明體"
// 優 : 資料容易對齊, 列印也較清楚
// 缺 : 產生的檔案較大一些
// mingliu.ttc,1 代表 "新細明體"

BaseFont bf = BaseFont.createFont( request.getRealPath("") + "/Font/mingliu.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED );

// 設定字型大小
// Font.NORMAL:正常
// Font.BOLD:粗體
// Font.ITALIC:斜體
// Font.BOLD | Font.ITALIC:粗斜體

Font font = new Font( bf, 12, Font.NORMAL );

// 寫入文字
document.add( new Paragraph("Hello World, 大家好 !!", font) );

Android 程式引用 values 目錄檔案中的 style 標籤, 做為樣式資源

res / values 目錄內的任何 xml 檔, 使用 <style> 做為樣式標籤.

下面的範例, 我仍是將 <style> 放在 strings.xml, 但你也可獨立另一個 xml 檔做為樣式定義檔:




 Java 程式引用語法
R.style.styleName

如: setTheme( R.style.myStyle );

 XML 引用語法
@style/styleName

如: android:theme="@style/myStyle"

Android 程式引用 values 目錄檔案中的 dimen 標籤, 做為大小尺寸資源標籤

res / values 目錄內的任何 xml 檔, 使用 <dimen> 做為大小尺寸標籤.

下面的範例, 我仍是將 <dimen> 放在 strings.xml, 但你也可獨立另一個 xml 檔做為大小尺寸定義檔:




 Java 程式引用語法
R.dimen.dimenName

this.getResources().getDimension(R.dimen.dimenName)

如: setTextSize( R.dimen.myBig );

如: setTextSize( this.getResources().getDimension(R.dimen.myBig) );

 XML 引用語法
@dimen/dimenName

如: android:textSize="@dimen/myBig"

Android 程式引用 values 目錄檔案中的 color 標籤, 做為顏色資源標籤

res / values 目錄內的任何 xml 檔, 使用 <color> 做為顏色標籤.

下面的範例, 我仍是將 <color> 放在 strings.xml, 但你也可獨立另一個 xml 檔做為顏色定義檔:




 Java 程式引用語法
R.color.colorName

this.getResources().getColor(R.color.colorName)

如: setTextColor( R.color.myBlue );

如: setTextColor( this.getResources().getColor(R.color.myBlue) );

 XML 引用語法
@color/colorName

如: android:textColor="@color/myBlue"

Android 程式引用 values 目錄檔案中的 string 標籤, 做為文字資源標籤

res / values 目錄內的任何 xml 檔, 使用 <string> 做為文字標籤.

下面的範例, 我仍是將 <string> 放在 strings.xml, 但你也可獨立另一個 xml 檔做為文字定義檔:




 Java 程式引用語法
R.string.stringName

this.getString(R.string.stringName)

this.getResources.getString(R.string.stringName)

如: setText( R.string.hello );

如: setText( "Message: " + this.getString(R.string.hello) );

 XML 引用語法
@string/stringName

如: android:Text="@string/hello"

Oracle Select SQL Tuning 查詢效能調整

前提: 以下的幾種檢查方式,都是我的經驗談但不管哪一種檢查方式都是為了 "減少資料筆數的讀取以加快查詢速度"


檢查 1: 建立 Index Key


大多數的查詢速度慢,利用新增 Index Key,效率上大都會有一定地提升。

曾經有查詢 1 個多小時,在 Order By 所需的欄位上建立 Index,之後查詢不到 10 秒鐘 (差很大)。

若建立的 Index 為 ( key1, key2, key3 ),而 where 條件是 (key1),則此 Index 有作用。

若建立的 Index 為 ( key1, key2, key3 ),而 where 條件是 (key2, key3),則 10g 以後此 Index 作用;但 10g 以前此 Index 不會作用,需另建 (key2, key3) Index 才可。


檢查 2: Where 條件中,是否用函數


Where 條件的欄位若使用函數,會讓建立在欄位的 Index Key 無法使用,如: nvl, decode, trunc, to_char, ... 等,儘量避免在欄位上使用,如 nvl( col, 'Y' ) = 'Y' 可改用 (col = 'Y' or col is null)。


檢查 3: Where 條件用 計算公式,會使建立在欄位的 Index Key 無法使用


較慢範例: where (qty*10) > 1200

較快範例: where qty > (1200 / 10)


檢查 4: Where 條件中,是否使用 In / Not In / Exists


使用 In / Not In / Exists,有可能會使查詢所需的 Cost 增加,若真要使用,這三種方式可用 explain 進行偵測,看目前 SQL 在哪一種方式較好。


檢查 5: Where 條件中,是否使用 Outer Join


使用 Outer Join,會導致查詢所需的 Cost 增加,解決方式: 分成兩個 SELECT,一個 SELECT 用 Join,一個 SELECT 用 IS NOT NULL,然後用 Union or Union All 加起來。
(曾經有查詢 3 分多鐘,在改成 Union All 之後,查詢不到 10 秒鐘)

另一種方式,就是將 Outer Join 的 Table,做為 Subquery 當作 Columns 使用。
(這方式有時效能反而更差,需與 Outer Join 方式,測試比較看看)


檢查 6: Where 條件中,是否比較不同的資料型態


這個有可能在速度上會差異很多,如: charCol = numCol 改用 charCol = to_char(numCol)





































檢查 7: Where 條件中,若使用變數可能讓建立在欄位的 Index Key 無法使用


一般來說,是不會發生這種情形,但萬一遇到了,解決方式為: 接收到實際值後,將變數轉換成實際值,然後再執行之。

詳細資訊,請見 Oracle Metalink http://metalink.oracle.com/metalink/plsql/tar_main.this_tar?tar_num=5363227.993&p_ctryCode=840.


檢查 8: 是否使用 Distinct / Order By


使用 Distinct / Order By 會使查詢所需的 Cost 增加,若可以不用,盡量少用之。


檢查 9: 是否使用 View 有些情況可能會影響速度


如 View 關聯了 7 個 Table,但實際需求只要關聯 2 個 Table 的欄位資料,多餘的 5 個 Table 關聯,只會影響查詢速度。


檢查 10: 一個 Select 的效能 > 多個 Select 的效能


解決方式: 將多個 Select 改用 Union or Union All or Subquery。
(曾經有查詢 5 分多鐘,在改成 Subquery 之後,查詢不到 10 秒鐘)


檢查 11: 多個 TABLE 同時關聯


多個 TABLE 同時關聯,造成查詢速度太慢,解決方式: 可以先將一個過濾資料 Table 作成 Subquery,然後再將 Subquery 與其他 Table 關聯。
(曾經有查詢 6 分多鐘,在改成 Subquery 之後,查詢不到 1 分鐘)


檢查 12: 查詢條件的增加 or 取回資料的範圍縮小


用意當然在於減少取回的資料量,減少 Database Buffer 的使用量。


檢查 13: 資料量的增加,會使所需的 Cost 增加


這個我想,每個人都知道的,資料量一直不斷地增加,導致查詢速度越來越慢。

解決方式: 減少資料量的取回 or 將資料搬到歷史檔 or 擴充硬體設備。


檢查 14: 將常查詢但很費時的資料,建立 Materialized View or Summary Table


利用晚上較沒人使用的時間,將查詢要很久時間的資料,收集起來,就可快速查詢。


檢查 15: 查詢來源是否有用到 DB Link


資料量不多,有時查詢很快 (不用 1 秒鐘),有時查詢很久 (幾十分鐘),看看同一個 Select SQL 是否有用到 DB Link,

將這個 DB Link 資料來源,在一開始先寫入到同一個 DB 的 Temp Table,再由這個 Temp Table 來查詢。


檢查 16: 將不常用的 Inactive Data,放在其他 Tablespace or Database 中


這種做法,目的就是減少空間,增加存取效能。


檢查 17: 建立 Partition Table


這種做法,就是區隔資料,把它想像成 Index 就容易理解了。


檢查 18: 若 Select 是採用 Rule Base,考慮 From Table 順序 / Where 條件順序


Oracle 查詢方式有兩種:

  • Rule Base:擺放在 from、where 的位置,影響查詢速度。
  • Choose Base:擺放在 from、where 的位置,不會影響查詢速度。
若 Select 是採用 Rule Base,則擺放在 from / where 的位置,就會影響查詢速度。


檢查 19: 在 Select 之後 /*+ ... */


有時 Oracle 分析 Select 語句後,判斷有誤而採用錯誤的方式,如該用 Index 卻沒使用,這時就自力自強吧, 而常用的有 :
/*+ INDEX (tableName indexName) */
/*+ RULE */
/*+ CHOOSE */
/*+ FIRST_ROWS */
/*+ ALL_ROWS */

如: Select /*+ RULE */ colName1, colName2, ... from ...

其中
1) /* 與 + 之間無空格,否則只能視為備註,而非提高效能方式。
2) 若 Table 有用 Alias Name,則也請用 Alias Name,否則無法強制使用 Index。


檢查 20: Explain Plan


參考 Oracle 提供的 Explain Plan 分析 SQL 的執行路徑,看哪種 SQL 寫法 Cost 時間較少。

注意: 有時 Cost 少不代表實際查詢速度快喔。


檢查 21: 資料被 Locked


不用懷疑,有時資料的 Locked,可能造成查詢速度變慢。


檢查 22: 資料量不多,但卻查詢要很久的時間


曾經遇過查詢 6 筆卻要查詢 3 分鐘之久,原因很簡單,此 Table 常做新增 / 刪除動作,導致雖然資料量不多,但資料分散太大。

解決方式: 重建 Table。


檢查 23: 找 DBA 協助


若上述方式都用過了,查詢速度仍然很慢,找 DBA 吧 !!


檢查 24: 改變程式邏輯或系統架構


最後,連找 DBA 也沒辦法的話,若就請思考其他方式,更改程式邏輯或修改系統架構吧。

Android 程式引用 Layout / main.xml 資源檔做為 UI 設定

在 Eclipse 中, 開啟 res / layout / main.xml 檔案, 編輯 UI 畫面, 如下 :


在 Android 程式中, 呼叫 setContentView( R.layout.main ); 來指定 res / layout / main.xml 做為 UI :


執行結果, 如下 :


但利用 Android ADT 編輯 main.xml 其實很不方便,

強力推薦一個不錯的工具 droiddraw, 可以到 http://code.google.com/p/droiddraw 下載.

解壓縮之後, 直接執行 droiddraw.exe 即可, 如下 :


在 Droiddraw 編輯好畫面之後, 按下 "Generate" 按鈕產生 Layout 語法, 然後將這些內容覆蓋 main.xml, 如下 :


執行結果, 如下 :


這樣, 是不是很直觀呢.

Android 程式如何引用 Resource 資源檔


Android 程式要 "存取上述的資源檔, 必須透過 R.java",

R.java 在新增 Android 專案時會 "自動產生" 的,

R.java 檔案的功能, 就是 "定義 Android 所使用到的任何資源",

只要 "對資源檔有作任何異動, R.java 就會自動變更", 如: Copy PNG 檔案到 res / drawable 目錄中,

對於 "R.java 檔案, 不要手動修改它".

而程式使用資源的語法, 如右: R.<class_name>.<final_variable>.

下面是 R.java 內容範例 :


以上表示,

在 "res / drawable" 目錄中, 有 "icon.png, sun.png" 檔案.

在 "res / layout" 目錄中, 有 "main.xml" 檔案.

在 "res / values / strings.xml" 檔案中, 有 "app_name, hello" 變數.

在 Eclipse 中, 輸入 "R." 就會出現可用 Class 的提示 :


再輸入 "R.<class_name>." 又會出現該 Class 的相關提示 :


如我輸入 setText( R.string.hello ), 而 hello 在 strings.xml 中的內容為 "Hello 你好, Android !!"


則 Android 程式執行的結果, 如下 :


這樣, 就可以在 "無需變更 Android 程式碼, 透過變更資源檔, 也可達到畫面或資料的更改".

SQL Tools 以哪一個 Oracle Home 設定做為參考 (Home Selector)


若各位常常安裝 Oracle 產品 (如: Database, BI, Workflow, Developer, ... 等),

對於初學者而言, 電腦上的 TOAD, SQL Developer, SQL Navigator ... 等 SQL 工具,

會抓哪一個 Oracle Home 的設定呢 (如: NLS_LANG) ?

一般, 會以 "最後安裝的 Oracle 產品" 的 Oracle Home 為主,

若你不想以這個 Oracle Home 做參考,

可以直接到 "Oracle Home Selector" 或 "Oracle Universal Installer" 中更換即可.

Oracle Home Selector 作業畫面 :


Oracle Universal Installer 作業畫面 :




Java 字元集列表 (Charset List)

最近為了把 Oracle 加密的資料, 拋轉到 Java 程式, 被語系字元集搞的傷腦筋,

而在解決問題的過程中, 發現這個網頁不錯,

它列舉了許多 Java 的字元集,

各位可以參考看看,

網址 : http://java.sun.com/j2se/1.4.2/docs/guide/intl/encoding.doc.html.

Firefox 好用的 "翻譯" 套件 - FoxLingo

介紹一個 Firefox 好用的套件 : FoxLingo,

這個套件, 主要目的為 "整頁翻譯" / "選擇區塊翻譯" / "多國語言翻譯", 讓你在查看各類語言網頁時, 不再有所限制, 相當實用.

下載網址 : https://addons.mozilla.org/zh-TW/firefox/addon/2444.

詳細的套件介紹, 可以到 "重灌狂人" 這篇文章 : http://briian.com/?p=6441.

Oracle Table / View 明明有資料, 卻在 Client 端查詢無資料

Oracle 在 Database 8i 之後, 有加入一些設定, 所以, 可按下面方式檢查看看 :

 檢查 1
Registry 中,
Oracle HomeNLS_LANG 語系是否與 Server 語系相同,
若不同,請用相同的語系查詢.

 檢查 2
若語系相同卻仍查詢無資料, 則檢查 Object 是 Table or View;

若是 View, 可能 View 的 Where 子句中有變數,

看看 Where 字句中有無 UserEnv('xxx').

對於 View 的 Where 子句中有 UserEnv('CLIENT_INFO') 變數, 可用以下方式解決 :
 指定 View 變數值
begin
dbms_application_info.set_client_info( '變數值' );
end;

~ 字元不想成為漢書的列印指令

最近, 在 Oracle ERP 的 Report 列印時, 剛好欄位資料有 ~ 字元, 導致在漢書列印 Report 時, 漢書會將 ~ 字元當做列印指令, 而導致列印錯亂,

當初為了這個字元, 傷透腦筋, 在此提供相關的解決方案, 其實很簡單, 就在產生 Report 時, 將 ~ 字元換成 字元就可以了.
Related Posts Plugin for WordPress, Blogger...