sqlserver存储过程、触发器编写和调用

阅读更多

最近做 了一个小demo,数据库采用的是sqlserver。需要用jdbc调用存储过程。

 

1、触发器

 

先上sql

 

 

-- 建退票表 

CREATE TABLE [dbo].[unsubscribe] (
  [id] int  IDENTITY(1,1) NOT NULL,
  [ticket_number] varchar(50) COLLATE Chinese_PRC_CI_AS  NOT NULL,
  [time] datetime  NOT NULL,
  CONSTRAINT [PK__lefts__3213E83F1DE57479] PRIMARY KEY CLUSTERED ([id])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  
ON [PRIMARY]
)  
ON [PRIMARY]
GO

ALTER TABLE [dbo].[unsubscribe] SET (LOCK_ESCALATION = TABLE)
GO
-- 触发器
CREATE TRIGGER [dbo].[tri_unsubscribe]
ON [dbo].[unsubscribe]
WITH EXECUTE AS CALLER
FOR INSERT
AS
begin
declare @tc_num char(20)
select @tc_num=[ticket_number] from inserted
update ticket
set [left_count]=[left_count]+1
where number=@tc_num
end
GO

 

 

触发器:往退票表中插入数据时,需要将余票数+1

 

2、存储过程

 

 

-- 创建指定发车时间和车次的车票销售情况的存储过程

-- 数据库名:tickets
use tickets
 if exists  
  (select name from sysobjects where name = 'checksells' and type = 'p' )
  drop procedure checksells 
  go
-- 创建一个名为checksells的存储过程
create procedure checksells
@trainName varchar(30),@startTime datetime
  as
  begin
select sell.id,sell.train_name,sell.user_number,ticket.start_station,ticket.end_station,ticket.number,ticket.price,ticket.time from sell left join ticket on ticket.number=sell.ticket_number where ticket.train_name=@trainName and CONVERT(varchar(100),ticket.time,0)=CONVERT(varchar(100),@startTime,0)
end
go

-- 测试执行

exec  checksells 'D1050','2019-06-21 04:12:22.123'
  
 go

 

 

存储过程:带两个入参的存储过程

 

 

3、jdbc调用

 

 

/**
	 * 存储过程调用获取销售情况
	 */
	@Override
	public List listSellByCall(String trainName, Date startTime) {
		String sql = "{call checksells(?,?)}";
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		List voList = new ArrayList();
		try {
			conn = JDBCUtils.getConnection();
			pst = conn.prepareCall(sql);
			pst.setString(1, trainName);
			pst.setTimestamp(2, new Timestamp(startTime.getTime()));
			rs = pst.executeQuery();
			while (rs.next()) {
				SellVO vo = new SellVO();
				vo.setId(rs.getInt("id"));
				vo.setTrainName(rs.getString("train_name"));
				vo.setTicketNumber(rs.getString("user_number"));
				vo.setStartStation(rs.getString("start_station"));
				vo.setEndStation(rs.getString("end_station"));
				vo.setTicketNumber(rs.getString("number"));
				vo.setPrice(rs.getInt("price"));
				vo.setTime(rs.getTimestamp("time"));
				voList.add(vo);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(conn, pst, rs);
		}
		return voList;
	}

 

JDBCUtils为连接数据库的工具类

 

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
	private static String url;
	private static String user;
	private static String password;

	static {
		try {
			String driverClassName = PropertyHelper.get("driverClassName");
			Class.forName(driverClassName);
			url = PropertyHelper.get("url");
			user = PropertyHelper.get("user");
			password = PropertyHelper.get("password");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static void close(Connection conn, Statement stat, ResultSet rs) {
		close(conn, stat);
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static void close(Connection conn, Statement stat) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static void close(Connection conn, PreparedStatement stat) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}

 

 

 

 

 

你可能感兴趣的:(sqlserver)