最近做 了一个小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<SellVO> listSellByCall(String trainName, Date startTime) { String sql = "{call checksells(?,?)}"; Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; List<SellVO> voList = new ArrayList<SellVO>(); 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(); } } } }
相关推荐
在SQL Server中,触发器和存储过程是两个重要的数据库编程元素,它们对于数据管理和业务逻辑的实现至关重要。本文将深入探讨这两个概念以及如何在实际操作中使用它们。 首先,我们来了解一下触发器(Triggers)。...
### SqlServer触发器调用WebService知识点详解 #### 一、SqlServer触发器简介 在了解如何通过Sql Server触发器调用WebService之前,我们首先需要对触发器有一个基本的认识。触发器是一种特殊的存储过程,它被定义...
在SQL Server中,存储过程是一种预编译的SQL语句集合,它允许开发人员封装一组复杂的操作,并在需要时重复调用。存储过程对于数据库管理、数据处理和性能优化具有重要意义。本文主要介绍如何在SQL Server中导出和...
理解存储过程的编写、调用和管理,是成为熟练的SQL Server开发者的关键步骤。 触发器是另一种数据库对象,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。触发器常用于实施业务规则,例如确保...
总结来说,存储过程和触发器是SQL Server中非常强大的工具,它们可以帮助开发者编写高效、安全且易于维护的应用程序。通过对这些技术的理解和合理应用,可以极大地提升数据库系统的性能和可靠性。
在本文档中,我们将深入探讨SQL Server存储过程和触发器的基础知识和高级特性。首先,让我们回顾一下存储过程和触发器在SQL Server中的重要性以及它们的应用场景。 存储过程是存储在数据库中的一组SQL语句和可选...
在SQL Server 2008中,编写和管理存储过程与触发器通常通过SQL Server Management Studio (SSMS) 进行。你可以在这里创建、修改、查看和执行它们,并通过T-SQL(Transact-SQL)语言进行编程。T-SQL是SQL Server的...
然而,有时候根据特定的需求,可能需要自定义主键生成策略,例如,通过存储过程和触发器来实现。下面我们将深入探讨如何利用这些工具创建主键生成器。 首先,让我们理解存储过程。存储过程是预编译的SQL语句集合,...
SQL Server 存储过程和触发器 SQL Server 存储过程是指在服务器端运行的预编译的 SQL 语句集合,它可以完成所有数据库操作,并可通过编程方式控制对数据库信息访问的权限,确保数据库的安全。存储过程可以自动完成...
总结来说,SQL Server 2008提供了强大的存储过程和触发器功能,能够帮助数据库管理员和开发者高效、灵活地处理数据库相关操作,提高系统的性能和安全性。通过对存储过程和触发器的学习和应用,能够对数据库实现更深...
存储过程和触发器是SQL Server中非常重要的组成部分,它们可以帮助开发者构建高效、安全和易于维护的应用程序。通过理解和掌握如何创建及使用这些对象,可以极大地提升数据库应用程序的功能性和性能。 以上是关于...
在SQL Server中,触发器是一种特殊类型的存储过程,它被定义为当特定事件(如INSERT、UPDATE或DELETE操作)发生时自动执行的一段代码。通过触发器,数据库管理员可以确保数据的完整性和一致性,同时实现复杂的业务...
本文将对存储过程和触发器的定义、类型、优点,以及创建、调用和删除等方面进行深入研究,并探讨了各种语言环境下存储过程的使用方法和应注意的事项。 存储过程是预编译的一组Transact-SQL代码,存储在服务器上,...
在SQL Server 2005中,触发器、事务、存储过程和视图是数据库管理中的核心概念,它们对于数据库的高效运作和数据完整性至关重要。这些T-SQL语句是数据库开发人员和管理员日常工作中不可或缺的工具。 首先,让我们...
本资源“一个SqlServer触发器的Delphi应用源代码..rar”显然是一个结合了这两个技术的实例,旨在帮助开发者了解如何在Delphi中使用SQL Server触发器。 触发器是SQL Server中的一个重要特性,它是一种存储过程,由...
在SQL Server 2008中,理解如何有效地利用存储过程、游标和触发器,能帮助开发者编写出更加高效和维护友好的数据库应用程序。通过实践和深入理解这三个概念,你将能够更好地管理数据库,实现更高效的数据操作和更...
用户定义的存储过程由用户使用Transact-SQL编写,而扩展存储过程则涉及到C语言的API。创建存储过程需遵循一定的规则,例如,不能在存储过程中包含某些特定的Transact-SQL语句。创建存储过程使用`CREATE PROCEDURE`...
SQL Server 2005 中的触发器是一种特殊类型的存储过程,它会在针对特定表或视图执行UPDATE、INSERT或DELETE语句时自动触发。触发器是表定义的一个重要组成部分,尽管不能直接通过名称调用,但当用户对表中的数据进行...
在提供的"第一次大作业.doc"可能包含了关于如何编写和使用存储过程和触发器的实验说明,而"SQLQuery1.sql"可能包含了一些示例查询或存储过程的代码。通过深入学习这些文档和代码,你可以更深入地理解SQL Server 2008...