2009年12月15日 星期二

終於了解什麼是合法/不合法IP

日前不了解什麼是合法IP,為什麼要申請合法ip,看了這個連結就大徹大悟了!解釋的好清楚!
如果大家跟我一樣的疑問~請看這個url吧!
不合法 IP Address 的選用

2009年12月10日 星期四

[SQL Server]序號(Sequence)產生器(可依不同需要開發)

需求:
1. 取得目前的CUR_SEQ
2. New CUR_SEQ= CUR_SEQ + 1 (超過6位數,會重置為1)
3. Update New CUR_STAN
4. 輸出 New CUR_STAN
限制: 確保每個Client取得的CUR_SEQ號碼牌為唯一...

需要如下方的結果:(A+B+SEQNO)
ID NO CUR_SEQ
----- ---- -------------
8 0 1
8 1 1
8 2 1
(3 個資料列受到影響)

想了一下,若要確保每個用戶端在同時間取同一組序號時,不得有重覆取得的問題,
但又不能影響其它組取得序號,因此覺得使用with(ROWLOCK)會是較好的決定:

With(ROWLOCK) : 若有table有規畫PK constraint或index時,則只會lock住該筆記錄,
不會影響其它組的資料存取。
ROWLOCK其實也並不是直接對該筆資料列作鎖定,而是針對其INDEX的KEY值作鎖定。
下方有online book說法
/*
Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on index keys rather than the actual data rows. For example, if a table has a nonclustered index, and a SELECT statement using a lock hint is handled by a covering index, a lock is acquired on the index key in the covering index rather than on the data row in the base table.
*/

我的作法:
A.新增SEQUENCE Table: SEQNO



CREATE TABLE SEQNO(ID NVARCHAR(5) NOT NULL, NO NVARCHAR(2) NOT NULL, CUR_SEQ NUMERIC(6) NOT NULL, CONSTRAINT PK_SEQNO PRIMARY KEY (ID,NO));


B.新增SEQUENCE PROCEDURE:SP_SEQNO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SP_SEQNO]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[SP_SEQNO]
GO

CREATE PROCEDURE SP_SEQNO (
@ID nvarchar(5),
@NO nvarchar(2),
@MAXSEQ NUMERIC(6) output
)
AS
DECLARE @CURSEQ NUMERIC(6);
SET @CURSEQ = 0;
BEGIN
/* 初始值*/
IF NOT EXISTS (SELECT * FROM SEQNO WHERE ID=@ID AND NO=@NO )
BEGIN
INSERT INTO SEQNO (ID,NO,CUR_SEQ) VALUES(@ID,@NO,0);

UPDATE SEQNO WITH(ROWLOCK)
SET @MAXSEQ=CUR_SEQ= CUR_SEQ+1
WHERE ID = @ID
AND NO= @NO;
END
ELSE
BEGIN
/*抓出目前的SEQNO放至@CURSEQ,最大值限制判斷 */
SELECT @CURSEQ = CUR_SEQ
FROM SEQNO WITH(ROWLOCK)
WHERE ID = @ID
AND NO= @NO

/* 若超過6位數需重置為1*/
IF (@CURSEQ =999999)
BEGIN

UPDATE SEQNO WITH(ROWLOCK)
SET @MAXSEQ=CUR_SEQ=0 WHERE ID =@ID AND NO =@NO;

END
ELSE
IF (@CURSEQ<999999)
BEGIN
UPDATE SEQNO WITH(ROWLOCK)
SET @MAXSEQ=CUR_SEQ=CUR_SEQ+1 WHERE ID =@ID AND NO =@NO;
END
END
END

參考資料: url= lock explain:http://technet.microsoft.com/en-us/library/ms187373.aspx
recieve varaible output valus from procedure: 如何接收 Store Procedure 的傳回值

[MSSQL] IF EXISTS ...END寫法架構

IF EXISTS (SELECT * FROM Table1)BEGIN
...............
END
ELSE
BEGIN
.............
END

2009年12月8日 星期二

Oracle處理DATE及TIMESTAMP需注意的地方

oracle官方說法上的確證明了~
基本上Date 型態精準度只能到second,不含fractional seconds 或time zone,
而timestamp可支援frational seconds 0~9位,default是到小數點六位。請再往下看(可跳過例子)

舉例: Table: test( ttime DATE,ttimestamp TIMESTAMP)

利用"TO_DATE()"函數
一定要使用"to_timestamp()" 函數才能將含有毫秒或到奈秒的資料塞進timestamp型態的欄位中。


就目前實驗的結果就顯示
TO_TIMESTAMP才可支援到秒數小數點後9位。TO_DATE是不行的!

下面是oracle文件內建型態說明: 請看date及timestamp說明




若想知道oracle對日期的描述字元有哪些格式,請參考:
http://download.oracle.com/docs/cd/B13789_01/server.101/b10758.pdf
[7-3頁 Datetime Format Models]

由於oracle的session及database層級的參數設定,會以session層級為優先。
所以如果有權限的情況下想了解目前database及client端的format設定時,
可利用query下方指令。
Database層:
select * from nls_database_parameter;
 
Session層:
select * from nls_session_parameter;
 
若想修改session層的設定:
alter session set nls_data_format=yyyy-mm-dd;
 







2009年12月7日 星期一

Microsoft Offcie -Excel 數字的尾數自動調整為0

Excel 貼上數字型的格式時,例如像信用卡號的16個字元長度,excel會自動調整為0
例如 4394112233110022 -->會變成 4394112233110020
不管我將儲存格格式更改為數字去掉小數點,尾數都會自動調整為0,
後來用了好久,在office online book上面查詢後,才發現原來
office excel在數字的精準度上面,只能支援15位的有效數字,若要輸入信用卡號,且要完整顯示的話~有兩個作法
1.儲存格欄位格式需調整為是"文字"。
2.利用[ ' ]單引號加在數字前方,強迫指定為文字格式。
這樣就能正確顯示出信用卡號了!

參考url:http://office.microsoft.com/zh-tw/excel/HA102748231028.aspx#5