Excel 自動報表遇 ora-12516 錯誤排除

在更新公司的營運報表(Excel直接讀取資料庫)時會出現 ORA-12516 TNS:listener could not find available handler with matching protocol stack 的錯誤,但每一個 SQL 指令去分別執行時都很正常,詢問過資料庫維護廠商後給我們的答案是 Oracle Client Driver 異常,這點我覺得不太可能是,應該是出在我在短時間對幾個不同的 DB 下查詢指令,而這些資料庫都是透過 Oracle DB 做 DBLink 連結到大陸的子公司去,造成極短時間負荷過大 (Processes 及 Sessions 被吃光),所以調整一下 Excel 的查詢規則

如果也遇到大量查詢時出現上述的錯誤,可以試著把 “啟用幕後執行更改作業” 的勾取消,這樣不免的會導致 Excel 查詢這些SQL指令同時間只會執行一個,但是可以降低系統的負荷就不會產生這個錯誤.

簡易 Oracle 資料同步問題, 使用 Materialized View

環境

公司使用的 ERP 系統是屬於單一家公司單一個 Schema,在大陸工廠因速度的問題所以把資料庫都建置在當地,所以就變成台灣一個資料庫,大陸兩個工廠各有一個資料庫。

 

需求

部門在前兩年開始自行開發電子簽核系統,初期只針對台灣公司導入及開發,今年度開始嘗試把大陸兩廠納入到支援的範圍,當然程式必須要針對新的公司別(主要是資料庫的緣故)做不同幅度的調整,但是最令人頭痛的是調整後的執行速度。

影響速度的因素有三點,第一是兩岸間的網路速度,當時我們僅利用 Untangle 的 OpenVPN 把兩邊串起來,速度當就沒有辦法保障,第二點是我們為了開發程式(當然還有其他用途)方便,跟大陸資料庫的連結是使用 DB Link 的方式進行,轉一手的速度自然比較慢,最後一點是Web Server 是放置在台灣,所以只要是由大陸連結都要看到由台灣傳過去的畫面,再加上資料的往返,這樣自然快不起來。

這樣導致簽核速度的低落,更慘的是簽核最後一關通常都是高階長官,而簽核的內容都必須回填 ERP 系統上某些欄位,執行速度上最差可以到30-45秒,開始測試時就被罵得半死,在不影響整個程式的邏輯上 (因為整個翻寫成本太大),只能靠資料的功能來加速整個過程。

閱讀全文 簡易 Oracle 資料同步問題, 使用 Materialized View

快速變更 Excel 查詢資料庫密碼

最近公司開始做共用帳號密碼的變更作業,先前幫很多同事做了 Excel 自動撈取 Database 的自動更新報表,一但要變更帳號就會變得很痛苦,依照該 Excel 表內用了幾個SQL查詢,就需要變更幾次密碼,坐下來沒有幾個小時做不完。

還好 Excel 還有功能可以直些列出所有使用到的資料連線,其路徑為 資料 -> 連線 就會顯示如下,Double-click 個別的連線就可編輯這個內容。

Excel Data connect list

Excel Data connect list

閱讀全文 快速變更 Excel 查詢資料庫密碼

調整 Oracle Home 順序

因近日公司內自行開發軟體的主機需要軟體升級, 目標是把 Oracle Client 端由 10g 升級到 11g, 同時開發套件也把 Framework 由 2.0 升級到 4.0, 透過 VMWare 的 Clone 機制新產生一個測試平台, 透過軟體升級後偶而出現 Oracle connection 的錯誤訊息, 重新開機或重新啟動 IIS 都可能會恢復正常, 但一下子這個錯誤訊息就會跑出來.

網路上找得到 IIS 500.19 的錯誤訊息都跟這個錯誤無關, 最後只好由最基本的除錯開始研究, 首先利用 Oracle 的 Net Manager 把所有的連線刪除掉重新連結並確認連線正常, 重啟 IIS 執行軟體, 還是遇到同樣的錯誤.

腦筋思考了一下或許是因為在同一台機器上安裝了 10g, 11g, 及 11g ODAC (Oracle Data Access Components) 等三個 Oracle Home 讓系統搞不清楚, 更重要的是 ODCA 最後裝, 但沒有地方可以設定 TNS, 或許問題就出在找不到 TNS 上面吧.
閱讀全文 調整 Oracle Home 順序

P2V 經驗談

最近開始執行 P2V 的計畫, 目的要把一台網頁主機(WWW)及一台資料庫備用主機(DB-BACK)虛擬化, 前者方便備份整合, 後者因使用量較小可以節省公司的資源.

