sybase过程生成主键序列及java调用过程:
用sybase做一个跟Oracle序列功能相同的东东,方便移植使用
1.创建序列保存表
----创建序列生成表
DROP TABLE dbo.AMS_YJ_MANAGE_SEQ
GO
----序列生成记录表
CREATE TABLE dbo.AMS_YJ_MANAGE_SEQ (
YJ_TYPE varchar(64) NOT NULL,
YJ_NAME varchar(64) NULL,
YJ_MAX int NOT NULL,
USER_ID int NULL,
CONSTRAINT AMS_YJ_MANAGE_SEQ_PK PRIMARY KEY NONCLUSTERED(YJ_TYPE)
WITH max_rows_per_page = 0, reservepagegap = 0
)
LOCK ALLPAGES
GO
INSERT INTO dbo.AMS_YJ_MANAGE_SEQ(YJ_TYPE, YJ_NAME, YJ_MAX, USER_ID)
VALUES('AMS_YJ_COMVAN_SEQ', '应急通信车', 10017, NULL)
GO
2. 创建序列生成存储过程 (@TYPE_MAX 返回参数)
DROP PROCEDURE dbo.YJ_MANAGE_GET_MAX
GO
CREATE PROCEDURE dbo.YJ_MANAGE_GET_MAX( @YJ_TYPE VARCHAR(256), @TYPE_MAX INT OUTPUT) AS
---序列生成器
BEGIN
DECLARE @MAX_BAK INT
SELECT @MAX_BAK = YJ_MAX+1 from AMS_YJ_MANAGE_SEQ WHERE YJ_TYPE=@YJ_TYPE
IF @MAX_BAK<>0
BEGIN
UPDATE AMS_YJ_MANAGE_SEQ SET YJ_MAX=YJ_MAX+1 WHERE YJ_TYPE=@YJ_TYPE
END
SELECT @TYPE_MAX= @MAX_BAK
RETURN @TYPE_MAX
END
GO
3. java调用
/**
* 取当前应急类型的最大编号
* @return
*/
public int getYjManagerMax(String yj_type) {
int isSyn= 0;
CallableStatement cStmt = null;
String sqlStr = "{call dbo.YJ_MANAGE_GET_MAX(?,?)}";
try {
cStmt = conn.prepareCall(sqlStr);
cStmt.setString(1,yj_type);
cStmt.registerOutParameter(2,java.sql.Types.INTEGER);
cStmt.execute();
isSyn= cStmt.getInt(2); ----返回的序列号
System.out.println("yyyyyy====="+isSyn);
} catch (SQLException e) {
e.printStackTrace();
isSyn= -1;
} finally {
DBManager.closeDBStatement(cStmt);
}
return isSyn;
}