精华内容
下载资源
问答
  • 存储过程和触发器实验(至少包括完整的调试通过的8个存储过程和5个触发器)实验9:存储过程实验实验10:触发器实验 实验9:存储过程实验 自拟题目完成8个存储过程的编写及调试,熟练掌握存储过程的使用。也可采用下...

    存储过程和触发器实验(存储过程和触发器)

    本文最初由security9968发布于security9968的csdn博客,禁止任何形式的剽窃行为
    转载原创文章请注明,转载自:security的博客

    实验9:存储过程实验

    自拟题目完成8个存储过程的编写及调试,熟练掌握存储过程的使用。也可采用下图中作业上的题目。

    SQL语句代码

    --1.例1
    use 学生作业管理数据库;
    select * from 学生表;
    select * from 课程表;
    select * from 学生作业表;
    --先查看是否存在名字为student_course的存储过程,如果有,删除
    if exists (select name from  sysobjects where  name='student_course' and type='P')
    drop procedure stuent_course;
    --创建存储过程
    create procedure student_course
    as
    	select 学生表.学号,姓名,课程名,作业1成绩
    	from 学生表,课程表,学生作业表
    	where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 and 姓名='张艳'
    
    --执行存储过程
    execute student_course;
    
    --带输入参数的存储过程
    create procedure  student_course1
    @Studentname varchar(10)
    as
    	select 学生表.学号,姓名,课程名,作业1成绩
    	from 学生表,课程表,学生作业表
    	where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 and 姓名=@Studentname;
    
    --调用student_course1
    execute student_course1 '于兰兰';
    
    --创建一个存储过程用于向学生表中插入记录
    create procedure student_insert
    @学号 int,@姓名 nvarchar(10),@性别 nvarchar(2),@专业班级 nvarchar(10),@出生日期 nvarchar(20),@联系电话 nvarchar(20)
    as
    	INSERT into 学生表
    	values(@学号,@姓名,@性别,@专业班级,@出生日期,@联系电话);
    
    --执行student_insert
    execute student_insert '007','阿刚','男','电子06','2000-1-1','13333333333';
    
    
    --创建存储过程,若没有给出学生姓名,则返回所有学生情况
    create procedure student_course2
    @StudentName nvarchar(20)=null
    as
    	if @StudentName is null
    	begin 
    		select 学生表.学号,姓名,课程名,作业1成绩
    		from 学生表,课程表,学生作业表
    		where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号
    	end
    	else
    	begin
    		select 学生表.学号,姓名,课程名,作业1成绩
    		from 学生表,课程表,学生作业表
    		where 学生表.学号=学生作业表.学号 and 课程表.课程号=学生作业表.课程号 and 姓名=@Studentname;
    	end
    
    execute student_course2 '张志国';
    execute student_course2;			--使用默认参数值
    
    
    --使用输出参数
    CREATE procedure student_count
    @CourseName varchar(20),
    @StudentSum int output
    as
    	select @StudentSum=COUNT(*)
    	from 课程表,学生作业表
    	where 课程表.课程号=学生作业表.课程号 and 课程名=@CourseName;
    
    
    --对于带有输出参数的存储过程,调用时需要定义相应的变量用于接收从存储过程返回的参数值
    declare @StudentSum1 int;
    execute student_count '数据结构',@StudentSum1 OUTPUT;
    SELECT @StudentSum1 as 选数据结构的人数;
    
    --创建一个存储过程,输出学生的基本情况
    alter procedure student_query
    @学号 int,@姓名 nvarchar(8) output,@性别 char(2) output
    as
    	select @姓名=姓名,@性别=性别
    	from 学生表
    	where 学号=@学号;
    
    --调用存储过程,查看基本情况
    declare @姓名1 nvarchar(20);
    declare @性别1 char(2);
    execute student_query '7',@姓名1 output,@性别1 output;
    select @姓名1 as 学生姓名,@性别1 as 学生性别;
    select * from 学生表;
    
    --删除存储过程是
    --drop procedure 存储过程名;
    
    --market数据库中
    use market;
    --存储过程shanghai,查看上海客户信息
    select * from Customers;
    insert into Customers VALUES(3,'阿美','上海');
    create procedure shanghai 
    as
    	select * from Customers
    	where City='上海'
    
    execute shanghai;
    --存储过程Goods,查看指定商品信息,商品编号作为输入参数
    select * from Goods;
    insert into Goods values(1,'牙膏',2.5,'牙膏厂',400,'在售');
    insert into Goods values(2,'牙刷',5,'牙刷厂',1200,'热卖');
    create procedure cunchuGoods
    @商品编号 int
    as
    	select * from Goods
    	where GoodID=@商品编号;
    
    execute cunchuGoods @商品编号=2;
    --存储过程GoodsSum,查看指定客户的所有订单的订货总金额,客户编号作为输入参数,订货总金额作为输出参数
    select * from Orders;
    insert into Orders values(1,1,1,2,5,'2020-1-1');
    insert into Orders values(2,1,2,2,10,'2020-1-1');
    insert into Orders values(3,2,2,2,10,'2020-1-1');
    create procedure cunchuGoodsSum
    @客户编号 int,@订货总金额 float output
    as 
    	select @订货总金额=OrderSum from Orders
    	where Orders.CustomerID=@客户编号;
    
    declare @订货总金额 float;             --切记勿忘声明变量
    execute cunchuGoodsSum   2,@订货总金额 output;
    select @订货总金额 as '订货总金额';
    
    --存储过程insert_Goods,向Goods表中插入一条记录
    select * from Goods;
    alter procedure insert_Goods
    @商品编号 int,@商品名称 nvarchar(20),@价格 float,@供货商 nvarchar(20),@库存量 int,@商品状态 nvarchar(20)
    as 
    	insert into Goods(GoodID,Gname,Price,Provider,Stocks,Status) 
    	values(@商品编号,@商品名称,@价格,@供货商,@库存量,@商品状态);
    
    execute insert_Goods  3,'牙刷杯',10,'牙刷杯厂',5,'即将断货';
    --创建存储过程Goods_Orders1,查看任何指定货品的订单情况,包括订单号,订货客户姓名以及订货数量(使用输入参数)
    select * from Orders;
    select * from Goods;
    select * from Customers;
    CREATE procedure Goods_Orders1
    @指定货品 nvarchar(20)
    as
    	select OrderID,Cname,Quantity from Orders,Goods,Customers
    	where Orders.GoodID=Goods.GoodID and Orders.CustomerID=Customers.CustomerID AND  Goods.Gname=@指定货品;
    
    EXECUTE Goods_Orders1 @指定货品='牙膏';
    
    
    --执行存储过程,如果不给出参数则报错,如果希望不输入参数,即默认值,得到所有货品订单,则新建表Goods_Orders2
    execute Goods_Orders1 @指定货品;  --报错
    create procedure Goods_Orders2
    @指定货品 nvarchar(20)=null
    as
    	if @指定货品 is null
    	begin 
    		select OrderID,Cname,Quantity from Orders,Goods,Customers
    		where Orders.GoodID=Goods.GoodID and Orders.CustomerID=Customers.CustomerID
    	end
    	else
    	begin
    	select OrderID,Cname,Quantity from Orders,Goods,Customers
    	where Orders.GoodID=Goods.GoodID and Orders.CustomerID=Customers.CustomerID AND  Goods.Gname=@指定货品
    	end
    execute Goods_Orders2;
    execute Goods_Orders2 @指定货品='牙刷';
    
    --创建存储过程Goods_OrderSum,来获得某个货品的订单总额(使用输入输出参数)
    alter PROCEDURE Goods_OrderSum
    @货品名称 nvarchar(20),@订单总额1 float output
    as
    	select @订单总额1=sum(OrderSum) from Orders,Goods
    	where Goods.GoodID=Orders.GoodID and Gname=@货品名称;
    
    declare @订单总额1 float;
    execute Goods_OrderSum  '牙膏',@订单总额1 output;
    select @订单总额1 as '订单总额';
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    实验10:触发器实验

    自拟题目完成5个触发器的编写及调试,熟练掌握触发器的使用。也可采用下图中作业上的题目。

    SQL语句代码

    use 学生作业管理数据库;
    --例8 创建一个触发器,当  学生表  中的记录被更新时,显示表中的所有记录
    create trigger  student_change
    	on 学生表 after insert,update,delete
    	as
    		select * from 学生表;
    
    --查看下变化
    select * from 学生表;
    insert into 学生表 values(1,'阿美','女','计科06','2002-1-1','13312313213');
    
    --例9 在  学生表  中创建DELETE触发器,实现对  学生表  和 学生作业表 的级联删除
    create trigger studentdelete on 学生表
    	after delete
    as
    	delete from 学生作业表
    	where 学号 in
    		(select deleted.学号 from deleted);
    --查看下变化
    select * from 学生作业表;
    insert into  学生作业表 values('K001',1,99,99,99);
    select * from 学生作业表;
    delete  from 学生表 where 姓名='阿美';
    select * from 学生作业表;
    
    --例10 在学生作业表上创建insert 触发器,当向学生作业表 中添加学生的选课记录时,
    --检查该学生的学号是否存在,若不存在,则不能将记录插入
    create trigger sc_insert on 学生作业表
    	after insert
    as
    	if(select count(*) from 学生表,inserted where 学生表.学号=inserted.学号)=0
    	begin 
    		print '学号不存在,不能插入'
    		rollback transaction
    	end;
    
    --查看效果
    insert into 学生作业表 values('K001',1,99,99,99);
    
    --例11 创建update触发器,禁止对学生表 中学生的性别进行修改
    create trigger student_update on 学生表
    	after update
    as 
    	if update(性别)
    	begin
    		print '禁止对学生学号修改'
    		rollback transaction
    	end;
    --查看效果
    select * from 学生表;
    update 学生表 set 性别='男' where 性别='女' and 学号=7;
    select * from 学生表;
    
    --例12 在学生作业表上创建触发器,当一次向学生作业表中添加多个记录时,删除学号在学生表中不存在的记录,
    --从而保证数据的一致性,注意,不能在学生作业表中定义外键约束
    create trigger sc_insert1 on 学生作业表 
    	after insert
    as 
    	if(select count(*) from 学生表,inserted where inserted.学号=学生表.学号)<>@@ROWCOUNT
    	BEGIN
    		delete from 学生作业表
    		where 学号 not in (select 学号 from 学生表)
    	END;
    
    
    --例13 在视图上定义instead of 触发器
    select * from 学生表;
    create view birth_view(学号,姓名,性别,生日,专业班级)
    as 
    	select 学号,姓名,性别,出生日期,专业班级
    	from 学生表;
    
    create trigger birth_view_insert on birth_view
    instead of insert
    as
    	declare @学号 int
    	declare @姓名 varchar(20);
    	declare @性别 varchar(20);
    	declare @生日 varchar(20);
    	declare @专业班级 varchar(20);
    	select 	@学号=学号,@姓名=姓名,@性别=性别,@专业班级=专业班级
    	from inserted;
    	insert into 学生表(学号,姓名,性别,专业班级) values(@学号,@姓名,@性别,@专业班级);
    --查看效果
    insert into birth_view(学号,姓名,性别,专业班级) values(2,'阿红','女','软件04');
    
    
    
    use market;
    --第四章第五题(5)在Customers表上建立删除触发器,实现Customers表和Orders表的级联删除
    select * from Customers;
    select * from Orders;
    
    create trigger customers_delete on Customers
    	after delete
    as
    	delete from Orders
    	where CustomerID in (select deleted.CustomerID FROM DELETED);
    
    --第四章第五题(6)在Orders表上建立插入触发器,当向表中添加一条订货记录时,若订单中的商品状态为即将断货(Status='即将断货')
    --则不能插入该条记录
    select * from Customers;
    select * from Orders;
    select * from Goods;
    CREATE trigger orders_insert on Orders
    	AFTER INSERT
    AS 
    	if(select Status from Goods,inserted where Goods.GoodID=inserted.GoodID) in ('即将断货')
    	begin
    		print '即将断货,不能订购'
    		rollback transaction
    	end;
    	
    --试试效果
    insert into Orders values(4,3,3,2,20,'2020-2-2');
    --第四章第五题(7)在Orders表上建立插入触发器,当添加订单时,减少Goods表中相应商品的库存量
    select * from Customers;
    select * from Orders;
    select * from Goods;
    
    create trigger orders_insert1 on Orders
    after insert
    as 
    	UPDATE Goods SET Stocks=Stocks-inserted.Quantity
    	FROM Goods,inserted
    	WHERE Goods.GoodID=inserted.GoodID;
    	
    
    
    --第四章第五题(8)在Orders表上建立触发器,不允许对订单日期进行修改
    select * from Customers;
    select * from Orders;
    select * from Goods;
    CREATE TRIGGER orders_create ON Orders
    	AFTER UPDATE
    as
    	IF UPDATE(Date)
    	BEGIN
    	RAISERROR('不能手动修改',10,1)
    	ROLLBACK TRANSACTION
    	END;
    
    --第四章第五题(9)建立触发器,实现参照完整性约束,即若在Orders表中添加一条记录时,则该订单中的商品也必须在
    --Goods表中存在,否则不许添加该记录;
    select * from Customers;
    select * from Orders;
    select * from Goods;
    
    CREATE TRIGGER orders_create1 ON Orders
    	AFTER INSERT
    AS
    	IF (SELECT COUNT(*) from Goods,inserted
    		WHERE Goods.GoodId=inserted.GoodID)=0
    	BEGIN
    		print '这种货物不存在'
    		rollback transaction
    	END;
    

    在这里插入图片描述

    本文最初由security9968发布于security9968的csdn博客,禁止任何形式的剽窃行为
    转载原创文章请注明,转载自:security的博客

    展开全文
  • 面试篇——存储过程和触发器

    千次阅读 多人点赞 2019-01-01 21:39:38
    1.存储过程和函数 存储过程重在处理数据,函数可以返回值。 (1)存储过程是procedure用户定义的一系列sql语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。 (2)函数通常是数据库已定义的方法,它...

    1.存储过程和函数

    存储过程重在处理数据,函数可以返回值。
    (1)存储过程是procedure用户定义的一系列sql语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。
    (2)函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
    (3)可以理解函数是存储过程的一种,都是预编译的(块语句每次运行都会编译 存储过程块 一次编译多次运行 效率更高)
    plsql块语句:
    Begin
    End
    存储过程块
    Create procedure prg_add()
    As
    Begin
    End;
    (4)函数可以没有参数,但是一定要有一个返回值,存储过程可以没有参数,不需要返回值。
    (5)函数return返回值没有返回参数模式,存储过程通过out参数返回值,如果需要返回多个参数则建议使用存储过程(函数oracle 在函数可以使用in和out mysql不能使用out)
    (6)在sql数据操纵(DML)语句中只能调用函数而不能调用存储过程

    2.存储过程的概念,优点(或特点),写一个简单的存储过程

    存储过程:是一组为了完成特定功能的SQL语句集,利用SQL Server所提供的T-SQL语言所编写的程序,经编译后存储在数据库中。
    优点:
    (1)执行速度快,存储过程只在创建时进行编译,以后每次执行不需要再重新编译,一般sql语句每执行一次就编译一次
    (2)存储过程可重复使用
    (3)安全性高(可设定只有某些用户才具有对指定存储过程的使用权)
    (4)当对数据库进行复杂操作时,可完成复杂的判断和比较复杂的运算,可用存储过程封装起来
    (5)易于维护和集中控制,当企业规则变化时在服务器中改变存储过程即可。无需修改 应用程序。
    简单的存储过程:
    create proc select_query @year int
    as
    select * from tmp where year=@year

    3.触发器

    (1)触发器:触发器可以看成是一个特殊的存储过程,存储过程是要显示调用去完成,而触发器可以自动完成。比如:当数据库中的表发生增删改操作时,对应的触发器就可以执行对应的PL/SQL语句块
    (2)作用:维护表的完整性,记录表的修改来审计表的相关信息
    分为:
    DML触发器:当数据库服务器中发生数据操作语言事件时执行的存储过程,分为:After触发器和instead of触发器
    DDL触发器:特殊的触发器,在响应数据定义语言(DDL)语句时触发,一般用于数据库中执行管理任务。DDL触发器是响应create、after、或drop开头的语句而激活
    触发器用处还是很多的,比如校内网、开心网、Facebook,你发一个日志,自动通知好友,其实就是在增加日志时做一个后触发,再向通知表中写入条目。因为触发器效率高

    展开全文
  • 存储过程存储过程就是编译好了的一组sql语句。 存储过程因为SQL语句已经预编绎过,因此执行速度较快。 可保证数据的安全性完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据...

    存储过程:存储过程就是编译好了的一组sql语句。

    1. 存储过程因为SQL语句已经预编绎过,因此执行速度较快。
    2. 可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
    3. 可以降低网络的通信量。存储过程主要是在服务器上运行,减少对客户机的压力。
    4. 存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因
    5. 存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏本身的数据处理逻辑。

    这里再简单介绍下触发器,触发器是一种特殊的存储过程;

    触发器: 当满足触发器条件,则系统自动执行触发器的触发体。
    触发时间:有before,after.触发事件:有insert,update,delete三种。

    触发类型:有行触发、语句触发,语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义了触发条件的表中行数据发生改变时会被触发一次。

    举些栗子:
    1、 在一个表中定义的语句级触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个删除表操作就是触发器执行的前提条件。
    2、 在一个表中定义了行级的触发器,当表中一行数据发生变化时,如删除、新增了一行记录,触发器会被自动执行;
    触发器的语法:

    create [or replace] tigger 触发器名 触发时间 触发事件
    on 表名
    [for each row]
    begin
     pl/sql语句
    end
    
    

    参数解说:

    1. 触发器名:触发器对象的名称。触发器是数据库自动执行,故名称无实质用途,仅做个人标注。
    2. 触发时间:指明触发器何时执行,该值可取:
      before:表示在数据库动作之前触发器执行;
      after:表示在数据库动作之后触发器执行。
    3. 触发事件:哪些数据库动作会触发此触发器:
      insert:数据库插入会触发此触发器;
      update:数据库修改会触发此触发器;
      delete:数据库删除会触发此触发器。
    4. 表 名:数据库触发器所在的表。
    5. for each row:对表的每一行触发器执行一次。如没这一选,则对整个表执行一次。

    触发器能干些什么?
    1、 允许/限制对表的修改
    2、 自动生成派生列,比如自增字段
    3、 强制数据一致性
    4、 提供审计和日志记录
    5、 防止无效的事务处理
    6、 启用复杂的业务逻辑

    举例:
    1)、允许/限制对表的修改
    下面的触发器在更新表tb_emp之前触发,目的是不允许在周末修改表:

    create or replace trigger auth_secure before insert or update or DELETE
    on tb_emp
    begin
      IF(to_char(sysdate,'DY')='星期日') THEN
        RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表tb_emp');
      END IF;
    END;
    /
    
    

    2)、使用触发器实现序号自增

    创建一个测试表:

    create table tab_user(
      id number(11) primary key,
      username varchar(50),
      password varchar(50)
    );
    
    

    创建一个序列:
    复制代码 代码如下:
    create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;

    创建一个触发器:

    CREATE OR REPLACE TRIGGER MY_TGR
     BEFORE INSERT ON TAB_USER
     FOR EACH ROW--对表的每一行触发器执行一次
    DECLARE
     NEXT_ID NUMBER;
    BEGIN
     SELECT MY_SEQ.NEXTVAL INTO NEXT_ID FROM DUAL;
     :NEW.ID := NEXT_ID; --:NEW表示新插入的那条记录
    END;
    
    

    向表插入数据:
    **
    insert into tab_user(username,password) values(‘admin’,‘admin’);
    insert into tab_user(username,password) values(‘fgz’,‘fgz’);
    insert into tab_user(username,password) values(‘test’,‘test’);
    COMMIT;**

    3)、创建触发器,将操作CREATE、DROP存储在log_info表
    –创建表

    CREATE TABLE log_info(
    manager_user VARCHAR2(15),
    manager_date VARCHAR2(15),
    manager_type VARCHAR2(15),
    obj_name VARCHAR2(15),
    obj_type VARCHAR2(15)
    );

    –创建触发器
    set serveroutput on;
    CREATE OR REPLACE TRIGGER TRIG_LOG_INFO
    AFTER CREATE OR DROP ON SCHEMA
    BEGIN
    INSERT INTO LOG_INFO
    VALUES
    (USER,
    SYSDATE,
    SYS.DICTIONARY_OBJ_NAME,
    SYS.DICTIONARY_OBJ_OWNER,
    SYS.DICTIONARY_OBJ_TYPE);
    END;
    /

    –测试语句
    CREATE TABLE a(id NUMBER);
    CREATE TYPE aa AS OBJECT(id NUMBER);
    DROP TABLE a;
    DROP TYPE aa;

    –查看效果
    SELECT * FROM log_info;

    –相关数据字典-----------------------------------------------------
    SELECT * FROM USER_TRIGGERS;

    –必须以DBA身份登陆才能使用此数据字典
    SELECT * FROM ALL_TRIGGERS;SELECT * FROM DBA_TRIGGERS;

    –启用和禁用
    ALTER TRIGGER trigger_name DISABLE;
    ALTER TRIGGER trigger_name ENABLE;

    再来两个实际生产案例:
    题目:
    –触发器:
    –添加员工信息,流水号作为自动编号(通过序列生成),
    –并且判断如果工资小于0,则改为0;如果大于10000,则改为10000。

    CREATE TABLE emp2(
    e_id NUMBER,
    e_no NUMBER,
    e_name VARCHAR2(20),
    e_sal NUMBER
    )

    SELECT * FROM emp2;

    CREATE SEQUENCE seq_trg_id;

    INSERT INTO emp2(e_id,e_no,e_name,e_sal) VALUES(seq_trg_id.nextval,7788,'栩栩',
     1000000)
    INSERT INTO emp2(e_id,e_no,e_name,e_sal) VALUES(seq_trg_id.nextval,7788,'有名',-10)
    
    CREATE OR REPLACE TRIGGER trg_add_emp_info
      BEFORE INSERT
      ON emp2
      FOR EACH ROW
      DECLARE
        -- local variables here
      BEGIN
        SELECT seq_trg_id.NEXTVAL INTO :NEW.e_id FROM dual;
        IF  :NEW.e_sal < 0 THEN
           :NEW.e_sal := 0;
        ELSIF  :NEW.e_sal > 10000 THEN
           :NEW.e_sal := 10000;
        END IF;
      END;
    
    

    案例二:
    为emp建立触发器,将删除的记录放到emp3表中(autoid,deptno,empno,ename,del_rq-删除日期)

    CREATE OR REPLACE TRIGGER trg_del_emp_info
      BEFORE DELETE
      ON emp
      FOR EACH ROW
      DECLARE
        -- local variables here
      BEGIN
        INSERT INTO emp3(autoid,deptno,empno,ename,del_rq)
              VALUES(seq_trg_del_autoid.NEXTVAL,:OLD.deptno,:OLD.empno,:OLD.ename,sysdate);
      END;
    

    文章结束。**

    以下为个人公众号,欢迎扫码关注:
    在这里插入图片描述

    【参考】
    https://www.cnblogs.com/sharpest/p/7764662.html
    【参考】
    https://www.cnblogs.com/quyanhui/p/3386493.html
    【参考】
    https://blog.csdn.net/justdo2008/article/details/4137779

    展开全文
  • /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.20-log : Database - lianxi ********************************************************************* */ /*!40101 SET NAMES utf8 */;...40101 SE...
    /*
    SQLyog Ultimate v12.09 (64 bit)
    MySQL - 5.7.20-log : Database - lianxi
    *********************************************************************
    */
    
    
    /*!40101 SET NAMES utf8 */;
    
    /*!40101 SET SQL_MODE=''*/;
    
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    CREATE DATABASE /*!32312 IF NOT EXISTS*/`lianxi` /*!40100 DEFAULT CHARACTER SET utf8 */;
    
    USE `lianxi`;
    
    /*Table structure for table `rizhi` */
    
    DROP TABLE IF EXISTS `rizhi`;
    
    CREATE TABLE `rizhi` (
      `sid` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志编号',
      `biao` varchar(100) DEFAULT NULL COMMENT '修改了那个表',
      `stime` datetime DEFAULT NULL COMMENT '时间',
      `leixing` varchar(100) DEFAULT NULL COMMENT '执行了什么',
      `new` varchar(100) DEFAULT NULL COMMENT '修改之前的存款',
      `old` varchar(100) DEFAULT NULL COMMENT '修改之后的存款',
      `yinhangid` varchar(100) DEFAULT NULL COMMENT '银行ID',
      `username` varchar(100) DEFAULT NULL COMMENT '谁使用了',
      PRIMARY KEY (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    
    /*Data for the table `rizhi` */
    
    insert  into `rizhi`(`sid`,`biao`,`stime`,`leixing`,`new`,`old`,`yinhangid`,`username`) values (1,'zhanghu','2018-01-22 14:49:02','insert','1002',NULL,NULL,'root@'),(2,'zhanghu','2018-01-22 14:49:24','insert','1003',NULL,NULL,'root@'),(3,'zhanghu','2018-01-22 15:08:41','insert','1004',NULL,NULL,'root@'),(4,'zhanghu','2018-01-22 15:53:10','insert',NULL,NULL,'1005','root@'),(5,'zhanghu','2018-01-22 15:55:21','insert',NULL,NULL,'新增用户1006','root@'),(6,'zhanghu','2018-01-22 16:05:27','insert','1458','1335','1000','root@'),(7,'zhanghu','2018-01-22 16:05:28','insert','1581','1458','1000','root@'),(8,'zhanghu','2018-01-22 16:05:28','insert','1704','1581','1000','root@'),(9,'zhanghu','2018-01-22 16:05:28','insert','1827','1704','1000','root@');
    
    /*Table structure for table `zhanghu` */
    
    DROP TABLE IF EXISTS `zhanghu`;
    
    CREATE TABLE `zhanghu` (
      `sid` int(11) NOT NULL AUTO_INCREMENT COMMENT '账户编号',
      `sname` varchar(100) DEFAULT NULL COMMENT '用户名字',
      `yhid` int(11) DEFAULT NULL COMMENT '用户ID',
      `mima` int(11) DEFAULT NULL COMMENT '用户密码',
      `dianhua` int(11) DEFAULT NULL COMMENT '电话',
      `yue` int(11) DEFAULT NULL COMMENT '用户余额',
      PRIMARY KEY (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;
    
    /*Data for the table `zhanghu` */
    
    insert  into `zhanghu`(`sid`,`sname`,`yhid`,`mima`,`dianhua`,`yue`) values (13,'11111aa',1000,123,123,1827),(14,'111111aa',1001,123,123,13),(15,'1111111aa',1002,123,123,13),(16,'111111561aa',1003,123,123,13),(17,'1121',1004,123,123,13),(18,'111111561aa1',1005,123,123,13),(19,'1111115611aa1',1006,123,123,13);
    
    /* Trigger structure for table `zhanghu` */
    
    DELIMITER $$
    
    /*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `insert` */$$
    
    /*!50003 CREATE */ /*!50017 DEFINER = 'skip-grants user'@'skip-grants host' */ /*!50003 TRIGGER `insert` BEFORE INSERT ON `zhanghu` FOR EACH ROW 
        BEGIN
        insert into rizhi(`biao`,`stime`,`leixing`,`yinhangid`,`username`)
        values('zhanghu',sysdate(),'insert',concat('新增用户',new.`yhid`),user());
        END */$$
    
    
    DELIMITER ;
    
    /* Trigger structure for table `zhanghu` */
    
    DELIMITER $$
    
    /*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `cunqu` */$$
    
    /*!50003 CREATE */ /*!50017 DEFINER = 'skip-grants user'@'skip-grants host' */ /*!50003 TRIGGER `cunqu` AFTER UPDATE ON `zhanghu` FOR EACH ROW 
        BEGIN
        INSERT INTO rizhi(`biao`,`stime`,`leixing`,`new`,`old`,`yinhangid`,`username`)
        VALUES('zhanghu',SYSDATE(),'insert',new.`yue`,old.`yue`,CONCAT(new.`yhid`),USER());
        END */$$
    
    
    DELIMITER ;
    
    /* Procedure structure for procedure `chongzhi` */
    
    /*!50003 DROP PROCEDURE IF EXISTS  `chongzhi` */;
    
    DELIMITER $$
    
    /*!50003 CREATE DEFINER=`skip-grants user`@`skip-grants host` PROCEDURE `chongzhi`(in id int,in mima int ,in jine int)
    BEGIN
        DECLARE cs1 int;
        DECLARE cs2 INT;
        /*判断一下银行ID存在不*/
        if exists(select * from zhanghu where id=yhid)then
        select z.mima into cs1 from zhanghu z where id=z.yhid;
        /*判断密码正确不*/
        if cs1=mima then
          update zhanghu set yue=jine+yue where id=yhid;
          select yue into cs2 from zhanghu where  id=yhid;
          select concat('充值成功,余额为:',cs2);
        else
          select '密码错误';
        end if;
        else
        select '没有此用户,请先创建账户';
        end if;
        END */$$
    DELIMITER ;
    
    /* Procedure structure for procedure `chuangjian` */
    
    /*!50003 DROP PROCEDURE IF EXISTS  `chuangjian` */;
    
    DELIMITER $$
    
    /*!50003 CREATE DEFINER=`skip-grants user`@`skip-grants host` PROCEDURE `chuangjian`(in `kname` varchar(100),in `mima` int,in `dianhua` int,in `yue` int)
    BEGIN
            DECLARE sc int;
            /*先判断账户是否重复*/
            if EXISTS(select sname from zhanghu z where kname=z.sname) then
            select '此用户以存在';         
            else
            if exists(SELECT yhid FROM zhanghu z ORDER BY yhid DESC LIMIT 1 ) then
            select yhid into sc from zhanghu z order by yhid desc limit 1;
            set sc=sc+1;
            INSERT INTO `zhanghu`(`sname`,`yhid`,`mima`,`dianhua`,`yue`)VALUES(kname,sc,mima,dianhua,yue);
            select concat('银行ID为:',sc);
            else
            /*定制初始*/
            insert into `zhanghu`(`sname`,`yhid`,`mima`,`dianhua`,`yue`)values(kname,1000,mima,dianhua,yue);
            SELECT CONCAT('银行ID为:',1000);
            END IF;
            end if;
        END */$$
    DELIMITER ;
    
    /* Procedure structure for procedure `quqian` */
    
    /*!50003 DROP PROCEDURE IF EXISTS  `quqian` */;
    
    DELIMITER $$
    
    /*!50003 CREATE DEFINER=`skip-grants user`@`skip-grants host` PROCEDURE `quqian`(IN id INT,IN mima INT ,IN jine INT)
    BEGIN
        DECLARE cs1 INT;
        DECLARE cs2 INT;
        DECLARE cs3 INT;
        DECLARE cs4 INT;
        /*先判断银行ID存在不*/
        IF EXISTS(SELECT * FROM zhanghu WHERE id=yhid)THEN
        SELECT z.mima INTO cs1 FROM zhanghu z WHERE id=z.yhid;
        /*判断密码正确不*/
        IF cs1=mima THEN
          /*取钱金额大小*/
          if jine>1 then
          SELECT c.yue INTO cs3 FROM zhanghu c WHERE id=c.yhid;
          IF cs3>jine THEN
          UPDATE zhanghu SET yue=yue-jine WHERE id=yhid;
          SELECT yue INTO cs4 FROM zhanghu WHERE  id=yhid;
          SELECT CONCAT('充值成功,余额为:',cs4);
          ELSE
          SELECT '余额不足';
          END IF;
          else
          select '取钱金额过少,最低2块';
          end if;
        ELSE
          SELECT '密码错误';
        END IF;
        ELSE
        SELECT '没有此用户,请先创建账户';
        END IF;
        END */$$
    DELIMITER ;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

     

    转载于:https://www.cnblogs.com/wangdong123/p/8329758.html

    展开全文
  • --1. 定义过程,根据雇员编号找到雇员姓名及工资。create or replace procedure pro_select is empno1 emp.empno%type; ename1 emp.ename%type; sal1 emp.sal%type; begin select empno,ena...
  • 存储过程(stored procedure SP)是MySQL 5.0 版本中的最大创新。他们是一些由MySQL服务器直接存储和执行的定制过程 或 函数。SP的加入把SQL语言扩展成了一种程序设计语言,可以利用SP把一个客户--...
  • 数据库原理 实验四 存储过程触发器函数 2012级计算机专业 集美大学计算机工程学院 20132014年第一学期 数据库原理实验报告 题目实验四 存储过程触发器函数 班级 计算12 姓名 学号 日期2014.05 指导老师林颖贤 成...
  • 存储过程 VS 触发器

    热门讨论 2017-05-08 10:01:16
    一:存储过程 框架 1.查询 Select 查询新闻表News前5条记录,字段有ID,title,caid,且按创建时间降序排序 2.增 Insert 3.删 Delete 4.改Update 【在查询器中设计查询】 查询——在编辑器中设计查询——出现...
  • 员工表 Employees ID money, 根据需要自己在添加字段来完成 销售业绩表 Salys  SID money 根据需要自己在添加字段来完成 关系是一个员工对应多个销售业绩 ...(最好用触发器和存储过程) 网上看到这个题
  • 题目部分 存储过程触发器的区别? ♣答案部分存储过程:是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建...
  • 存储过程与函数 什么是存储过程?有哪些优缺点? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯...
  • 选择题目,AVG(得分) stumarks  组主题 计算AVG(AVG(得分)) 选择以上(按得分顺序排列)*,排名() 从stumarks 从stumarks  选择*,DENSE_RANK(),(按得分顺序排列) 从stumarks  选择*,ROW_...
  • 从mysql5.0开始,mysql支持存储过程/存储函数/触发器/事件 使用存储过程的优点 存储过程执行一次后,其执行的规划就驻留在高速缓冲存储器上,以后再次调用存储过程时,只需从高速缓冲存储器中调用以编译好的二进制...
  • 建表,添加约束,标量值函数,存储过程触发器。 代码建库: 为了复习在SQL中使用DOS命令,开头便启用了高级选项,详细请看代码. [sql] view plain copy  print? use master  go...
  • 建表,添加约束,标量值函数,存储过程触发器。 代码建库: 为了复习在SQL中使用DOS命令,开头便启用了高级选项,详细请看代码. use master go --启用高级选项 exec sp_configure 'show advanced options',1 go ...
  • SQL存储过程习题,SQL触发器习题,SQL习题,基础语法,与W3School类似,初学者学习使用。
  • sql中关于触发器的课件 ppt格式的 存储过程课件和题目
  • sql server 的Transcat-SQL程序设计,触发器和存储过程 这篇博客主要简单讲一下sql server数据库的一些高级操作,那就是:Transcat-SQL语句,触发器和存储过程,由于边幅问题,这里这是简单地说一下概念,注意事项...
  • 触发器或者存储过程

    2017-11-21 08:47:31
    [size=13px]我有一个如下的题目,需要实现的是,前端导入记录到TCT表的时候,自动把记录插入 teacher,course,TC这三张表。[/size] --导入表如下结构 DROP TABLE IF EXISTS dbo.TCT CREATE TABLE TCT ( ...
  • 3、存储过程和函数 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库应用服务器之间的传输,对于提高数据处理的效率...
  • 1、事务  (transaction)事务就是将一系列操作作为一个不可分割的整体,要么一起执行失败,要么一起执行成功 。... 存储过程类似Java中的方法,可以反复使用,用来执行一些列应用复杂的应用规则。    ...
  • 数据库中的触发器(加题目)

    千次阅读 2021-03-13 22:31:59
    触发器(trigger)是SQL server 提供给程序员数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( ...
  • 数据库视图 什么是视图? 视图是虚拟表,是对实表的一种映射。 视图还可以从已经存在的视图的基础上定义。 ...简单性、安全性、逻辑数据独立性 ...题目:制作一个视图提供给销售人员,他们只需要知道商品名称、出售...
  • 存储过程Procedure:相当于数据库中的自定义函数 作用:解决了代码重用(省代码) 创建存储过程 delimiter // drop procedure if exists 存储过程名// create procedure 存储过程名(参数....
  • 答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性一致性,可以跟踪数据库内的操作从而不允许未经 许可的更新变化。可以联级运算。如,某表上的触发器上...
  • 1.存储过程 1.1创建存储过程 1.2存储过程的参数 1.in模式参数 2.out模式参数 1.3 IN参数的默认值 2 函数 2.1创建函数调用 2.2删除函数 3.触发器 3.1触发器简介 3.2语句级触发器 3.3行级别触发器 3.4...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,823
精华内容 2,329
关键字:

存储过程和触发器题目