近來,在項目中用到數據移植,將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中的大小寫問題。