首先兩台主機都使用 VMWare Converter 來轉換, 但是都發生了一些異常的現象導致失敗, 最後只好靠 Acronis TrueImage Server standalone 版本來轉檔; 該軟體可以先在 Server 裝好後, 直接在線上備份而不會影響到正在提供的服務, 轉檔成 TIB 格式的檔案後, 就複製到有安裝 VM Converter 的機器上來執行轉檔動作, 這樣就可以很快速的把實體主機轉製成虛擬主機.

閱讀全文 P2V 經驗談

Oracle 教學 Week ONE

上次有機會到外點上課後, 開始整理了一下手邊講師上課的資料, 由於第一周要解釋 Oracle 的運作流程, 手邊也沒有可以參考的資料, 也很懶得自己來製作, 所以到網路上找到了 張裕松 老師所製作的講義, 準備在內部教學就使用這一份來講解.

< 下載連結 >
www.erp.shu.edu.tw/Oracle%20ERP暑期課程教材/Oracle%20Database%20Introduction.ppt

使用Excel欄位當做外部資料的查詢條件

先前嘗試出來的由Excel 直接讀取 Oracle DB 的資料, 都是把查詢的結果直接寫在 SQL 指令內, 在做簡易的 DashBoard 是可以很快的取得所需要的資料, 但是在彈性上會有所限制.

首先還是要先建立一個外部資料來源, 請參考先前一次的說明文件, 我利用 select * from All_tables 來說明其使用方式.

在填寫好 SQL 指令後, 在 檢視 -> 準則請勾選, 之後再準則欄位填入條件的欄位名稱, 值: 的這個部分填入 =[Input Owner], [] 的部份就是讓你輸入變數的地方.

è¨å®šæ¢ä»¶
設定條件

做到以上的步驟當然可以讓你在 Microsoft Query 編輯時可以自帶條件, 然後存檔回 Excel (不存檔也可以啦), 這樣你每次打開都會呈現最後一次的查詢結果, 不過這還不是我們需要的…

不要輸入任何條件後, 回 Excel 之後就可以看到系統會主動問你 Input Owner 的來源, 就可以選擇該查詢條件要抓取的欄位, 先設定成 A1.

選擇來源欄位
選擇來源欄位
指定為A1
指定為A1

這樣 Excel 就會自動的把 A1 的條件帶到剛剛設定的 Query 內.
不輸入任何數值則不回傳任何資料, 因為條件不符

條件空白, 沒有資料傳回
條件空白, 沒有資料傳回

輸入 SYS 後就會自動帶出所有 Owner = ‘SYS’的Table Name

選擇 Owner = 'SYS'
選擇 Owner =

當然如果你的參數需要下到區間的話, 當然也可以填寫兩個以上的準則來處理, 這樣就可以讓你的 Excel 表格上可以很有彈性來顯示必要的資料.

另外有一種方式可以先把所有的資料在 Sheet2 (或其他的工作表)全部撈取出來, 再用 Vlookup 的指令來對照把需要的資料再Sheet1呈現出來.

由Excel直接撈取Oracle DB的步驟與應用

1. 確認 Oracle 服務的名稱及連結參數是否設定完整

2. 進入 Excel 選擇 資料 -> 匯入外部資料 -> 新增資料庫查詢

3. 選擇<新資料來源> ->確定

4. 設定參數

  • 來源名稱: 自取
  • 驅動程式: 選擇 Microsoft ODBC for Oracle
  • 選擇連接, 彈出使用者帳號資訊, 這個部分要詢問一下 DBA 正確的帳密資料
  • 伺服器選擇在 Oracle Net Manager 所設定的服務名稱

5. 很有誠意的把資料庫的 Table 全部列給你參考, 但是我們直接在外部利用其他的 SQL Editor 先把 SQL 查好, 所以這邊選擇取消

6. , 我們還要繼續編輯所以選擇 “Y”

7. 接下來看的這個訊息, 因為不把算用Table 拉出來去串資料, 選擇關閉

8. 在選單 Icon 上面點選SQL

9. 之後會提示你 SQL 視窗, 把準備好的 SQL 填入, 選擇 確定

10. 完成後系統自動帶出關連表格等畫面, Access 所看到的是類似的

11. 接下來可以選擇存檔(建議啦, 免得辛苦的東西不見了), 之後關閉該視窗, 回到 Excel 之後選擇要寫回 Excel 那一個欄位, 選擇樞紐分析表可以達到的功能比較多.

12. 直接就跳到樞紐分析表的第三步驟

13. 把查詢出來的欄位拉到指定的地方去就可以產生不同的效果

14. 這樣就可以造成不同的報表效果, 由不同的分析面來看同一份資料

15. 與日期相關的變數使用方法

  • add_months(Sysdate,-1) 往前一個月
  • SYSDATE+NUMTOYMINTERVAL(-1,’YEAR’) 往前推一年
  • (B.DAT_REQ Between to_Char(Sysdate,’YYYY’)||’01’ And to_char(sysdate,’YYYYMM’)) 今年一月到本月份