Total Pageviews

2015/07/17

[Oracle to SQL Server Migration] Data Type Mapping for Oracle and MS SQL Server


Oracle data type
SQL Server data type
Alternatives
BFILE
VARBINARY(MAX)
Yes
BLOB
VARBINARY(MAX)
Yes
CHAR([1-2000])
CHAR([1-2000])
Yes
CLOB
VARCHAR(MAX)
Yes
DATE
DATETIME
Yes
FLOAT
FLOAT
No
FLOAT([1-53])
FLOAT([1-53])
No
FLOAT([54-126])
FLOAT
No
INT
NUMERIC(38)
Yes
INTERVAL
DATETIME
Yes
LONG
VARCHAR(MAX)
Yes
LONG RAW
IMAGE
Yes
NCHAR([1-1000])
NCHAR([1-1000])
No
NCLOB
NVARCHAR(MAX)
Yes
NUMBER
FLOAT
Yes
NUMBER([1-38])
NUMERIC([1-38])
No
NUMBER([0-38],[1-38])
NUMERIC([0-38],[1-38])
Yes
NVARCHAR2([1-2000])
NVARCHAR([1-2000])
No
RAW([1-2000])
VARBINARY([1-2000])
No
REAL
FLOAT
No
ROWID
CHAR(18)
No
TIMESTAMP
DATETIME
Yes
TIMESTAMP(0-7)
DATETIME
Yes
TIMESTAMP(8-9)
DATETIME
Yes
TIMESTAMP(0-7) WITH TIME ZONE
VARCHAR(37)
Yes
TIMESTAMP(8-9) WITH TIME ZONE
VARCHAR(37)
No
TIMESTAMP(0-7) WITH LOCAL TIME ZONE
VARCHAR(37)
Yes
TIMESTAMP(8-9) WITH LOCAL TIME ZONE
VARCHAR(37)
No
UROWID
CHAR(18)
No
VARCHAR2([1-4000])
VARCHAR([1-4000])
Yes

The DDL script is for Oracle database:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CREATE TABLE "AP_NTA"."DBM030FA" 
   ( "STA_DATE" DATE, 
 "ORG_TYPE" VARCHAR2(1 BYTE), 
 "AGE" VARCHAR2(12 BYTE), 
 "AGE_NAME" NVARCHAR2(30), 
 "MASTER_AGE" VARCHAR2(12 BYTE), 
 "USER_ID" VARCHAR2(20 BYTE), 
 "UPDATE_DATE" DATE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DBM_DAT" ;
REM INSERTING into AP_NTA.DBM030FA
SET DEFINE OFF;
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'2','397000000A','高雄市政府','A00000000A','TEST',to_date('20-3月 -15','DD-MON-RR'));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'1','A00000000A','行政院',null,'TEST',to_date('20-3月 -15','DD-MON-RR'));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'2','382000000A','新北市政府','A00000000A','TEST',to_date('16-4月 -15','DD-MON-RR'));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'3','376580000A','新竹市政府','A01000000A ','TEST',to_date('16-4月 -15','DD-MON-RR'));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'1','A01000000A ','內政部','A00000000A','TEST',to_date('16-4月 -15','DD-MON-RR'));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'4','376446400A ','竹北市公所','376440000A','TEST',to_date('16-4月 -15','DD-MON-RR'));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (to_date('01-1月 -14','DD-MON-RR'),'3','376440000A','新竹縣政府','A01000000A ','TEST',to_date('16-4月 -15','DD-MON-RR'));
--------------------------------------------------------
--  DDL for Index SYS_C0072659
--------------------------------------------------------

  CREATE UNIQUE INDEX "AP_NTA"."SYS_C0072659" ON "AP_NTA"."DBM030FA" ("STA_DATE", "ORG_TYPE", "AGE") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DBM_DAT" ;
--------------------------------------------------------
--  Constraints for Table DBM030FA
--------------------------------------------------------

  ALTER TABLE "AP_NTA"."DBM030FA" ADD PRIMARY KEY ("STA_DATE", "ORG_TYPE", "AGE")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DBM_DAT"  ENABLE;
  ALTER TABLE "AP_NTA"."DBM030FA" MODIFY ("AGE_NAME" NOT NULL ENABLE);
  ALTER TABLE "AP_NTA"."DBM030FA" MODIFY ("AGE" NOT NULL ENABLE);
  ALTER TABLE "AP_NTA"."DBM030FA" MODIFY ("ORG_TYPE" NOT NULL ENABLE);
  ALTER TABLE "AP_NTA"."DBM030FA" MODIFY ("STA_DATE" NOT NULL ENABLE);


