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) 
       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章