2010年5月7日 星期五

Oracle不區分字母大小寫的文章

在Oracle 10G R2 版本new feature中,有提到oracle在字母區分大小寫的部分,有作了一些enhancements,以看官方文件中的此主題:『Linguistic Sorting and String Searching』

URL:http://download-uk.oracle.com/docs/cd/B14117_01/server.101/b10749/ch5lingsort.htm#i1009059

主要是ap可能在進行這類型的需求時,需要先改變session層級設定:

ALTER SESSION SET NLS_COMP=ANSI;
ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER;

2010年5月5日 星期三

SQLNET.ora 遇domain naming時的參數設定

Oracle DB Server若有domain 設定時,
用netca 新建命名規則,sqlnet.ora會自動幫您新建一個參數
NAMES.DEFAULT_DOMAIN = <domain name>

若mark掉,在connect時會出現tns error:

image

必需要帶sqlplus user/password@SID.domain才能連線。

設定此參數後,即可利用Sqlplus user/password@SID 連線成功。

2010年4月30日 星期五

LOG_ARCHIVE_FORMAT參數如何設定

Format options available on 9i:

%s – log sequence number
%S – log sequence number, zero filled
%t – thread number, needed when running RAC as each node creates it』s own archivelog
%T thread number, zero filled, needed when running RAC as each node creates it』s own archivelog

Format options available on 10g

%s – log sequence number
%S – log sequence number, zero filled
%t – thread number, needed when running RAC as each node creates it』s own archivelog
%T – thread number, zero filled, needed when running RAC as each node creates it』s own archivelog
%a – activation ID
%d – database ID
%r – resetlogs ID that ensures unique names are constructed for the archived log files across multiple incarnations of the database.

In 10g, %s, %t, %r are required to be present in the parameter, if it doesn』t the database fail to start with the error ORA-19905: log_archive_format must contain %s, %t and %r. Using this format makes it the archive log filename unique for that instance.

2010年3月25日 星期四

在Oracle 10g之後安裝Oracle9i ,DBCA會啟動失敗

最近重新在裝了Oracle10G Client的機器上為了安裝oracle 9i Database Server,安裝完後,卻出現dbca啟動失敗。

後來重灌了2次oracle 9i (還以為是安裝元件出了錯),錯誤好像跟JRE連結有關,原本以為是jre版本相衝突,到環境變數修改path,將jre舊的版本提前,結果還是錯誤。

錯誤畫面

2010-03-25_180529

最後Google了一些關鍵字,終於找到一個相同的案例,說是jre環境變數的原因,但不是動jre的版本順序,而是要直接將oracle 10g的home path先移除,等到啟動了dbca後,再恢復環境變數。

解法:

環境變數修改>>

原本的:
C:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.1.8\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;c:\Oracle\product\10.1.0\Client_1\BIN;C:\Program Files\Oracle\jre\1.3.1\bin;

換成:

C:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.3.1\bin;C:\Program Files\Oracle\jre\1.1.8\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

啟動dbca>>

成功!!正在安裝資料庫呢!

image

趕緊記下來,免得以後又忘了類似的問題~~參考的url:http://www.100test.com/html/142/s_142717_14.htm

等到dbca運行正常後,請記得把oracle 10g的path再加回去環境變數中哦!

2010年2月9日 星期二

SQL Server 與 Oracle 函數差別

當開發人員要開發由ORACLE -> SQL SERVER資料庫平台的服務時,
最先遇到的問題是"SQL語法"究竟能不能通用呢?

很多設計師在設計系統時,若常常是BASE ON ORACLE,那麼其程式撰寫的SQL會非常依賴ORACLE,相對的在移轉性上會比較困難。
雖然個人認為ORACLE在函數的運用上有非常多元,速度上可能也比較佔優勢。
但近來SQL SERVER 2008的T-SQL,有許多以前SQL 2000沒有的函數,可以說已經跟ORACLE不相上下了~~。

在此說明這兩者資料庫的函數不同點吧!相同的我就不加以說明,會再繼續補充:

函數與語法 Oracle SQL Server 2008
字串連結 || +
補位 LPAD/RPAD REPLICATE(補位字元,<最大長度n>-len(欄位)) +cast(欄位 as nvarchar)
型態轉換 TO_CHAR CONVERT,CAST
型態轉換 TO_NUMBER CONVERT,CAST
型態轉換 TO_DATE CONVERT(TYPE,COL,Sql server定義格式編號)
NULL值轉換 NVL ISNULL   (   check_expression   ,   replacement_value   ) 
四捨五入(數) CEIL CEILING
取整數 TRUNC CAST( COL AS INT)
取子字串 SUBSTR SUBSTRING
取長度 LENGTH LEN
取系統日 SYSDATE GETDATE()
時間相減差 datediff() Date1-Date2
序號 sequence (.nextval,.currval) 類似的作法(IDENTIFY,@@IDENTITY,IDENT_CURRENT)
或自行撰寫

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 的傳回值