2015年11月10日 星期二

[ORACLE] 11g建立sequence

簡單來說三個步驟
1. 建立TABLE
2. 建立sequence
3. 建立trigger

以下為初階範本
create table T_Owner.t_Table(
  emp_id number primary key,   --重點一定要為PK,TYPE我會用number ,比較不會怕爆掉,在SQL Server用int就有爆過的經驗
  emp_name varchar2(100)
  );

create sequence emp_id_seq
minvalue  1
maxvalue  999999999999999999999999999
start  with 1
increment  by  1
nocache; --這邊還有另外一種為cache模式,主要差別在於會不會發生跳號問題


create trigger trg_emp_id
   before insert on T_Owner.t_Table
   for each row
   begin
   select emp_id_seq.nextval
    into :new.emp_id
   from dual;
  end;
   /

進階版 http://proxy.gtn.com.tw/forum/index.php?topic=25.0

2015年5月18日 星期一

[SSIS] 透過SSIS將有難字的資料轉出後內碼會被改變(亂碼)

問題:透過SSIS轉成文字檔(或是匯入資料庫)時難字的內碼會被改變,例如正確的應該是,但經過SSIS後會變成

原因:
        難字的內碼不在BIG5 code page裡面,也就是造字,當SSIS透過Microsoft OLE DB provider連線到oracle會判斷Big5 950(non-UNICODE),就會直接報錯不讓你轉。但當SSIS透過Oracle OLE DB provider連線到oracle時則會判斷為UNICODE,此時就會將CH_NM欄位轉換成UNICODE,這個動作是由Oracle OLE DB provider自動判斷並自動轉換的,此時難字字元內碼就已經被轉換過了,所以存進SQL Server後的binary也不會相同了。

解法:
        簡單來說就是將Oracle來源端的難字欄位轉成binary(透過utl_raw packages),並直接寫入到SQL Server對應的binary欄位其內碼就不會變,由於binary是一樣的這時再將此欄位用convert的函數再轉回char。

1. 在SQL Server上建立一個 B2U_01的暫存TABLE,將有難字的欄位NAME其type設定為binary
2. SSIS部分會建立兩個資料流程,一個是Oracle資料匯入SQL Server,一個是SQL Server資料匯出成文字檔
    2.1 在第一個資料流程(Oracle資料匯入SQL Server)的來源端
    原語法: select NAME from myORCL.CARD_HOLDER_DIM where CH_ID='A123456789';
    修正語法:select utl_raw.cast_to_raw(NAME) from myORCL.CARD_HOLDER_DIM where CH_ID='A123456789';

    2.2 在第二個資料流程(SQL Server資料匯出成文字檔)的來源端
           語法:SELECT convert(char(40),[NAME]) as NAME FROM [B2U_01]

2015年4月16日 星期四

[TOMCAT] 資料庫連線數不斷增加且不會釋放連線

        最近有套系統一段時間AP連到DB Sessios就衝高,然後把CPU吃到100%,結果就是資料庫變得很慢很慢,目前解法是請AP從程式面去找問題,另外在TOMCAT的參數檔中也有相關設定可用,我們環境就只有預設值像是maxActive,maxIdle,maxWait之類的,但有個我覺得很重要的參數abandoned connection竟然沒有,目前已經相關參數設定上去,再觀察看看有沒有改善了,詳細說明及設定方式請參考http://clearinfotech.blogspot.tw/2012/08/tomcat-data-source.html

2015年3月11日 星期三

[ORACLE] 使用SQL Loader將文字檔匯入資料庫出現ORA-01861及ORA-01722錯誤訊息解法

1. 準備好SQL*Loader Control File
========Control File範例,檔名為import.ctl=========
load data
infile 'EXP_MYTABLE.txt'
into table MYTABLE
fields terminated by ","
(datadt,actno,brno)
===========================================
以上參數說明如下:
> infile 上傳檔案的路徑及檔名,此例為EXP_MYTABLE.txt,且路徑與Control File相同
> into table 要載入到那一個table,上面表示要載入MYTABLE
> fields terminated by 欄位與欄位的分隔符號
(datadt,actno,brno) 要填入資料的表格欄位名稱

2. 執行sqlldr,語法:sqlldr 帳號/密碼@ORACLE_SID control=控制檔名
    例如:sqlldr system/system@mysid control=import.ctl

結果就出現 ORA-01861: literal does not match format string的錯誤訊息,此錯誤訊息是指日期格式不匹配,解法很簡單將Control File內容改一下就OK了。
========Control File範例,檔名為import.ctl=========
load data
infile 'EXP_MYTABLE.txt'
into table MYTABLE
fields terminated by ","
(datadt timestamp "yyyy-mm-dd hh24:mi:ss", actno,brno)
===========================================

P.S. 在我的環境下import.ctl及EXP_MYTABLE.txt都是在Windows下產生,但sqlldr是在Linux下執行,所以再將檔案上傳到Linux時須先將檔案轉成linux格式,簡單來說就是把enter符號給去掉,不然有可能會在執行sqlldr出現錯誤,或是ORA-01722:invalid number的錯誤