2010年4月30日 星期五
LOG_ARCHIVE_FORMAT參數如何設定
%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舊的版本提前,結果還是錯誤。
錯誤畫面
最後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>>
成功!!正在安裝資料庫呢!
趕緊記下來,免得以後又忘了類似的問題~~參考的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日 星期二
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寫法架構
...............
END
ELSE
BEGIN
.............
END
2009年12月8日 星期二
Oracle處理DATE及TIMESTAMP需注意的地方
基本上Date 型態精準度只能到second,不含fractional seconds 或time zone,
而timestamp可支援frational seconds 0~9位,default是到小數點六位。請再往下看(可跳過例子)
舉例: Table: test( ttime DATE,ttimestamp TIMESTAMP)
TO_TIMESTAMP才可支援到秒數小數點後9位。TO_DATE是不行的!
由於oracle的session及database層級的參數設定,會以session層級為優先。