The following DDL script had been translated for Microsoft SQL Sever database:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  CREATE TABLE "AP_NTA"."DBM030FA" 
   ( "STA_DATE" DATETIME, 
 "ORG_TYPE" VARCHAR(1), 
 "AGE" VARCHAR(12), 
 "AGE_NAME" NVARCHAR(30), 
 "MASTER_AGE" VARCHAR(12), 
 "USER_ID" VARCHAR(20), 
 "UPDATE_DATE" DATETIME,
 CONSTRAINT DBM030FA_PK PRIMARY KEY (STA_DATE, ORG_TYPE, AGE)
   ) ;
   

Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'2','397000000A','高雄市政府','A00000000A','TEST',CAST('2015-07-17' AS datetime));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'1','A00000000A','行政院',null,'TEST',CAST('2014-07-17' AS datetime));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'2','382000000A','新北市政府','A00000000A','TEST',CAST('2014-07-17' AS datetime));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'3','376580000A','新竹市政府','A01000000A ','TEST',CAST('2014-07-17' AS datetime));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'1','A01000000A ','內政部','A00000000A','TEST',CAST('2014-07-17' AS datetime));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'4','376446400A ','竹北市公所','376440000A','TEST',CAST('2014-07-17' AS datetime));
Insert into AP_NTA.DBM030FA (STA_DATE,ORG_TYPE,AGE,AGE_NAME,MASTER_AGE,USER_ID,UPDATE_DATE) values (CAST('2014-01-01' AS datetime),'3','376440000A','新竹縣政府','A01000000A ','TEST',CAST('2014-07-17' AS datetime));

Reference
[1] https://msdn.microsoft.com/en-us/library/ms151817.aspx

2015/07/01

[閱讀筆記] 第一次領薪水就該懂的理財方法

  1. 投資沒有時間點的限制,也沒有所謂的最佳投資時間點,只要有錢就應該盡早投資
  2. 緊急預備金至少要準備六個月,才把其他錢拿來投資
  3. 只有承擔風險才能有更多的報酬,沒有高報酬又低風險的商品,你該學習的是如何有效控制風險,而不是去逃避風險
  4. 有錢人才不需要買保險,因為他們所擁有的財富足以面對他們可能遇到的意外、健康等風險。越沒錢的人越需要保險,有了保險,就不必恐懼未來。
  5. 你的投資報酬率要戰勝通貨膨脹率,荷包裡的錢才不會越變越薄。過去20年來,台灣每年的通貨膨脹率約2.2%
  6. 在做投資判斷的時候,不能只看累積報酬率,必須換算成年化報酬率,對投資績效評比才有意義。投資報酬率必須與『投資期間』相連結,才有意義
  7. 利率高低會影響投資動向,利率調升,有部分不願意冒風險的投資人,會將投資股票的錢轉到銀行定存;當利率調降時,投資者因為無法滿足銀行提供的報酬率,就會解除定存,將資金移到報酬率較高的投資標的
  8. 72法則可以讓你根據報酬率簡單算出,需要多少年,財富就能成長一倍。例如把10萬元投資在年報酬15%的商品,只要72 / 15 = 4.8年,就可以變成20萬元
  9. 指數代表一個國家、一個區域貨一個產業區塊隨著時間的變化情形。投資指數不會有基金經理人是否適任的問題,也不用考慮個別股票的漲跌,只要該地區或區塊的指數成長,投資代表該地區的ETF也就一定會賺,投資指數型基金,道理就是這麼簡單。
  10. 如果你想要了解全球的股市狀況,就去觀察MSCI World Index;想要了解美國股市,就去看S&P 500;如果想了解中國地區,可以去研究滬深300指數(CIS 300)
  11. 若指數波段型態屬持續向上,代表適合長期投資;有些地區的指數雖然是上下波動,或看不到向上趨勢,則只適合波段操作
  12. 以投資穩定性來說,投資一個區域要比投資單音國家相對平穩,雖然投資一個區域的投資報酬率會比投資單一國家來得低,但相對的不用承擔較大的波動風險
  13. 台灣50 ETF本身就是追蹤指數,績效幾乎等於大盤,而且沒有個別因素需要考慮,也就是不用擔心遇到地雷股
  14. 當股市重挫時,就要勇於啟動定期定額的攤平策略,利用微笑曲線來獲利;但是不建議長期操作,請一定要注意
  15. 要投資定期定額基金,最重要的前提是,一定要選擇具有長期往上趨勢的投資標的,選到趨勢往下的基金,即使是定期定額,也是會虧錢。定期定額無法改變往下或往上的趨勢。
  16. 定期定額的攤平效用會隨著時間的拉長而出現鈍化的現象,由於資產累積會隨著定期投入而增大,到了一定時候並然累積一定數量的金額,如果此時遇到空頭市場,股市往下跌,資產淨值也會跟著往下跌,這時每月在投入金額比起累計金額規模相對小,所以攤平小過有限。要解決這個問題,就是要隨著時間增加投入金額的比例
  17. 買定存股最好的時機是在股市空頭的時候,因為買定存股的主要目的是配息,不是要賺短期波段,所以空頭時期買進並無不妥,而且買到的價格越低,殖利率就會越高,獲利就會越好
  18. 「債券」是一個國家或企業為了籌措長期資金所發行的一種債權憑證。國家發行就叫國家公債,企業發行就叫公司債,目的都是向民眾借錢,也就是一般所謂的借據。買公債,就是把錢借給國家,收取債券上的票息。
  19. 購買海外基金一定會遇到匯率風險,若要克服匯率風險,有兩個因素要考慮:一個是報酬率越高,可以對抗的匯率風險就越大;另外一個是投資時間越長,匯率因素就越淡化
  20. 選擇債券型基金,一定要根據自己期望的投資報酬率與可以忍受的風險,找出最適合自己的投資標的
  21. 貸款利率愈低,貸款期限愈短,就是愈好的貸款方案
  22. 評估轉貸時,別忘了還有轉貸所衍生的費用要算進去
  23. 貸款買房來投資,貸款比例越高,報酬率就越高
  24. 財務槓桿式雙面刃,可以提昇報酬率,也可能會放大損失。如果貸款利率提高,或是租金收入不如預期,甚至出現虧損時,財務槓桿就會擴大損失
  25. 房地產投資特別是合作財務槓桿操作,但仍要注意收入與利息的關係




