diff --git "a/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.26 \347\254\254\345\215\201\344\270\211\350\212\202\350\257\276-\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.26 \347\254\254\345\215\201\344\270\211\350\212\202\350\257\276-\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..f7095d8666821a79590ca6f7d84b41016419f12f --- /dev/null +++ "b/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.26 \347\254\254\345\215\201\344\270\211\350\212\202\350\257\276-\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,79 @@ +```sql +use BankTest +go + +select * from AccountInfo +select * from BankCard +select * from CardExchange +select * from CardStateChange +select * from CardTransfer + + + +--练习 + +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 +go +create proc proc_GetMinMoney +as + select CardNo 卡号,RealName 姓名,min(CardMoney) 账户余额 from AccountInfo a + inner join BankCard b on a.AccountId=b.AccountId group by CardNo,RealName + having min(CardMoney) in (select top 1 CardMoney from BankCard order by CardMoney) +go + +exec proc_GetMinMoney + + +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 +go +create proc proc_GetSaveMoney +@card varchar(20), +@savemoney varchar(20) +as + update BankCard set CardMoney=CardMoney+@savemoney where CardNo=@card + insert into CardExchange values(@card,@savemoney,'0',GETDATE()) + +go + +exec proc_GetSaveMoney '6225568781547896','400' + + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 +go +create proc proc_GetDrawMoney +@cardid varchar(20), +@draw money +as + if exists(select CardMoney from BankCard where CardNo=@cardid and CardMoney>=@draw) + begin + update BankCard set CardMoney=CardMoney-@draw where CardNo=@cardid + insert into CardExchange values(@cardid,'0',@draw,GETDATE()) + print '1' + end + else + begin + print '-1' + end +go + +exec proc_GetDrawMoney '6225547854125656','500000' + +--4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额,传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 +go +create proc proc_GetBank +@begintime smalldatetime, +@endtime smalldatetime +as + select MoneyInBank 存钱金额,MoneyOutBank 取钱金额,sum(MoneyInBank) 存款总金额,sum(MoneyOutBank) 取款总金额 from CardExchange + where ExchangeTime between @begintime and @endtime group by MoneyInBank,MoneyOutBank +go + +exec proc_GetBank '2022-09-06 10:31:00','2022-09-19 10:56:00' + + +--5. **密码升级**,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级成8位密码 +--(提示:随机生成 0-9 的整数: float(rand()*10)) rand():随机生成0.0-1.0的小数 float:向下取整) + + +``` + diff --git "a/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.26 \347\254\254\345\215\201\344\270\211\350\212\202\350\257\276-\345\255\230\345\202\250\350\277\207\347\250\213\357\274\210procedure\357\274\211.md" "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.26 \347\254\254\345\215\201\344\270\211\350\212\202\350\257\276-\345\255\230\345\202\250\350\277\207\347\250\213\357\274\210procedure\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..5cfef5dffc1a85111d15edc9fbd00dfd38117026 --- /dev/null +++ "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.26 \347\254\254\345\215\201\344\270\211\350\212\202\350\257\276-\345\255\230\345\202\250\350\277\207\347\250\213\357\274\210procedure\357\274\211.md" @@ -0,0 +1,139 @@ +### 一,存储过程 + +#### 1,概念 + +* 是一组为了完成特定功能的T-SQL语句集合,存储在数据库内,可以有用户的应用程序,通过指定存储过程名称及相关参数来执行 + +#### 2,分类 + +* **系统存储过程**:用来管理SQL Server与显示有关数据库和用户的信息的存储过程 + +* **自定义存储过程**:用户在SQL Server中通过采用SQL语句创建存储过程 + + (1)T-SQL存储过程;保存的T-SQL语句集合,可以接受和返回用户提供的参数 + + (2)CLR存储过程;对Microsoft.NET Framework公共语言运行时方法的引用,可以接受和返回用户提供的 参数。在.NET Framework程序集中作为类的公共静态方法实现 + +* **扩展存储过程**:通过编程语言(例如C)创建外部例程,并将这个例程在SQL Server中作为存储过程使用 + + + +#### 3,优点 + +* 存储过程可以**嵌套使用,支持代码重用** +* 存储过程可以接受与使用参数动态执行其中的SQL语句 +* 存储过程比一般的SQL语句**执行速度快** +* **模块化的程序设计,实现代码多次调用**。存储过程只需创建一次,并存储在数据库中,在以后的使用中,便可重复调用,不需要每次都重新编写 +* 存储过程可以**减少网络通讯流量**,可以调用需要若干行T-SQL 代码的操作,而不需要通过网络传送这些代码。 +* + 可以作为**安全机制**。对用户只授予执行存储过程的权限,而不授予用户直接访问相应表的权限,这样既保证了用户操作数据库中的数据,又限制用户访问相应的表,保证了数据的安全 + + + +#### 4,创建存储过程(==procedure==(可简写为proc)) + +```sql +go +create proc Proc_自定义存储名称 +@Proc_Son int +as + (操作) +go +``` + + + +#### 5,执行存储过程(==exec==) + +```sql +--无参 +exec <存储过程名称> + +--带参 +exec <存储过程名称> <形参1>,<形参2>,... + +--带参带返回值 +declare @变量 +exec @变量 = <存储过程名称> <形参1>,<形参2>,... + +--有输入参数,有输出参数的存储过程 +declare @变量 +exec <存储过程名称> <形参1>,<形参2>,@变量 output + +--一个变量同时具备输入输出功能 +declare @变量 <数据类型> = 值 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +``` + + + +#### 6,删除存储过程(==drop==) + +``` +drop proc Proc_存储过程名称 +``` + + + +#### 7,有输入参数,没有输出参数,但是有返回值的存储过程(返回值必须整数) + +```sql +create proc <存储过程名称> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + + return 整数 +go +``` + + + +#### 8,有输入参数,有输出参数的存储过程 & 一个变量具备同时输入输出参数的存储过程 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> output +<变量2> <数据类型> output +... +as + + return 整数 +go +``` + + + +#### 9,常见的系统存储过程 + +| 存储名称 | 详解 | +| :------------------: | :----------------------------------------------------------: | +| sp_databases | 列出服务上的所有数据库 | +| sp_helpdb | 报告有关指定数据库或所有数据库的信息 | +| sp_renamedb | 更改数据库的名称 | +| sp_tables | 返回当前环境下可查询的对象的列表 | +| sp_columns | 返回某个表列的信息 | +| sp_help | 返回某个表的所有信息 | +| sp_helpconstraint | 查看某个表的约束 | +| sp_helpindex | 查看某个表的索引 | +| sp_stored_procedures | 列出当前环境中的所有存储过程 | +| sp_password | 添加或修改登录账户的密码 | +| sp_rename | 重命名存储过程 | +| sp_helptext | 显示默认值,未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本 | + + + +#### 10,存储过程与函数的区别 + +1.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + +2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + +3.储存过程可以输入输出参数,而函数只可以输入参数。 + +4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 + +5.可以在存储过程中调用函数,不可以在函数中调用存储过程。 + +6.函数可以作为条件在语句中使用,但是存储过程不可以。 \ No newline at end of file