有很多應用項目
剛起步的時候用MYSQL數據庫基本上能實現各種功能需求
隨著應用用戶的增多
數據量的增加
MYSQL漸漸地出現不堪重負的情況
連接很慢甚至宕機
於是就有把數據從MYSQL遷到ORACLE的需求
應用程序也要相應做一些修改
本人總結出以下幾點注意事項
希望對大家有所幫助
. 自動增長的數據類型處理
MYSQL有自動增長的數據類型
插入記錄時不用操作此字段
會自動獲得數據值
ORACLE沒有自動增長的數據類型
需要建立一個自動增長的序列號
插入記錄時要把序列號的下一個值賦於此字段
CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記) INCREMENT BY
START WITH
MAXVALUE
CYCLE NOCACHE;
其中最大的值按字段的長度來定
如果定義的自動增長的序列號 NUMBER(
)
最大值為
INSERT 語句插入這個字段值為: 序列號的名稱
NEXTVAL
單引號的處理
MYSQL裡可以用雙引號包起字符串
ORACLE裡只可以用單引號包起字符串
在插入和修改字符串前必須做單引號的替換
把所有出現的一個單引號替換成兩個單引號
翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單
用LIMIT 開始位置
記錄個數
PHP裡還可以用SEEK定位到結果集的位置
ORACLE處理翻頁的SQL語句就比較繁瑣了
每個結果集只有一個ROWNUM字段標明它的位置
並且只能用ROWNUM<100, 不能用ROWNUM>
以下是經過分析後較好的兩種ORACLE翻頁SQL語句( ID是唯一關鍵字的字段名 )
語句一
SELECT ID
[FIELD_NAME
] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW
ID FROM TABLE_NAME WHERE 條件
ORDER BY 條件
) WHERE NUMROW >
AND NUMROW <
) ORDER BY 條件
;
語句二
SELECT * FROM (( SELECT ROWNUM AS NUMROW
c
* from (select [FIELD_NAME
] FROM TABLE_NAME WHERE 條件
ORDER BY 條件
) c) WHERE NUMROW >
AND NUMROW <
) ORDER BY 條件
;
. 長字符串的處理
長字符串的處理ORACLE也有它特殊的地方
INSERT和UPDATE時最大可操作的字符串長度小於等於
個單字節
如果要插入更長的字符串
請考慮字段用CLOB類型
方法借用ORACLE裡自帶的DBMS_LOB程序包
插入修改記錄前一定要做進行非空和長度判斷
不能為空的字段值和超出長度字段值都應該提出警告
返回上次操作
日期字段的處理
MYSQL日期字段分DATE和TIME兩種
ORACLE日期字段只有DATE
包含年月日時分秒信息
用當前數據庫的系統時間為SYSDATE
精確到秒
或者用字符串轉換成日期型函數TO_DATE(
YYYY
MM
DD
)年
月
日
小時:分鐘:秒 的格式YYYY
MM
DD HH
:MI:SS TO_DATE()還有很多種日期格式
可以參看ORACLE DOC
日期型字段轉換成字符串函數TO_CHAR(
YYYY
MM
DD HH
:MI:SS
)
日期字段的數學運算公式有很大的不同
MYSQL找到離當前時間
天用 DATE_FIELD_NAME > SUBDATE(NOW()
INTERVAL
DAY)ORACLE找到離當前時間
天用 DATE_FIELD_NAME >SYSDATE
;
空字符的處理
MYSQL的非空字段也有空的內容
ORACLE裡定義了非空字段就不容許有空的內容
按MYSQL的NOT NULL來定義ORACLE表結構
導數據的時候會產生錯誤
因此導數據時要對空字符進行判斷
如果為NULL或空字符
需要把它改成一個空格的字符串
字符串的模糊比較
MYSQL裡用 字段名 like
%字符串%
ORACLE裡也可以用 字段名 like
%字符串%
但這種方法不能使用索引
速度不快
用字符串比較函數 instr(字段名
字符串
)>
會得到更精確的查找結果
程序和函數裡
操作數據庫的工作完成後請注意結果集和指針的釋放
From:http://tw.wingwit.com/Article/program/Oracle/201311/16886.html