From f78178048666784bc4bfc3aea0fae54536e3d9b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=B1=9F=E9=9B=84?= Date: Mon, 26 Sep 2022 11:44:49 +0800 Subject: [PATCH] 32 --- ...21\346\227\245\345\207\275\346\225\260.md" | 99 +++++++++++++++++ ...22\346\227\245\346\255\273\351\224\201.md" | 21 ++++ ...26\346\227\245\345\255\230\345\202\250.md" | 102 ++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 "32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21021\346\227\245\345\207\275\346\225\260.md" create mode 100644 "32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21022\346\227\245\346\255\273\351\224\201.md" create mode 100644 "32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21026\346\227\245\345\255\230\345\202\250.md" diff --git "a/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21021\346\227\245\345\207\275\346\225\260.md" "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21021\346\227\245\345\207\275\346\225\260.md" new file mode 100644 index 0000000..5f3078c --- /dev/null +++ "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21021\346\227\245\345\207\275\346\225\260.md" @@ -0,0 +1,99 @@ +**自定义函数分为二种,一种是标量值函数,另一种是表格值函数** + +1 标量值函数 :返回一个标量值 + +``` +CREATE FUNCTION [dbo].[GetWeightCharge] +( + @cemskind VARCHAR(30)--渠道 + ,@classsif TINYINT --区间分类 + ,@variate DECIMAL(18,3) --数值大小 + ,@faddons DECIMAL(18,4) --燃油汇率 +) +RETURNS DECIMAL(18,2)--返回值 +AS +BEGIN + DECLARE @charge DECIMAL(18,2) + ,@isfuel BIT --0:不加收;1:加收燃油 + + SELECT TOP 1 @charge=charges,@isfuel=isfuel + FROM dbo.op_weight_cemskind_charge + WHERE cemskind=@cemskind AND classsif=@classsif AND @variate BETWEEN begindata AND enddata + + SET @charge = ISNULL(@charge, 0.00) + + IF(@isfuel=1) + BEGIN + SET @charge=@charge + @charge*(ISNULL(@faddons,0.0000))/100 + END + + RETURN ISNULL(@charge, 0.00) +END + + +GO +``` + +[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0);) + +返回值只能只有一个 + +调用方式 + +``` +select dbo.GetWeightCharge(@cemskind,0,ilong,@faddons) +``` + + + +表值函数是用户定义的函数,它返回表类型的数据。表值函数的返回类型是一个表,因此,可以像使用表一样使用表值函数。 + + + +#### 创建表值函数 + +以下语句示例创建一个表值函数,该函数返回产品列表,包括产品名称,型号年份和价格: + +```sql +CREATE FUNCTION udfProductInYear ( + @model_year INT +) +RETURNS TABLE +AS +RETURN + SELECT + product_name, + model_year, + list_price + FROM + production.products + WHERE + model_year = @model_year; + +``` + +#### 修改表值函数 + +要修改表值函数,请使用`ALTER`关键字。脚本的其余部分是相同的。 + +例如,以下语句通过更改现有参数并添加一个参数来修改`udfProductInYear`表值函数: + +```sql +ALTER FUNCTION udfProductInYear ( + @start_year INT, + @end_year INT +) +RETURNS TABLE +AS +RETURN + SELECT + product_name, + model_year, + list_price + FROM + production.products + WHERE + model_year BETWEEN @start_year AND @end_year +SQL +``` + diff --git "a/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21022\346\227\245\346\255\273\351\224\201.md" "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21022\346\227\245\346\255\273\351\224\201.md" new file mode 100644 index 0000000..d258cb2 --- /dev/null +++ "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21022\346\227\245\346\255\273\351\224\201.md" @@ -0,0 +1,21 @@ +一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了 同样用户B要等用户A释放表A才能继续这就死锁了 + +解决方法: 这种死锁是由于你的程序的'bug'产生的,除了调整你的程序的逻辑别无他法,仔细分析你程序的逻辑, 1:尽量避免同时锁定两个资源 2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源. + + + +两种结局策略 +设置等待超时时间 innodb_lock_wait_timeout +innodb_lock_wait_timeout 默认值是50 +这个超时时间不单是死锁的时候才会算,普通的事务在等待的时候也会算等待时间不能很好的定位死锁问题 + +发起死锁检测,发现死锁主动回滚死锁链中的某一个事务 inondb_deadlock_detect 设置no +当事务被锁时,会查看依赖的线程又没被锁住,最后判断是否出现循环等待。 +**弊端:**对一个锁有 100个请求,检测死锁会耗费大量的cpu资源,执行事务效率大大降低。 + +其他思路 +限制sql 的并发成都,让同一个锁同时,请求有上限例如30 + +修改mysql 源码(大佬) + +逻辑多行:例如,商品单价,和商品总和。吧一个数据,拆分成多份,最后求和。减少行锁的几率 diff --git "a/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21026\346\227\245\345\255\230\345\202\250.md" "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21026\346\227\245\345\255\230\345\202\250.md" new file mode 100644 index 0000000..2bdbd2f --- /dev/null +++ "b/32\350\203\241\346\261\237\351\233\204/\347\254\224\350\256\260/9\346\234\21026\346\227\245\345\255\230\345\202\250.md" @@ -0,0 +1,102 @@ +常用系统存储过程 +系统存储过程,由系统定义,存放在master数据库中,名称以“sp_”开头或”xp_”开头 +自定义存储过程,由用户在自己的数据库中创建的存储过程,以”usp_”开头 + +名称 作用 +sp_attach_db 将数据库附加到服务器上 +sp_attach_single_file_db 将只有一个数据文件的数据库附加到当前服务器上 +sp_changedbowner 更改当前数据库所有者 +sp_changeobjectowner 更改当前数据库中对象的所有者 +sp_column_privileges 返回当前环境中单个表的列的特权信息 +sp_help 报告有关数据库对象、用户定义数据类型或SQL Server 提供的数据类型的信息 +sp_helptext 显示用户定义的默认值,未加密的T-SQL存储过程、用户定义的T-SQL 函数、触发器、计算列、CHECK约束、视图或系统对象 +sp_rename 更改用户创建对象的名称、如表、索引、列、别名数据类型 +sp_renamedb 更改数据库名称 +sp_tables 显示可以在 SELECT 查询语句的FROM 子句中的对象 +sp_stored_procedures 列出所有可用的存储过程 +sp_password 修改而且只能修改标准登录的密码 +sp_who 查看当前用户、会话和进程信息 +sp_monitor 显示有关 SQL Server 的统计信息 +sp_depends 查看详细信息 + + + +1.创建存储 +DELIMITER $$ + +CREATE PROCEDURE get_clients() + +BEGIN + + SELECT * FROM clients; (BEGIN中最后一行要加;) + +END $$ + +DELIMITER ; + +获取存储数据 + +CALL get_clients() + +简便创建存储方式:右键Stored Procedures→Create→Apply + +2.删除存储 +DROP PROCEDURE IF EXISTS get_clients (加上IF EXISTS更加安全不易出错) + +3.加参数 +DELIMITER $$ + +CREATE PROCEDURE get_clients_by_state + +( + + state CHAR(2) (多参数用,隔开) + +) + +BEGIN + + SELECT * FROM clients c + + WHERE c.state = state; + +END $$ + +DELIMITER ; + +获取存储数据 + +4.加默认值 +DELIMITER $$ + +CREATE PROCEDURE get_clients_by_state + +( + + state CHAR(2) + +) + +BEGIN + + IF state is NULL THEN + + SET state ='CA'; + + END IF; + + SELECT * FROM clients c + + WHERE c.state = state; + +END $$ + +DELIMITER ; + +BEGIN + + SELECT * FROM clients c + + WHERE c.state = IFNULL (state, c.state); (c.state = c.state返回所有值) + +END $$ -- Gitee