數據類型比較: | ||||
類型 | Oracle | SQL Server | Symfoware | 注意 |
字符數據類型 | Char(size) | Char(n) | Char(size) | 如果Oracle列中數據值的長度小於或等於8000 bytes ,在SQLServer中使用varchar;否則,使用text |
Varchar2(size) | Varchar(n) | Varchar2(size) | ||
Nchar(size) | Nchar | Nchar(size) | ||
Nvarchar2(size) | Nvarchar | Nvarchar2(size) | ||
Long | Text | --- | ||
Number數據類型 | Number(p,s) | Numeric | Numric(p,s) | Oracle中數值型數據轉換到SQLServer中時 |
Decimal | Decimal(p,s) | 1 - 255 tinyint | ||
Int | Integer | -32768 - 32767 smallint. | ||
Smallint | Smallint | -2,147,483,648 - 2,147,483,647 int | ||
Float(n) | Float(p) | 如果需要浮點型的數,使用numeric | ||
Real | Real | 注意: 不要使用float或者real, 因爲可能會發生截斷 | ||
Double precision | 如果不確定,使用numeric; 它同Oracle NUMBER數據類型非常相似。 | |||
Date數據類型 | Date | Datetime , Smaldatetime | Date | 在symfoware中有更多的數據類型。根據數據的性質,需要置換適當的類型。Symfoware中Date,Time類型可分別用jdbc的setDate,setTime方法 但timestamp在jdbc中無對應類型 |
Time | ||||
Timestamp | ||||
時間間隔 | --- | Interval | ||
LOB數據類型 | Blob | Image | Blob(size) | 如果Oracle列中數據值的長度小於或等於8000 bytes ,在SQLServer中使用varbinary;否則,使用image |
Raw(size) | Binary(n) , Varbinary(n) | |||
Long raw | ||||
Clob | Text | --- | ||
Nclob | ||||
Rowid數據類型 | Rowid | identity | Row_id (*1) | 在symfoware中,在select語句中,可以使用row_id。在host變量中保存取出的row_id。可以以此爲基礎進行數據操作(更新等)。但是,這一操作只在同一個transaction中有效。 |
urowid | --- | --- | ||
要點: | ||||
1.二進制大對象數據的處理: 一部分的JDBC drive不支持使用java.sql.Blob class的標準的使用方法,爲了開發有必要進行獨自的封裝。 | ||||
2.目前,Symfoware數據庫的jdbc driver不支持addBatch() 和 prepareCall()方法 | ||||
3.日期常數的表現方法: 在oracle中字符串可以轉換成日期數據類型;但在symforware中不能轉換數據類型,日期常數需要指定爲"yyyy-mm-dd" Oracle 中: insert into emp values ("2001-01-01"); SQLServer中: insert into test (tt)values ('2000-1-1') Symforware 中:insert into emp values (date "2001-01-01"); |
||||
4.Oracle和SQLServer中可以向數值類型字段添加字符數據(必須是數字字符,否則報錯);但在SymfoWare中不可以這樣。 | ||||
例如: 向Symfoware數據庫中添加記錄: insert into test(aa) value(11) | ||||
在Oracle和SQLServer中也可以寫爲: insert into test(aa) values('11') | ||||
函數比較: | ||||
分類名 | 補充 | |||
單行的函數 | 數值函數 | 返回數值的函數的集合 | ||
字符函數 | 返回字符的函數的集合 | |||
日期函數 | 操作日期用的函數的集合 | |||
變換函數 | 類型變換的函數的集合 | |||
其它函數 | 以上不能分類的函數的集合 | |||
統計函數 | 統計函數的集合 | |||
數學函數: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
Arc tangent of n and m | ATAN2 | ATN2 | N/A | |
Smallest integer >= value | CEIL | CEILING | CEIL | |
Hyperbolic cosine | COSH | COT | N/A | |
Natural logarithm | LN | LOG | N/A | |
Logarithm, any base | LOG(N) | N/A | N/A | |
Logarithm, base 10 | LOG(10) | LOG10 | N/A | |
Modulus (remainder) | MOD | USE MODULO (%) OPERATOR | CAST ,FLOOR | |
Random number | N/A | RAND | N/A | |
Hyperbolic sine | SINH | N/A | N/A | |
Hyperbolic tangent | TANH | N/A | N/A | |
Truncate | TRUNC | N/A | TRUNC | |
Largest number in list | GREATEST | N/A | N/A | |
Smallest number in list | LEAST | N/A | N/A | |
Convert number if NULL | NVL | ISNULL | Coalesce | getNvlSqlString |
Largest integer number | Floor | Floor | Floor | |
四捨五入 | Round | CONVERT | round | |
要點: | ||||
1.由於各種數據庫判斷Null的方法不同,所以開發時對應DBMS分開處理。DBMS支持SQL92規定的SQL函數coalesce()時,使用該方法。但Oracle中使用nvl方法。這些操作都封裝在getNvlSqlString(String strColName, String strDefaultValue)中,用這個方法可得到相應數據庫處理Null值的語句 | ||||
2.Symfoware數據庫中沒有取餘函數,可以使用cast和floor組合來取餘,例如:cast(empno-floor(empno/3)*3 as int) | ||||
字符函數: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
字串連接 | CONCAT | (expression + expression) | (expression || expression) | getConcatSQLString |
把ASCII轉換爲字符 | CHR | CHAR | N/A | |
返回字符串中的開始字符(左起) | INSTR | CHARINDEX | position | |
填充字符串的左邊 | LPAD | N/A | LPAD | |
字符串中的起始模式(pattern) | INSTR | PATINDEX | position | |
多次重複字符串 | RPAD | REPLICATE | rpad | |
重複空格的字串 | RPAD | SPACE | N/A | |
從數字數據轉換爲字符數據 | TO_CHAR | STR | N/A | |
子串 | SUBSTR | SUBSTRING | SUBSTRING | |
替換字符 | REPLACE | STUFF | REPLACE | |
將字串中的每個詞首字母大寫 | INITCAP | N/A | N/A | |
翻譯字符串 | TRANSLATE | N/A | N/A | |
字符串長度 | LENGTH | DATELENGTH or LEN | length | |
列表中最大的字符串 | GREATEST | N/A | N/A | |
列表中最小的字符串 | LEAST | N/A | N/A | |
如果爲NULL則轉換字串 | NVL | ISNULL | Coalesce | getNvlSqlString |
把字符串變爲日期 | To_date | CONVERT | Cnv_date | |
把字符變爲數字 | To_number | CONVERT | cast | |
要點: | ||||
1.由於各種數據庫判斷Null的方法不同,所以開發時對應DBMS分開處理。DBMS支持SQL92規定的SQL函數coalesce()時,使用該方法。但Oracle中使用nvl方法。這些操作都封裝在getNvlSqlString(String strColName, String strDefaultValue)中,用這個方法可得到相應數據庫處理Null值的語句 | ||||
2.注意oracle中取字符子串的方法名與其他數據庫不一樣 | ||||
日期函數: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
日期相加 | (date_column +/- value) | DATEADD(type , value , column_name) | column_name +/- INTERVAL '2' type | getAddDaySqlString |
ADD_MONTHS(date_column , value) | ||||
兩個日期的差 | (date column +/- value) or | DATEDIFF | Span_date | |
MONTHS_BETWEEN | ||||
當前日期和時間 | SYSDATE | GETDATE() | Current_timestamp | getSysdateName |
Current_date | ||||
Current_time | ||||
一個月的最後一天 | LAST_DAY | N/A | Last_day | |
時區轉換 | NEW_TIME | N/A | N/A | |
日期後的第一個週日 | NEXT_DAY | N/A | N/A | |
代表日期的字符串 | TO_CHAR | DATENAME | Cnv_char | |
代表日期的整數 | TO_NUMBER | DATEPART | N/A | |
(TO_CHAR)) | N/A | |||
日期舍入 | ROUND | CONVERT | ROUND | |
日期截斷 | TRUNC | CONVERT | N/A | |
字符串轉換爲日期 | TO_DATE | CONVERT | N/A | |
如果爲NULL則轉換日期 | NVL | ISNULL | Coalesce | getNvlSqlString |
日期的取整(四捨五入中的舍) | rngc | CONVERT | Trunc-date | |
要點: | ||||
1.由於各種數據庫判斷Null的方法不同,所以開發時對應DBMS分開處理。DBMS支持SQL92規定的SQL函數coalesce()時,使用該方法。但Oracle中使用nvl方法。這些操作都封裝在getNvlSqlString(String strColName, String strDefaultValue)中,用這個方法可得到相應數據庫處理Null值的語句 | ||||
2.各種數據庫得到系統時間的方法不同,所以開發時對應DBMS分開處理。 Symfoware數據庫中, current_date -- 系統日期; current_time -- 系統時間; current_timestamp -- 系統日期和時間 這些形式都封裝在getSysdateName()中,用這個方法可得到相應數據庫的系統時間方法 |
||||
3.各種數據庫對日期加減計算的表示是不同的,所以開發時對應DBMS分開處理。這些表現形式都封裝在getAddDaySqlString(String strColName, int nValue)中,用這個方法可以得到相應數據庫的日期加減方法的表示 | ||||
轉換函數: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | |
數字轉換爲字符 | TO_CHAR | CONVERT | N/A | |
字符轉換爲數字 | TO_NUMBER | CONVERT | cast | |
日期轉換爲字符 | TO_CHAR | CONVERT | Cnv_char | |
字符轉換爲日期 | TO_DATE | CONVERT | Cnv_date | |
16進制轉換爲2進制 | HEX_TO_RAW | CONVERT | N/A | |
2進制轉換爲16進制 | RAW_TO_HEX | CONVERT | N/A | |
要點: | ||||
各種數據庫中類型轉換方法可通過PreparedStatement.setXXX()做成不依靠DBMS的處理. | ||||
其他單行函數: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
返回第一個非空表達式 | DECODE | COALESCE | ||
當前序列值 | CURRVAL | N/A | N/A | |
下一個序列值 | NEXTVAL | N/A | NEXTVAL | getNextID |
如果exp1 = exp2, 返回null | DECODE | NULLIF | ||
用戶登錄賬號ID數字 | UID | SUSER_ID | ||
用戶登錄名 | USER | SUSER_NAME | ||
用戶數據庫ID數字 | UID | USER_ID | ||
用戶數據庫名 | USER | USER_NAME | ||
用戶環境(audit trail) | USERENV | N/A | ||
在CONNECT BY子句中的級別 | LEVEL | N/A | ||
統計函數: | ||||
Function | Oracle | Microsoft SQServer | Symfoware | DBServer |
Standard deviation | STDDEV | STDEV or STDEVP | N/A | |
Variance | VARIANCE | VAR or VARP | N/A | |
統計行數 | count | count | count | count(*) |
要點: | ||||
1. SymfoWARE中,使用統計函數count時,不能夠使用"count(1)"這樣的形式,必須做成"count(*)"。 | ||||
操作符: | ||||
比較操作符: | ||||
算符 | Oracle | Microsoft SQServer | Symfoware | |
不大於,不小於 | N/A | !> , !< | N/A | |
提交集合中的所有值 | != ALL, <> ALL, < ALL, | != ALL, <> ALL, < ALL, | <> ALL, < ALL, | |
> ALL, <= ALL, >= ALL, != SOME, <> SOME, | > ALL, <= ALL, >= ALL, != SOME, <> SOME, | > ALL, <= ALL, >= ALL, <> SOME, | ||
< SOME, > SOME, | < SOME, > SOME, | < SOME, > SOME, | ||
<= SOME, >= SOME | <= SOME, >= SOME | <= SOME, >= SOME | ||
值{爲|不爲}空 | IS NULL, IS NOT NULL | Same. Also = NULL, | IS NULL, IS NOT NULL | |
!= NULL for backward compatibility (not recommended). | ||||
運算符 | Oracle | Microsoft SQ | Symfoware | DBServer |
連接運算符 | ║ | + | ║ | getConcatSQLString |
比較運算符 | !=,^=,〈〉 | 〈〉,!=,!>,!< | 〈〉 | |
[not in] | [not in] | [not in] | ||
Any | Any | Any | ||
Some | Some | Some | ||
All | All | All | ||
Between x and y | Between x and y | Between x and y | ||
Exists | Exists | exists | ||
X [not] like y | X [not] like y | X [not] like y | ||
Is [not] null | Is [not] null | Is [not] null | ||
理論運算符 | Not | Not | not | |
And | And | And | ||
Or | Or | or | ||
集合運算符 | Union | Union | Union | |
Union all | Union all | Union all | ||
intersect | exists | exists | ||
minus | Exists, not in | Exists, not in | ||
其它運算符 | (+)外部結合 | [left|right] outer join | ||
prior | --- | |||
要點: | ||||
1. SymfoWARE中,不能夠使用"!=" 和"^=" , 必須使用"<>"。 | ||||
2. 數據庫的交集操作: 取兩個結果集的公共部分 | ||||
Oracle中,使用幾何運算符intersect, | ||||
例如: (select aa from test1) intersect (select aa from test) | ||||
SQLServer中 ,沒有交集運算符,需要使用exists運算符來達到交集的效果, | ||||
例如:select aa from test1 where exists (select aa from test where test.aa=test1.aa) | ||||
Symfoware與SQLServer一樣都沒有交集運算符,需要使用exists運算符來達到交集效果 | ||||
3. 數據庫的差集操作: 從一個集合中減去兩個集合的公共部分 | ||||
Oracle中,使用幾何運算符minus, | ||||
例如: (select aa from test)minus (select aa from test1) | ||||
SQLServer中 ,沒有差集運算符,需要使用exists和not in運算符來達到差集的效果, | ||||
例如:SELECT aa FROM test b WHERE EXISTS |
||||
(SELECT aa FROM test WHERE b.aa NOT IN (SELECT aa FROM test1 c WHERE b.aa = c.aa)) | ||||
Symfoware與SQLServer一樣都沒有差集運算符,需要使用exists和not in運算符來達到差集效果 | ||||
4. 數據庫的並集操作: 取兩個結果集的合集 | ||||
SymfoWare中,由union連接得子查詢語句必須要用“()”包圍,整個union連接不用“()”,並且union語句必須是最後一個語句塊 | ||||
例如: | ||||
Oracle中, select aa from test union select aa from test1 | ||||
Symfoware中, select id from test_2 union select id from test_1 |
DML語句: | ||
SELECT statement | ||
INSERT statement | ||
DELETE statement | ||
UPDATE statement | ||
SELECT statements語句 | ||
Oracle和Microsoft SQL Server用的SELECT語句的語法是類似的。 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT [/*+ optimizer_hints*/] [ALL | DISTINCT] select_list [FROM {table_name | view_name | select_statement}] [WHERE clause] [GROUP BY group_by_expression] [HAVING search_condition] [START WITH … CONNECT BY] [{UNION | UNION ALL | INTERSECT | MINUS} SE |
SELECT select_list [INTO new_table_] FROM table_source [WHERE search_condition] [ GROUP BY [ALL] group_by_expression [,…n] [ WITH { CUBE | ROLLUP } ] [HAVING search_condition] [ORDER BY order_expression [ASC | DESC] ] |
Select [{distinct│all} {column_name│expression [[as] alias]}… from { table_name [[as] alias]│(select clause) } [where condition] [group by expression [having condition]] [union [all] select clause] [order by column_name [asc│desc]] [parapel] [with option lock_mode (special locked mode)] |
說明: | ||
1. Symfoware在with option lock_mode語句中,可以指定加鎖模式或不加鎖;Oracle使用for update 獲得鎖 | ||
2. 獲取分級構造的數據時,多用的SQL語法 START WITH ... CONNECT BY ... ,但它Oracle固有的語法,在其他DBMS中不能使用。 | ||
SQL Server不支持Oracle的START WITH…CONNECT BY子句。在SQL Server中,你可以用創建一個執行同樣任務的存儲過程來代替。 | ||
3. SQL Server不支持Oracle的INTERSECT和MINUS集合。SQL Server的EXISTS和NOT EXISTS子句可以完成同樣的任務。 | ||
4. 使用Symfoware數據庫時,用ResultSet.getXXXXX()指定列名時,必須使用大寫字符。 | ||
例: | ||
下面的例子使用INTERSECT操作符來爲所有有學生的班級找到課程代碼和課程名稱。注意EXISTS操作符是怎樣代替INTERSECT操作符的。 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT CCODE, CNAME | SELECT CCODE, CNAME | SELECT CCODE, CNAME |
FROM DEPT_ADMIN.CLASS | FROM DEPT_ADMIN.CLASS C | FROM DEPT_ADMIN.CLASS C |
INTERSECT | WHERE EXISTS | WHERE EXISTS |
SELECT C.CCODE, C.CNAME | (SELECT 1 FROM STUDENT_ADMIN.GRADE G | (SELECT 2 FROM STUDENT_ADMIN.GRADE G |
FROM STUDENT_ADMIN.GRADE G, | WHERE C.CCODE = G.CCODE) | WHERE C.CCODE = G.CCODE) |
DEPT_ADMIN.CLASS C | ||
WHERE C.CCODE = G.CCODE | ||
下例使用MINUS操作符來找出那些沒有學生的班級。 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT CCODE, CNAME | SELECT CCODE, CNAME | SELECT CCODE, CNAME |
FROM DEPT_ADMIN.CLASS | FROM DEPT_ADMIN.CLASSC | FROM DEPT_ADMIN.CLASSC |
MINUS | WHERE NOT EXISTS | WHERE NOT EXISTS |
SELECT C.CCODE, C.CNAME | (SELECT 1 FROM STUDENT_ADMIN.GRADE G | (SELECT 2 FROM STUDENT_ADMIN.GRADE G |
FROM STUDENT_ADMIN.GRADE G, | WHERE C.CCODE = G.CCODE) | WHERE C.CCODE = G.CCODE) |
DEPT_ADMIN.CLASS C | ||
WHERE C.CCODE = G.CCODE | ||
INSERT語句 | ||
Oracle和Microsoft SQL Server用的INSERT語句的語法是類似的。 | ||
Oracle | Microsoft SQ | Symfoware |
INSERT INTO | INSERT [INTO] | Insert into table_name |
{table_name | view_name | select_statement} | {table_name [ [AS] table_alias] | { |
[(column_list)]{values_list | select_statement} | WITH ( […n]) | default values│[column_name…] |
| view_name [ [AS] table_alias] | { | |
| rowset_function_limited } | values ({value│expression}) | |
{ [(column_list)] | [for special simplicity value]│ | |
{ VALUES ( { DEFAULT | NULL | select clause | |
| expression }[,…n] ) | } | |
| derived_table | } | |
| execute_statement } | [with option lock_mode (special locked mode)] | |
} | DEFAULT VALUES | ||
說明: | ||
1. Symfoware中使用with option lock_mode語句,可以指定查詢數據的加鎖模式,或者不加鎖。 | ||
2. oracle 和symfoware都可以使用數組,統一插入多行 | ||
3. Transact-SQL語言支持插入表和視圖,但是不支持SELECT語句中的INSERT操作 | ||
4. SQLServer中,關鍵字DEFAULT不能用於標識列。要產生下一個連續值,則有IDENTITY屬性的列一定不能列入column_list或者values_clause。不一定非要用DEFAUL關鍵字來獲得一列的缺省值。在Oracle中,如果該列沒有被column_list引用並且它有一個缺省值,則缺省值將放入列中,這是執行移植時最兼容的方法。 | ||
5. Symfoware中要插入的字段名前不能帶表名 | ||
例: | ||
Oracle | Microsoft SQ | Symfoware |
INSERT INTO | INSERT INTO GRADE | INSERT INTO GRADE |
(SELECT SSN, CCODE, GRADE FROM GRADE) | (SSN, CCODE, GRADE) | (SSN, CCODE, GRADE) |
VALUES ('111111111', '1111',NULL) | VALUES ('111111111', '1111',NULL) | VALUES ('111111111', '1112',NULL) |
一個有用的Transact-SQL選項(EXECute procedure_name)是執行一個過程並且用管道把它的輸出值輸出到一個目標表或者視圖。Oracle不允許你這樣做。 | ||
DELETE語句 | ||
大多數情況下,不必修改DELETE語句。但如果在Oracle中執行依賴SELECT語句的刪除操作,就必須進行修改,因爲在Transact-SQL不支持這種功能。(見下例) | ||
Oracle | Microsoft SQ | Symfoware |
DELETE [FROM] | DELETE [FROM ] | Delete from table_name |
{table_name | view_name | select_statement} | {table_name [[AS] table_alias] WITH | [where {condition│current of cursor name}] |
[WHERE clause] | (<table_hint_limited> […n]) | [with option lock_mode (special locked mode)] |
| view_name [ [AS] table_alias] | ||
| rowset_function_limited | ||
} | ||
[ FROM {<table_source>} [,…n] ] | ||
[WHERE | ||
{ <search_condition> | ||
| { [ CURRENT OF | ||
{ | ||
{ [ GLOBAL ] cursor_name } | ||
cursor_variable_name | ||
}] | ||
} | ||
] | ||
[OPTION (<query_hint> [,…n])] | ||
說明: | ||
1. Transact-SQL支持在WHERE子句中使用子查詢,FROM子句也一樣。後者可以產生更有效的語句。參看“UPDATE語句”中的例子。 | ||
2. Oracle和SQLServer可以省略from語句;Symfoware不能省略from語句。使用光標時,可以刪除光標名。 | ||
3. Symfoware使用with option lock_mode語句,可以指定導入刪除對象數據時的數據的加鎖模式。 | ||
例: | ||
Oracle | Microsoft SQ | Symfoware |
delete from (select * from test2 where aa>40) | delete from test2 where aa>40 | delete from test2 where aa>40 |
delete (select * from test2 where aa>41) | delete test2 where aa>40 | |
delete test1 where aa > | delete test1 where aa > | delete from test_1 where id > |
(select max(aa) from test) | (select max(aa) from test) | (select max(id) from test_2) |
UPDATE語句 | ||
因爲Transact-SQL支持Oracle的UPDATE絕大多數語法,所以只需要很小的修改。 | ||
Oracle | Microsoft SQ | Symfoware |
UPDATE | UPDATE | Update [table_name] |
{table_name | view_name | select_statement} | {table_name [ [AS] table_alias] WITH | set column_name={value│default} |
SET [column_name(s) = {constant_value | | ( <table_hint_limited> […n]) | [where {condition│current of cursor name}] |
expression | select_statement | column_list | | view_name [ [AS] table_alias] | [with option lock_mode (special locked mode)] |
variable_list} | | rowset_function_limited | |
{where_statement} | } | |
SET | ||
{column_name = {expression | DEFAULT | NULL} | ||
| @variable = expression | ||
| @variable = column = expression } [,…n] | ||
{{[FROM {<table_source>} [,…n] ] | ||
[WHERE | ||
<search_condition>] } | ||
| [WHERE CURRENT OF | ||
{ { [GLOBAL] cursor_name } | cursor_variable_name} | ||
] } [OPTION (<query_hint> [,…n] )] | ||
說明: | ||
1. Symfoware使用with option lock_mode語句,可以指定導入刷新對象數據時的數據加鎖模式或者不指定鎖。 | ||
2. Transact-SQL的UPDATE語句不支持依賴SELECT語句的更新操作。如果Oracle程序這樣做了,可以把SELECT語句變成一個視圖,然後在SQL Server的UPDATE語句中使用這個視圖名字。 | ||
3. SymfoWare中要更新的字段前不可以跟表名,但where條件中可以跟表名。 | ||
4. Transact-SQL和Oracle SQL都支持在一個UPDATE語句中使用子查詢。但是Transact-SQL的FROM子句可以用來創建一個基於節點的UPDATE。這個能力是你的UPDATE語法更加可讀並且在某種意義上提高了性能。 | ||
Oracle | Microsoft SQ | Symfoware |
DECLARE | DECLARE | |
VAR1 NUMBER(10,2); | @VAR1 NUMERIC(10,2) | |
BEGIN | SELECT @VAR1 = 2500 | |
VAR1 := 2500; | UPDATE STUDENT_ADMIN.STUDENT | |
UPDATE STUDENT_ADMIN.STUDENT | SET TUITION_TOTAL=@VAR1 | |
SET TUITION_TOTAL = VAR1; | ||
END; | ||
UPDATE STUDENT_ADMIN.STUDENT S | UPDATE STUDENT_ADMIN.STUDENT S | UPDATE STUDENT_ADMIN.STUDENT S |
SET TUITION_TOTAL = 1500 | SET TUITION_TOTAL = 1500 | SET TUITION_TOTAL = 1500 |
WHERE SSN IN (SELECT SSN | WHERE SSN IN (SELECT SSN | WHERE SSN IN (SELECT SSN |
FROM GRADE G | FROM GRADE G | FROM GRADE G |
WHERE G.SSN = S.SSN | WHERE G.SSN = S.SSN | WHERE G.SSN = S.SSN |
AND G.CCODE = '1234') | AND G.CCODE = '1234') | AND G.CCODE = '1234') |
UPDATE (SELELCT AA | FROM clause: | |
FROM TEST | ||
WHERE AA=88) | UPDATE | |
SET AA=66 | STUDENT_ADMIN.STUDENT S | |
SET TUITION_TOTAL = 1500 | ||
FROM GRADE G | ||
WHERE S.SSN = G.SSN | ||
AND G.CCODE = '1234' | ||
模式匹配 | ||
Oracle | Microsoft SQ | Symfoware |
SELECT * FROM STUDENT_ADMIN.STUDENT | SELECT * FROM STUDENT_ADMIN.STUDENT | SELECT * FROM STUDENT_ADMIN.STUDENT |
WHERE LNAME LIKE 'A%' | WHERE LNAME LIKE '[ABC]%' | WHERE LNAME LIKE 'A%' |
OR LNAME LIKE 'B%' | OR LNAME LIKE 'B%' | |
OR LNAME LIKE 'C%' | OR LNAME LIKE 'C%' | |
說明: | ||
1. SQL Server的LIKE關鍵字提供了有用的通配符搜索功能;在Oracle中不支持這個功能;Symfoware只支持標準sql中的通配符。 | ||
2. 除了所有的RDBMS都支持的(%)和(_)通配符以外,SQL Server還支持([ ])和([^])通配符。 | ||
([ ])字符用來查詢在一個範圍內的所有單個字符。例如,如果你需要查詢包含一個從a到f的字符的數據,你可以這樣寫:“LIKE '[a-f]'”或者“LIKE '[abcdef]'”。 | ||
([^])通配符用來標記那些不在特定範圍內的字符。例如,如果除了a到f以外的所有字符都是可以接受的,你可以這樣書寫:LIKE '[^a - f]'或者LIKE '[^abcdef]'。 | ||
用SELECT語句創建表: | |||
Oracle | Microsoft SQ | Symfoware | |
CREATE TABLE newtable | SELECT * | ----------- | |
AS SELECT * FROM oldtable | INTO newtable FROM oldtable | ||
要點: | |||
1. SQLServer中,要SELECT…INTO能夠起作用,必須將使用該程序的數據庫的選項select into/bulkcopy設定爲true。 | |||
2. SymfoWare中建表語句必須包含 ON TABLE_SPACE | |||
例:CREATE TABLE NEWTEST (ID NUMERIC(7) , NAME VARCHAR(30) , BIRTH DATE) ON ESMSPACE1 | |||
序列: | |||
Oracle | Microsoft SQ | Symfoware | DBServer |
有 | 無 | 有 | |
create sequence sequence_name | create table | create sequence sequence_name | |
sequence_table_name (id integer) | |||
insert into sequence_table_name | |||
values (initialValue) | |||
select sequence_name.nextval | select id from sequence_table_name | select seq_test.nextval | getNextID(Connection , String ) |
from dual | update sequence_table_name | from rdbii_system.rdbii_assisttable | |
set id=newValue | |||
要點: | |||
對於有序列概念的數據庫直接創建序列來取得主鍵,沒有序列概念的數據庫使用一個一行一列的表來存儲主鍵值,每次取得後 | |||
要更新這個值。這些操作都封裝在getNextID方法中直接調用這個方法即可得到主鍵值。 | |||
TRUNCATE TABLE語句: | |||
在Oracle和Microsoft SQL Server中TRUNCATE TABLE語句的語法是相似的。TRUNCATE TABLE語句用來把一個表中的所有行清除掉,並且這個操作是不能後滾的。該表的結構和索引仍然存在。DELETE觸發器不會被執行。如果該表被一個FOREIGN KEY引用,則該表不能被砍掉。 | |||
Oracle | Microsoft SQ | Symfoware | |
TRUNCATE TABLE table_name | TRUNCATE TABLE table_name | rdbfmt(-mid) | |
[{DROP | REUSE} STORAGE] | |||
1. 在SQL Server中,這個語句只能由表的所有者給出。 在Oracle中,只有當你是表的所有者或者有DELETE TABLE系統特權時才能使用該語句。 |
|||
2. Oracle的TRUNCATE TABLE命令可以隨意的釋放被表中的行佔據的存儲空間。 SQL Server的 TRUNCATE TABLE則總是回收被表中的數據和與之關聯的索引佔據的空間。 |
|||
連接子句(Join clauses) | |||
Microsoft SQL Server 7.0允許在一個連接子句中連接多達256個表,包括臨時的和永久的表。在Oracle中,沒有連接限制。 | |||
在Oracle中使用外部連接時,外部連接操作符(+)典型的放置在子列(foreign key)的後面。(+)依靠少數幾個唯一值來識別該列。除非子列允許空值,否則總是這樣的。如果子列允許空值,則(+)被放置在父列(PRIMARY KEY或者UNIQUE約束)上。你不能把(+)同時放在等號(=)的兩邊。 | |||
用SQL Server,你可以使用(*=)和(=*)外部連接操作符。(*)用來標識一個有很多唯一值的列。如果子列不允許空值,則(*)被放在等號的父列一邊。在Oracle中,(*)的放置正好相反。不能把(*)同時放在等號的兩邊。 | |||
(*=)和(=*)被認爲是傳統的連接操作符。SQL Server也支持下面列出的SQL-92標準的連接操作符。建議你使用這種語法。SQL-92標準語法比(*)操作符更強大,限制更小。 | |||
Join操作 | 描述 | ||
CROSS JOIN | 這是兩個表的交叉產物。如果在一箇舊式的連接中沒有指定WHERE子句,則返回同一行。在Oracle中,這種類型的連接叫做笛卡兒連接。 | ||
INNER | 該連接指定返回所有的內部行。任何不匹配的行將被丟棄。該連接同一個標準的Oracle表連接是一樣的。 | ||
LEFT[OUTER] | 這種類型的連接指定返回右邊表的所有外部行,即使沒有發現任何匹配行。該操作符同Oracle外部連接(+)是一樣的。 | ||
RIGHT[OUTER] | 這種類型的連接指定返回左邊表的所有外部行,即使沒有發現任何匹配行。該操作符同Oracle外部連接(+)是一樣的。 | ||
FULL [OUTER] | 如果來自任一表的一行不匹配選擇標準,指定該行被包括到結果集中,並且它的符合其它表的輸出列被設定爲NULL。這和把Oracle外部連接操作符放在“=”的兩端是一樣的(col1(+) = col2(+)),而在Oracle中,這是不允許的。 | ||
下面的例子返回所有學生都要上的課程的一個清單。在學生表和年級表之間定義的外部連接允許顯示所有的學生,甚至那些沒有參加任何課程的學生。在課程表上也有一個外部連接,該連接返回課程名字。如果課程表上沒有加上外部連接,則不會返回那些沒有參加任何課程的學生,因爲他們的課程代碼(CCDOE)是空值。 | |||
Oracle | Microsoft SQServer | Symfoware | DBServer |
SELECT S.SSN AS SSN, | SELECT S.SSN AS SSN, | SELECT S.SSN AS SSN, | isSupportSQL92OuterJoin() |
FNAME, LNAME | FNAME, LNAME | FNAME, LNAME | |
FROM STUDENT_ADMIN.STUDENT S, | FROM STUDENT_ADMIN.GRADE G | FROM STUDENT_ADMIN.GRADE G | |
DEPT_ADMIN.CLASS C, | RIGHT OUTER JOIN | RIGHT OUTER JOIN | |
STUDENT_ADMIN.GRADE G | STUDENT_ADMIN.STUDENT S | STUDENT_ADMIN.STUDENT S | |
WHERE S.SSN = G.SSN(+) | ON G.SSN = S.SSN | ON G.SSN = S.SSN | |
AND G.CCODE = C.CCODE(+) | LEFT OUTER JOIN | LEFT OUTER JOIN | |
DEPT_ADMIN.CLASS C | DEPT_ADMIN.CLASS C | ||
ON G.CCODE = C.CCODE | ON G.CCODE = C.CCODE | ||
說明: | |||
編寫SQL連接語句時,首先要調用isSupportSQL92OuterJoin()方法判斷要操作的數據庫系統是否支持SQL92標準的外聯接 |
條件測試 | ||||
Oracle的DECODE語句和Microsoft SQL Server的CASE表達式都執行條件測試。當test_value中的值和後面的任何表達式匹配的時候,相關的值就返回。如果沒有找到任何匹配的值,就返回default_value。如果沒有指定default_value,在沒有匹配的時候,DECODE和CASE都返回一個NULL。下表顯示了該語句的語法,同時給出了轉換DECODE命令的示例。 | ||||
Oracle | Microsoft SQ | Symfoware | ||
DECODE (test_value, | CASE input_expression | ??? | ||
expression1, value1 | WHEN when_expression THEN result_expression | |||
[[,expression2, value2] […]] | [[WHEN when_expression THEN result_expression] [...]] | |||
[,default_value] | [ELSE else_result_expression] | |||
) | END | |||
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA | CREATE VIEW STUDENT_ADMIN.STUDENT_GPA | |||
(SSN, GPA) | (SSN, GPA) | |||
AS SELECT SSN, ROUND(AVG(DECODE(grade | AS SELECT SSN, ROUND(AVG(CASE grade | |||
,'A', 4 | WHEN 'A' THEN 4 | |||
,'A+', 4.3 | WHEN 'A+' THEN 4.3 | |||
,'A-', 3.7 | WHEN 'A-' THEN 3.7 | |||
,'B', 3 | WHEN 'B' THEN 3 | |||
,'B+', 3.3 | WHEN 'B+' THEN 3.3 | |||
,'B-', 2.7 | WHEN 'B-' THEN 2.7 | |||
,'C', 2 | WHEN 'C' THEN 2 | |||
,'C+', 2.3 | WHEN 'C+' THEN 2.3 | |||
,'C-', 1.7 | WHEN 'C-' THEN 1.7 | |||
,'D', 1 | WHEN 'D' THEN 1 | |||
,'D+', 1.3 | WHEN 'D+' THEN 1.3 | |||
,'D-', 0.7 | WHEN 'D-' THEN 0.7 | |||
,0)),2) | ELSE 0 | |||
FROM STUDENT_ADMIN.GRADE | END),2) | |||
GROUP BY SSN | FROM STUDENT_ADMIN.GRADE | |||
GROUP BY SSN | ||||
CASE表達式可以支持用SELECT語句執行布爾測試,這是DECODE命令所不允許的。欲瞭解關於CASE表達式的詳細信息,請參閱SQL Server聯機手冊。 |
用戶定義函數 | |||
Oracle | Microsoft SQServer | Symfoware | DBServer |
SELECT SSN, FNAME, LNAME, ) TUITION_PAID, | SELECT SSN, FNAME, LNAME, TUITION_PAID, TUITION_PAID/SUM_MAJOR AS PERCENT_MAJOR | Symfoware中的用戶定義方法內不能寫sql語句 | isSupportUserDefinedFunction() |
TUITION_PAID/GET_SUM_ | FROM STUDENT_ADMIN.STUDENT, | ||
MAJOR(MAJOR) | (SELECT MAJOR, SUM(TUITION_PAID) SUM_MAJOR | getCallFunctionSqlString( | |
AS PERCENT_MAJOR | FROM STUDENT_ADMIN.STUDENT | String strFunctionName, | |
FROM STUDENT_ADMIN.STUDENT | GROUP BY MAJOR) SUM_STUDENT | String[] strParamNames) | |
WHERE STUDENT.MAJOR = SUM_STUDENT.MAJOR | |||
CREATE OR REPLACE FUNCTION GET_SUM_MAJOR | No CREATE FUNCTION syntax is required; use CREATE PROCEDURE syntax. | ||
(INMAJOR VARCHAR2) RETURN NUMBER | |||
AS SUM_PAID NUMBER; | |||
BEGIN | |||
SELECT SUM(TUITION_PAID) INTO SUM_PAID | |||
FROM STUDENT_ADMIN.STUDENT | |||
WHERE MAJOR = INMAJOR; | |||
RETURN(SUM_PAID); | |||
END GET_SUM_MAJOR; | |||
說明: | |||
要使用數據庫的用戶自定義函數(過程)前,首先要調用isSupportUserDefinedFunction()判斷該數據庫系統是否支持這種操作。如果支持,則可以使用getCallFunctionSqlString(functionName,paramterNames)得到調用用戶自定義函數的sql語句 | |||
把值轉換爲不同的數據類型 | |||
Microsoft SQL Server的CONVERT和CAST函數都是多目標轉換函數。它們提供了相似的功能,把一種數據類型的表達式轉換爲另一種數據類型的表達式,並且支持多種專門數據的格式。 | |||
CAST(expression AS data_type) | |||
CONVERT (data type[(length)], expression [, style]) | |||
CAST是一個SQL-92標準的函數。這些函數執行同Oracle的TO_CHAR、TO_NUMBER、TO_DATE、HEXTORAW以及RAWTOTEXT函數相同的功能。 | |||
這裏所指的數據類型是任何表達式將被轉換成爲的系統數據類型。不能使用用戶定義的數據類型。長度參數是可選的,該參數用於char、varchar、binary以及varbinary數據類型。允許的最大長度是8000。 | |||
轉換 | Oracle | Microsoft SQServer | Symfoware |
字符到數字 | TO_NUMBER('10') | CONVERT(numeric, '10') | cast |
數字到字符 | TO_CHAR(10) | CONVERT(char, 10) | ------- |
字符到日期 | TO_DATE('04-JUL-97') | CONVERT(datetime, '04-JUL-97') | Cnv_date |
TO_DATE('04-JUL-1997', | CONVERT(datetime, '04-JUL-1997') | ||
'dd-mon-yyyy') | CONVERT(datetime, 'July 4, 1997') | ||
TO_DATE('July 4, 1997', | |||
'Month dd, yyyy') | |||
日期到字符 | TO_CHAR(sysdate) | CONVERT(char, GETDATE()) | Cnv_char |
TO_CHAR(sysdate, 'dd mon yyyy') | CONVERT(char, GETDATE(), 106) | ||
TO_CHAR(sysdate, 'mm/dd/yyyy') | CONVERT(char, GETDATE(), 101) | ||
16進制到2進制 | HEXTORAW('1F') | CONVERT(binary, '1F') | ------- |
2進制到16進制 | RAWTOHEX | CONVERT(char, binary_column) | ------- |
(binary_column) | |||
請注意字符串是怎樣轉換爲日期的。在Oracle中,缺省的日期格式模型是“DD-MON-YY”如果你使用任何其它格式,你必須提供一個合適的日期格式模型。CONVERT函數自動轉換標準日期格式,不需要任何格式模型。 | |||
從日期轉換到字符串時,CONVERT函數的缺省輸出是“dd mon yyyy hh:mm:ss:mmm(24h)”。用一個數字風格代碼來格式化輸出,使它能輸出爲其它類型的日期格式模型。欲瞭解CONVERT函數的詳細信息,請參閱SQL Server聯機手冊。 | |||
下表顯示了Microsoft SQL Server日期的缺省輸出。 | |||
Without Century | With Century | Standard | Output |
- | 0 or 100 (*) | Default | mon dd yyyy hh:miAM (or PM) |
1 | 101 | USA | mm/dd/yy |
2 | 102 | ANSI | yy.mm.dd |
3 | 103 | British/French | dd/mm/yy |
4 | 104 | German | dd.mm.yy |
5 | 105 | Italian | dd-mm-yy |
6 | 106 | - | dd mon yy |
7 | 107 | - | mon dd, yy |
8 | 108 | - | hh:mm:ss |
- | 9 or 109 (*) | Default milliseconds | mon dd yyyy hh:mi:ss:mmm (AM or PM) |
10 | 110 | USA | mm-dd-yy |
11 | 111 | Japan | yy/mm/dd |
12 | 112 | ISO | yymmdd |
- | 13 or 113 (*) | Europe default | dd mon yyyy hh:mm:ss:mmm(24h) |
14 | 114 | - | hh:mi:ss:mmm(24h) |