DB-difference

數據類型比較:
類型 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數據類型 Numberp,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中有更多的數據類型。根據數據的性質,需要置換適當的類型。SymfowareDate,Time類型可分別用jdbcsetDate,setTime方法
timestampjdbc中無對應類型
  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.OracleSQLServer中可以向數值類型字段添加字符數據(必須是數字字符,否則報錯);但在SymfoWare中不可以這樣。
                   例如:        Symfoware數據庫中添加記錄:        insert into test(aa) value(11)
    OracleSQLServer中也可以寫爲: 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數據庫中沒有取餘函數,可以使用castfloor組合來取餘,例如: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)
               SymfowareSQLServer一樣都沒有交集運算符,需要使用exists運算符來達到交集效果
         3. 數據庫的差集操作:   從一個集合中減去兩個集合的公共部分
               Oracle中,使用幾何運算符minus                        
                         例如: select aa from testminus select aa from test1
               SQLServer ,沒有差集運算符,需要使用existsnot 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))
               SymfowareSQLServer一樣都沒有差集運算符,需要使用existsnot 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. Symfowarewith 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 {conditioncurrent 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()判斷該數據庫系統是否支持這種操作。如果支持,則可以使用getCallFunctionSqlStringfunctionName,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) 
       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章