sysbase 的特殊性,特殊對待

      近來,在項目中用到數據移植,將oracle中的數據移到sysbase中, 對它進行了整理。

1.數據類型介紹比較
ORACALE                                    SYBASE
VARCHAR2(n)                           VARCHAR(n)
NVARCHAR2(n)                   VARCHAR(n)
CHAR                                          CHAR
CHAR(1)                                      BIT
CHAR(n)                                CHAR(n)
NCHAR(n)                             NCHAR(n)
NUMBER(3)                         TINYINT(0-255)
NUMBER(4)                        SAMLLINT(-32768~32768)
NUMBER(9)                         INT(-231~231-1)
NUMBER(19,4)                MONEY/SMALLMONEY
NUMBER                                   REAL,FLOAT,DOUBLE
FLOAT                                         FLOAT,REAL

FLOAT(p)                            FLOAT(p),DOUBLE PRECISION
NUMBER(p,s)                         NUMERIC(p,s)
NUMBER(p,s)                         DECIMAL(p,s)
BINARY_FLOAT                       N/A
BINARY_DOUBLE                   N/A
DATE                                         DATETIME(1/300 second)
                                                    SMALLDATETIME(minute)
                                                    DATE, TIME
CLOB                                         TEXT
BLOB                                          IMAGE
RAW(n)                                      BINARY(n), VARBINARY(n), IMAGE
BFILE                                         N/A
2.JDBC應用

ODBC應用一般不需要改變
 (1)jdbc 驅動的設置
import com.sybase.jdbcx.SybDriver;
SybDriver sybDriver = (SybDriver)
Class.forName ("com.sybase.jdbc3.jdbc.SybDriver").newInstance();
sybDriver.setVersion(com.sybase.jdbcx.SybDriver.VERSION_6);
DriverManager.registerDriver(sybDriver);
//connect to database
Properties props = new Properties();
props.put("user", "userid");
props.put("password", "user_password");
/* Make sure you set connection properties before  attempting to make a connection. You can also* set the properties in the URL.*/
Connection con = DriverManager.getConnection
("jdbc:sybase:Tds:host:port", props);

(2)sql 語句的使用

Statement stmt = conn.createStatement
(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
// Use the Statement to return an updatable ResultSet
ResultSet rs = stmt.executeQuery("SELECT * FROM T1 WHERE...");

while (rs.next())    
{
rs.updateString(2, "xyz");
rs.updateInt(3,100);
rs.updateRow();
}
(3)sql語句的注意,在左右連接中的問題

col1 = col2(+) ===? col1*=col2(left outer join)
col1(+) = col2 ===? col1=*col2 (right outer join)

Sybase ASE DOES NOT allow another join relationship on a table that already
 has an outer join.

select count(*)
from Circuit a,Device c,Device e,
     (SELECT a.DeviceID as resid
      from Device a, singleuserresauth b,node c
      where  a.DeviceID = b.resid and b.netuserid='TEST2'
      and a.nodecode = c.nodecode and c.nodefullcode like  '%NOD999%') r 
where  (r.resid=c.deviceid or  r.resid=e.deviceid)  and  a.ADeviceID=c.DeviceID 
    and isnull(c.ChangeType,0)=0 and isnull(e.ChangeType,0)=0
    and a.BDeviceID*=e.DeviceID AND a.ChangeType = 1 AND a.IPVersion = 'IPv4'
    AND a.CirPropCode in (select CirPropCode from cirprop where CirPropFullCode like %PRP999%')


3.注意事項
1、採用小事務
2、查詢語句要儘可能用上索引
3、避免where語句中數據類型轉換
4、> 變爲 >=,> 變爲 <=
5、not exists 變爲exists ,not in變爲in
6、 判斷數據存在性時用exists而不用count(*)
7、表連接操作中的or語句,若能變爲union操作,ASE可優化
8、min()和max()函數
若這兩個函數所使用的列爲索引的第一列,ASE可優化,只需索引頁。不要在兩函數中用表達式,如:
max(numeric_col*2),而把它變爲max(numeric_col)*2
9、儘可能使用存貯過程,並適時對存貯過程進行從新編譯(sp_recompile) 
10、oracle中的序列來進行主鍵定義的話,可以採用sysbase中的自動增長型。

11.注意sysbase中的大小寫問題。

 

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