2015/06/30

2015/06 Travel

北美館典藏展;台灣製造  製造台灣







台北故事館

2015/06/27

[Programming] 不被誤解的名稱

最近閱讀了易讀程式之美一書,在不被誤解的名稱此章節提到幾個重點

  1. 反覆思考名稱,自問別人會怎麼解釋這個名稱
  2. 對於邊界的極值而言,最清楚的方式是在名稱前面加上max_或min_
  3. 選擇boolean變數或回傳booleab值的函數名稱時,必須確保能清楚表示true / false的意義
  4. 一般來說,加上is / has / can / should 可以讓boolean value更加明確
  5. 避免在名稱中使用否定描述,如disableSSL,改用useSSL會比較容易閱讀且簡短
  6. 最好的名稱是最不容易被誤用的名稱,閱讀程式碼的人能夠清楚了解撰寫程式的人的意圖。不幸的是,許多英文單字在程式碼都會有兩種以上的解釋,如filter、length以及limit
  7. 在決定名稱前,要從反向思考,想像可能造成的誤解,最好的名稱能夠盡量避免誤會
  8. 對於定義數值的上下限,max與min是很有幫助的prefix;對於閉區間,first與last也是十分合適的prefix;對於半開放區間,begin與end是符合使用慣例的好選擇
  9. 注意使用者對特定單字的預期,如使用者會認為get與size是lightweight accessor


Example
1. 對於邊界的極值而言,最清楚的方式是在名稱前面加上max_或min_。以切字串為例,即長度第15個字以後以...表示,如"撰寫程式時,應該將讀者理解所需的時間降到最短"此段字串要回傳"撰寫程式時,應該將讀者理解所需..."

如在main method裡面分別呼叫clip與truncate兩個methods

1
2
3
 String str = "撰寫程式時,應該將讀者理解所需的時間降到最短";
 test.clip(str, 15);
 test.truncate(str, 15);

以下是clip method的第二個parameter的命名
1
2
3
 public String clip(String text, int length) {
  return text.substring(0, length).concat("...");
 }

以下是truncate method的命名,改成用maxLength,相較於前者,較為明確、清楚
1
2
3
4
 // 改成maxLength,會更加清楚明瞭
 public String truncate(String text, int maxLength) {
  return text.substring(0, maxLength).concat("...");
 }


2. 加上is / has / can / should 可以讓boolean value更加明確

1
2
3
4
5
 public Boolean authenticate(User user) {
  // do authentication, if failed
  Boolean checkPassword = Boolean.FALSE;
  return checkPassword;
 }

若將checkPassword改成如下,意義會更加直覺
1
2
3
4
5
 public Boolean authenticate(User user) {
  // do authentication, if failed
  Boolean userIsAuthnticated = Boolean.FALSE;
  return userIsAuthnticated;
 }




2015/06/24

SQL Developer 常用 hotkeys

  1. ctrl-enter : executes the current statement(s)
  2. F5 : executes the current code as a script (think SQL*Plus)
  3. ctrl-space : invokes code insight on demand 
  4. ctrl-Up/Dn : replaces worksheet with previous/next SQL from SQL History
  5. ctrl-shift+Up/Dn : same as above but appends instead of replaces
  6. shift+F4 : opens a Describe window for current object at cursor
  7. ctrl+F7 : format SQL
  8. ctrl+/ : toggles line commenting
  9. ctrl+e : incremental search


Reference
[1] http://www.thatjeffsmith.com/archive/2012/11/keyboard-shortcuts-in-oracle-sql-developer/