精华内容
下载资源
问答
  • oracle job 存储过程 视图 游标 实例
  • 一、存储过程 1、概述 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1、允许模块化程序设计 2、允许更快执行如果某操作需要大量T-...

    一、存储过程

    1、概述

    存储过程是一组编译在单个执行计划中的T-SQL语句

    存储过程:就像函数一样的会保存在数据库中(可编程性)

    存储过程的优点:

    1、允许模块化程序设计

    2、允许更快执行如果某操作需要大量T-SQL代码或需要重复执行,存储过程将比T-SQL批代码的执行要快。将在创建存储过程时对其进行分析和优化,并可以在首次执行该过程后使用该过程的内存中版本。

    3、减少网络流量

    4、一个需要数百行T-SQL代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。

    5、作为安全机制使用

    2、编写

    创建存储过程:

    create proc JiaFa
    --需要的参数
    @a int,
    @b int
    as
        --存储过程的内容
        declare @c int;
        set @c = @a + @b;
        return @c;
    go
    
    public int JiaFa(int a, int b)
    {
        int c = a+b;
        return c;
    }
    --执行完毕后全部选中,执行创建
    View Code

    执行存储过程:

    declare @f int;
    exec @f = JiaFa 3,5;
    print @f;
    View Code

    二、视图

    1.视图的概述   

       视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表。视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)

    2.视图的存储   

       与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间。

    3.视图的作用

          用户可以通过视图以不同形式来显示基表中的数据,视图的强大之处在于它能够根据不同用户的需要来对基表中的数据进行整理。视图常见的用途如下:

    1)通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制

    2)隐藏数据复杂性:视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。 

    3)简化用户的SQL 语句:用户使用视图就可从多个表中查询信息,而无需了解这些表是如何连接的。 

    4)以不同的角度来显示基表中的数据::视图的列名可以被任意改变,而不会影响此视图的基表 

    5)使应用程序不会受基表定义改变的影响::在一个视图的定义中查询了一个包含4 个数据列的基表中的3 列。当基表中添加了新的列后,由于视图的定义并没有被影响,因此使用此视图的应用程序也不会被影响。 

    6)保存复杂查询::一个查询可能会对表数据进行复杂的计算。用户将这个查询保存为视图之后,每次进行类似计算只需查询此视图即可。

    7)逻辑数据独立性::视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

    用代码创建视图

     

    用鼠标建立视图

    在弹出的页面选择要建立关系的表的名称,

    选择需要的列的名称,并保存取名。

    练习:

    超市购物小票打印

    create proc jinchuhuo
    @code int,
    @shu int
    as
    declare @name varchar(10)
    declare @price decimal(18,2)
    declare @time datetime
    declare @count int
        select @count=COUNT(*) from mendian where scode = @code
        if @count =1
        BEGIN
            if @shu<=(SELECT sshu from mendian where scode=@code)
            BEGIN
            SELECT @name=sname,@price=sprice from mendian where scode=@code        
            insert into xiaopiao VALUES(@name,@price,@shu,@shu*@price,GETDATE())
            UPDATE mendian set sshu=sshu-@shu where scode=@code
            select top 1 * from xiaopiao order by pcode DESC
            END
        
            ELSE
            BEGIN
                print '货物量不够,请及时补充'
                select *from gongying where gcode=(select sgong from mendian where scode=@code) 
            end
        END
        ELSE
            BEGIN
                print '没有此物品'
                
            end
    EXEC jinchuhuo 2,25
    View Code

     

    转载于:https://www.cnblogs.com/shadow-wolf/p/6082644.html

    展开全文
  • 存储过程4.1存储过程介绍4.2简单的存储过程入门4.3:=与=的区别4.4存储过程if用法4.5存储过程循环while….do用法4.6存储过程循环repeat用法4.7存储过程循环loop用法4.8存储过程参数in out4.9存储过程参数inout4.10...

    已经过时了,写在这里给需要的朋友,入门使用

    1.创建数据库、创建表、测试数据

    创建数据库

    在这里插入图片描述

    创建表:

    在这里插入图片描述

    这儿没有使用外键

    #班级表
    CREATE TABLE xmcc_class(
    c_id INT PRIMARY KEY  AUTO_INCREMENT COMMENT '班级编号',
    c_name VARCHAR(10) NOT NULL COMMENT '班级名称'
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    #学生表
    CREATE TABLE xmcc_student(
    s_id INT PRIMARY KEY  AUTO_INCREMENT COMMENT '学生学号',
    s_name VARCHAR(10) NOT NULL COMMENT '学生姓名',
    s_phone VARCHAR(11) NOT NULL UNIQUE COMMENT '学生电话',
    s_cid INT COMMENT '班级id'
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    

    测试数据

    在这里插入图片描述

    #测试数据
    INSERT INTO xmcc_class(c_name) VALUES('java'),('.net'),('php'),('python')
    #三个java班 一个.net 班 2个php 没有python
    INSERT INTO xmcc_student(s_name,s_phone,s_cid) VALUES
    ('小a','11111111111',1),
    ('小b','22222222222',1),
    ('小c','33333333333',1),
    ('小d','44444444444',2),
    ('小e','55555555555',3),
    ('小f','66666666666',3)
    

    2.视图

    1.什么是视图

    通俗的讲,视图就是一条SELECT语句执行后返回的结果集。就是为了隐藏一部分数据或者减少联表查询而创建的一张虚拟表

    2.视图的特性

    视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

    可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);

    3.视图的作用

    方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

    更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;

    4.使用场合

    权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary…

    关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;

    以例子来学习,首先看看语句:

    创建视图:

    CREATE VIEW 视图名(列1,列2…)

    AS SELECT (列1,列2…)

    FROM 表名;

    删除视图:

    Drop view if exists 视图名

    一般不太会去修改视图

    2.1隐藏字段

    场景:现在项目中有一个学生推荐系统,需要避免企业得知学生的联系方式,不然学生直接就跟企业联系了

    分析:这样就不能把学生表直接给学生推荐系统,可以创建视图隐藏学生的电话字段

    在这里插入图片描述

    2.2将表的关联数据,存储于视图中简化查询

    场景:实际中有很多查询,需要对多张表联合操作,有一定的复杂度,完成需要一定的sql能力,可以通过视图简化查询的难度

    这儿的查询比较简单,但是也能说明问题,比如查询学生的信息及所在班级名字,需要联表查询,就可以创建视图来简化以后的查询

    在这里插入图片描述

    大家只需要理解、记住这两个优点就可以了

    2.3缺点

    性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。

    表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。(视图是虚拟的 跟随基本表变化)

    3.触发器

    触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

    3.1触发器语句

    CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt

    trigger_name:触发器的名称

    tirgger_time:触发时机,为BEFORE或者AFTER

    trigger_event:触发事件,为INSERT、DELETE或者UPDATE

    tb_name:表示建立触发器的表名,就是在哪张表上建立触发器

    trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句

    删除触发器:

    Drop trigger 触发器名称

    3.2案例

    为student的班级id列增加外键约束

    在这里插入图片描述

    ALTER TABLE xmcc_student ADD CONSTRAINT cid_key FOREIGN KEY(s_cid)
    REFERENCES xmcc_class(c_id);
    

    现在有了外键约束,如果我们删除其中.net班级

    在这里插入图片描述

    这个时候就可以使用触发器,当删除某个班级的时候触发修改当前班级学生的班级id为null,当然这儿不需要去深究逻辑

    创建触发器

    在这里插入图片描述

    #创建触发器来保证数据的完整性
    CREATE TRIGGER trigger_test  #触发器名称为trigger_test
    BEFORE DELETE  #在删除前
    ON xmcc_class FOR EACH ROW  #对xmcc_class每一行
    UPDATE xmcc_student SET  #修改xmcc_student
    #old表示删除前的行数据 如果是修改的old表示修改前 new表示修改后
    s_cid=NULL WHERE s_cid=old.c_id
    

    测试:

    在这里插入图片描述

    查看xmcc_student表

    在这里插入图片描述

    3.3说明及缺点

    这儿只是以一个简单的例子来理解触发器,大家需要记住语句的使用,需要看得懂触发器,也需要能写触发器,实际的中的触发器可能逻辑会难一点,但是语法基本都是这样了,会加一定plsql我们在存储过程中再去学习.

    另外:MySQL可以创建以下六种触发器:

    BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE

    AFTER INSERT,AFTER DELETE,AFTER UPDATE

    虽然触发器能完成一定的自动操作来保证一定的安全性,但是:

    1、 如果需要变动整个数据集而数据集数据量又较大时,触发器效果会非常

    2、 对于批量操作并不适合使用触发器 使用触发器实现的业务逻辑在出现问题时很难进行定位,特别是设计到多个触发器的情况 协同开发时,写业务层代码如果不清楚数据库 触发器的细节,容易搞不清到底触发了那些触发器 大量使用触发器会导致代码结构容易被打乱,阅读源码困难

    3、 会占用物理内存

    4.存储过程

    为了方便存储过程的学习,新建简化的商品表

    在这里插入图片描述

    #为了方便测试,我们新建简化的商品表
    #简化商品表
    CREATE TABLE xmcc_product(
    p_id VARCHAR(30) PRIMARY KEY COMMENT '商品id',
    p_name VARCHAR(11) NOT NULL COMMENT '商品名称',
    p_stock INT COMMENT '商品库存',
    p_price DOUBLE COMMENT '商品价格'
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    

    4.1存储过程介绍

    百度百科:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象.

    可能概念不太好理解,以场景来介绍

    场景:之前我们做过取消订单的功能,取消订单(这里稍微修改下业务):

    1.需要修改订单状态

    ​ 2.增加商品库存

    ​ 3.去掉购买记录

    在这里插入图片描述

    IO非常耗费资源,使用存储过程可以减少java程序与数据库的交互次数

    为了完成这个功能业务,需要先学习存储过程的相关知识

    4.2简单的存储过程入门

    简单存储过程入门:

    在这里插入图片描述

    #存储过程创建
    #DELIMITER修改语句结束符为$$ 因为mysql是;结尾 
    #但是存储过程是多个语句集 在其中每一个sql都需要;结尾 
    #如果我们不修改遇到分号就结束了就不是完整的存储过程了
    DELIMITER $$
    #如果存在这个存储过程就删除
    DROP PROCEDURE IF EXISTS `MyProcedure01`$$
    #创建存储过程
    # DEFINER=`root`@`localhost`: 指定IP与用户
    #PROCEDURE:存储过程关键字 
    #MyProcedure01:存储过程名称      ()说明没有参数,跟java方法类似
    CREATE DEFINER=`root`@`localhost` PROCEDURE `MyProcedure01`()
    #开始 可以看成java方法的{
    BEGIN
    #DECLARE:定义变量关键字  定义一个int类型的变量test 相当于int test
    	DECLARE test INT;
    #设置test的值为1  相当于test=1
    	SET test:=1;
    #查询test的值  相当于System.out.println(test);
    	SELECT test;
    #结束 可以看成java方法的 }
        END$$
    #存储过程写完了 需要把结束符号换回来
    DELIMITER ;
    

    这个错误是由于mysql库缺失引起的

    恢复步骤:打开cmd

    \1. 执行net stop mysql,停止mysql服务

    \2. 执行mysqld -remove,移除服务

    \3. 执行mysqld -install,安装服务

    \4. 执行mysqld --initialize-insecure,初始化

    \5. 执行net start mysql,开启mysql服务

    如果又出现1067

    修改my.ini(一般在C:\Program Files\MySQL\MySQL Server 5.5下)

    在这里插入图片描述

    1、打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件。

    2、重启MySQL服务。

    3、在命令行中输入“mysql -uroot -p”(不输入密码),回车即可进入数据库。

    4、执行,“use mysql;” 使用mysql数据库。

    5、执行,“update user set password=PASSWORD(“123456”) where user=‘root’;”(修改root的密码)

    6、打开MySQL目录下的my.ini文件,删除最后一行的“skip-grant-tables”,保存并关闭文件。

    7、重启MySQL服务。

    因为修改了数据库的数据地址,需要从新建,mysql02数据库,与商品表

    在这里插入图片描述

    调用存储过程:

    在这里插入图片描述

    4.3:=与=的区别

    在上面的例子中用到了:=

    1.=

    只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用。鉴于此,用变量实现行号时,必须用:=

    2.:=

    不只在set和update时时赋值的作用,在select也是赋值的作用。

    如果明白了=和:=的区别,那么也就理解了下边的现象。

    @num:=@num+1,:=是赋值的作用,所以,先执行@num+1,然后再赋值给@num,所以能正确实现行号的作用。

    @num=@num+1,此时=是等于的作用,@num不等于@num+1,所以始终返回0,如果改为@num=@num,始终返回1了。mysql数据库中,用1表示真,0表示假。

    4.4存储过程if用法

    在刚才的简单存储过程中,其实可以把存储过程类比为java的方法,sql语句就是方法中的java代码,那么这儿的if也是跟java差不多

    在这里插入图片描述

    DELIMITER$$
    CREATE PROCEDURE my_test1()
    BEGIN
    DECLARE i INT; -- 定义变量i
    SET i:=1; -- 设置值为1
    IF i>1 THEN -- 当i>1时
    SELECT 'i大于1'; -- 打印 i 大于 1
    ELSEIF i<1 THEN  
    SELECT 'i小于1';
    ELSE 
    SELECT 'i等于1';
    END IF; -- 只是结束if 在存储过程中的if、循环语句等基本都需要结束
    END$$
    DELIMITER ;
    #调用
    CALL my_test1();
    

    4.5存储过程循环while….do用法

    在这里插入图片描述

    #while...do 循环用法
    DELIMITER //
    CREATE PROCEDURE my_test2()
        BEGIN
       DECLARE i INT; #定义变量i
       SET i=0;  #设置值为0
       WHILE i<5 DO  #当i小于5就执行 相当于while(i<5)
        INSERT INTO xmcc_product(p_id,p_name,p_stock,p_price) 
        VALUES(CONCAT('1000',i),CONCAT('手机',i),i*10,i*100);#我们商品表插入数据
            SET i:=i+1; #设置 i+1 相当于i++
        END WHILE; #结束循环 注意
     END;// #简写 delimiter
    #调用存储过程
    CALL my_test2();
    #查看数据
    SELECT * FROM xmcc_product
    

    4.6存储过程循环repeat用法

    在这里插入图片描述

    #repeat 用法
    DELIMITER //
    CREATE PROCEDURE my_test3()
        BEGIN
     DECLARE i INT DEFAULT 10; #定义变量 i 赋予默认值
        REPEAT #开始循环
           INSERT INTO xmcc_product VALUES(CONCAT('1000',i),CONCAT('手机',i),i*10,i*100);
            SET i=i+1;
         UNTIL i>=15  #当i大于等于15就执行下面的 结束循环
       END REPEAT;
     END;// #简写 delimiter
     #调用 
     CALL my_test3();
    #查看数据
    SELECT * FROM xmcc_product
    

    4.7存储过程循环loop用法

    在这里插入图片描述

    #loop 用法  
    DELIMITER //
    CREATE PROCEDURE my_test4()
    BEGIN
         DECLARE i INT DEFAULT 100;
         loop_label: LOOP  #相当于java的标记 用于多重循环,loop表示开始循环 也可以不用标记 这儿一起举例了
            INSERT INTO xmcc_product VALUES(CONCAT('1000',i),CONCAT('手机',i),i*10,i*100);
           SET i=i+1;
            IF i>=105 THEN  #当i大于105的时候 执行下面的
                LEAVE loop_label; #离开标记处的循环
            END IF; #结束if 再次提示 注意
        END LOOP; #离开循环 语法
        END ;// #简写 delimiter
    
     #调用 
     CALL my_test4();
    #查看数据
    SELECT * FROM xmcc_product
    

    4.8存储过程参数in out

    在这里插入图片描述

    DELIMITER$$
    #in 代表输入参数 外面传递进来的 out 代表输出参数 可以传出去的 
    #需要注意类型是写在后面的
    CREATE PROCEDURE my_test5(IN i INT,OUT message VARCHAR(20))
    BEGIN
    IF i>1 THEN
    SET message:='传入的参数大于1';
    ELSE 
    SET message:='传入的参数不大于1';
    END IF;
    END$$
    DELIMITER ;
    #调用存储参数 并将输出参数message 赋值给@message 变量
    CALL my_test5(2,@message);
    SELECT @message;
    

    4.9存储过程参数inout

    在这里插入图片描述

    #存储过程参数inout 使用
    DELIMITER$$
    CREATE PROCEDURE my_test6(INOUT i INT)
    BEGIN
    IF i>1 THEN
    SET i:=10;
    ELSE 
    SET i:=-10;
    END IF;
    END$$
    DELIMITER ;
    
    SET @i:=1; -- 设置变量@i并赋值
    CALL my_test6(@i); -- 先将@i变量传入 然后获得里面的赋值在传出
    SELECT @i;
    

    4.10存储过程异常处理

    当sql出现异常的时候跳出存储过程并设置值为xxx

    Declare exit handler for sqlException set ……

    在这里插入图片描述

    #存储过程异常处理
    DELIMITER//
    CREATE PROCEDURE my_test7()
    BEGIN
    DECLARE i INT DEFAULT 0;
    -- continue继续  exit 退出  HANDLER执行处理器  SQLEXCEPTION;sql异常
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION  SET i:=-1;
    START TRANSACTION;#开启事务
    UPDATE xmcc_product SET p_name='苹果' WHERE p_id=10000;
    INSERT INTO xmcc_product VALUES(10000,'主键冲突',10,100); 
    IF i=-1 THEN
    SELECT '出现异常,事务回滚';
    ROLLBACK; #回滚
    ELSE
    COMMIT; #提交
    END IF;
    END//
    DELIMITER ;
    #调用 
    CALL my_test7();
    #查看结果
    SELECT * FROM xmcc_product
    

    查询xmcc_product查看是否回滚

    在这里插入图片描述

    4.11游标介绍

    游标:

    有数据缓冲的思想:游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果先有数据基础:游标是在先从数据表中检索出数据之后才能继续灵活操作的技术。 类似于指针:游标类似于指向数据结构堆栈中的指针,用来pop出所指向的数据,并且只能每次取一个

    不太好理解,但是使用非常简单,简单来说相当于在java中的ResultSet

    因为明天就有实际的应用,今天以一个小例子简单来说明一下。

    商品表的记录:

    在这里插入图片描述

    通过一个存储过程来完成商品名称的拼接

    在这里插入图片描述

    DELIMITER //
    CREATE PROCEDURE my_test8()
    BEGIN
    DECLARE result VARCHAR(100) DEFAULT '';-- 定义一个result 来存储商品名称的拼接
    DECLARE product_name VARCHAR(10);-- 定义一个变量来接收每次游标的商品名称
    DECLARE done INT DEFAULT FALSE; -- 定义done变量 默认值为false
    -- 查询所有的商品名称放入游标中 CURSOR 表示该变量为游标类型
    DECLARE curl CURSOR FOR SELECT p_name FROM xmcc_product;
    -- 游标遍历结束 会出现not found 设置done的值为true
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;  
    OPEN curl;-- 打开游标
    WHILE(NOT done) DO
    FETCH curl INTO product_name; -- 弹出游标的一条数据赋值给product_name
    SET result:=CONCAT(result,',',product_name);-- 拼接字符串
    END WHILE;
    CLOSE curl;-- 关闭游标 就像java中需要关闭resultset一样
    SELECT result;-- 打印出结果
    END;//
    #调用
    CALL my_test8();
    

    4.12存储过程优缺点(面试常问,标红的需要记住)

    1.优点:

    \1. 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而 一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速 度。

    \2. 存储过程可以重复使用,可减少数据库开发人员的工作量(可以忽略)

    \3. 安全性高,可设定只有某此用户才具有对指定存储过程的使用权

    \4. 减少网络通信量。 Java与mysql的IO交互
    调用一个行数不多的存储过程与直接调用SQL 语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL 语句,那么其性能绝对比一条一条的调用SQL 语句要高得多。

    2.缺点:

    a、不可移植性,每种数据库的内部编程语法都不太相同,当你的系统需要兼容多种数据库时最好不要用存储过程。

    b、学习成本高,没有java代码debug方便

    c、业务逻辑多处存在,采用存储过程后也就意味着你的系统有一些业务逻辑不是在应用程序里处理,这种架构会增加一些系统维护和调试成本。
    业务逻辑集中管理会更易于维护与调试,你很难做到业务逻辑都放在存储过程里,比如关于一些客户输入数当据的简单校验,会话数据的校验,应用服务器缓存数据的校验。

    d、 运行速度:大多数高级的数据库系统都有statement cache的,所以编译sql的花费没什么影响。但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。

    e、存储占物理内存

    5.springboot+mybatis 完成存储过程的调用

    案例:当取消订单的时候

    1.修改订单状态为取消(1)

    2.对订单项里面的商品增加库存

    如果我们按照以前的操作需要与mysql有多次的IO交互,当然这儿逻辑比较简单,如果复杂的IO交互更多,我们使用昨天的存储过程的调用,来通过一次IO交互完成上述需求

    2.1存储过程编写

    #编写取消订单的存储过程
    DELIMITER //
    #输入参数为订单order_id 输出参数为result 1 代表存储过程成功 -1代表存储过程出现异常
    CREATE PROCEDURE cancel_order(IN order_id VARCHAR(30),OUT result INT)
    BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result:=-1;#如果出现异常设置返回值为-1
    START TRANSACTION;#开启事务
    SET result:=1;#避免传入参数错误 这里设置为1
    UPDATE xmcc_order SET o_statu=1 WHERE o_id=order_id; #修改订单状态
         BEGIN 
    	  DECLARE done INT DEFAULT TRUE;
     #定义变量done用来判断
    	  DECLARE product_id VARCHAR(30); #定义变量 来接收游标的商品id
    	  DECLARE quantity_1 INT; #定义变量来接收游标的商品数量
    	  #定义游标 存储根据订单id查询到订单项中的商品id与数量
    	  DECLARE cur CURSOR FOR SELECT p_id,quantity FROM xmcc_orderdetail WHERE o_id=order_id;
    	  #当游标循环结束 设置done的值为false
    	  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done:=FALSE;
    	  OPEN cur;#打开游标
    	  WHILE done DO #循环
    	  FETCH cur INTO product_id,quantity_1;#将游标的值设置到变量中
    	  IF done THEN #判断 不然会多修改一次
    	  UPDATE xmcc_product SET p_stock=p_stock+quantity_1 WHERE p_id=product_id;
    	  END IF;
    	  END WHILE;
    	  CLOSE cur;
         END ;
     IF result=1 THEN #没有出现异常就提交
     COMMIT;
     ELSE 
     ROLLBACK;
     END IF;
     END ; //
     #测试
    CALL cancel_order('20001',@result);
    #查看结果
    SELECT @result
    

    2.2mybatis调用存储过程

    Xml编写:

    在这里插入图片描述

    <!--第一种写法 通过parameterMap来传递参数
    <parameterMap id="cancelMap" type="map">
        property 参数对应存储过程的参数名字以及传入来map的key名字 其他应该很好理解
        <parameter property="order_id" javaType="string" jdbcType="VARCHAR" mode="IN"></parameter>
        <parameter property="result" javaType="INTEGER" jdbcType="INTEGER" mode="OUT"></parameter>
    </parameterMap>
    <update id="cancelOrder" parameterMap="cancelMap"  statementType="CALLABLE">
        {call cancel_order(?,?)}
    </update>-->
    
    <!--第二种写法-->
    <update id="cancelOrder" parameterType="map"  statementType="CALLABLE">
        {call cancel_order(
          <!--只需要对应传递过来的map key的名字就可以了 一般都是用map来处理 当然其他也是可以的-->
          #{order_id,mode=IN,jdbcType=VARCHAR},
          #{result,mode=OUT,jdbcType=INTEGER}
          )}
    </update>
    
    

    Mapper接口:

    在这里插入图片描述

    测试之前数据库数据:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    测试方法:

    @Test
    public void cancelOrder(){
        HashMap<Object, Object> map = Maps.newHashMap();
        map.put("order_id","20001");
        map.put("result",3);//使用3来查看是否更改了值
        orderMapper.cancelOrder(map);
       log.info("存储过程调用成功,结果为:{}",map.get("result"));
    }
    

    调用之后结果:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    当然可以根据返回值在业务层做对应的事务处理。

    完成了存储过程的简单调用,以后大家遇到复杂的都可以以这个为基础去学习,压力不大

    至于视图、触发器等比较简单,大家自己调用练习就可以了。

    展开全文
  • select name from sysobjects where xtype='TR' --所有触发器 select name from sysobjects where xtype='P' --所有存储过程 select name from sysobjects wher
    select name from sysobjects where xtype='TR' --所有触发器
    select name from sysobjects where xtype='P' --所有存储过程
    select name from sysobjects where xtype='V' --所有视图
    select name from sysobjects where xtype='U' --所有表

    以上为SqlServer用法

    Select object_name From user_objects Where object_type='TRIGGER'; --所有触发器
    Select object_name From user_objects Where object_type='PROCEDURE'; --所有存储过程
    Select object_name From user_objects Where object_type='VIEW'; --所有视图
    Select object_name From user_objects Where object_type='TABLE'; --所有表

    以上为Oracle用法
    展开全文
  • 存储过程创建视图

    2017-11-06 16:16:45
    存储过程创建视图存储过程创建视图存储过程创建视图存储过程创建视图存储过程创建视图
  • --------------------------------------------SQl Server 判断表 存储过程 视图等是否存在--------------------------------------select * from dbo.sysobjects where id = object_id(NViewName) and ...

    --------------------------------------------SQl Server 判断表 存储过程  视图等是否存在--------------------------------------
    select * from dbo.sysobjects
    where id = object_id(N'ViewName')
    and OBJECTPROPERTY(id, N'IsView') = 1

    select * from dbo.sysobjects
    where id = object_id(N'TableName')
    and OBJECTPROPERTY(id, N'IsUserTable') = 1

    select * from dbo.sysobjects
    where id = object_id(N'ProcecureName')
    and OBJECTPROPERTY(id, N'IsProcedure') = 1

     

    --------------------------------------------SQl Server  OBJECTPROPERTY函数使用--------------------------------------------
    参数博客:http://www.cnblogs.com/greateast/archive/2007/07/31/837312.html

     

    --注:函数当中不能用动态SQL
        DECLARE @Sql NVARCHAR(200);
        DECLARE @TableName NVARCHAR(100);
        DECLARE @TOTAL_COUNT INT;--要返回的值
        SET @TableName='YourTableName';
        SET @Sql=N'SELECT @COUNT =ISNULL(MAX(IDENTITYCOL),0) FROM '+@TableName;

        EXECUTE SP_EXECUTESQL @Sql,N'@COUNT INT OUTPUT', @TOTAL_COUNT OUTPUT;
        SELECT @TOTAL_COUNT AS CurMaxID;

     

     

    展开全文
  • 视图 触发器 存储过程 标签(空格分隔): MySQLday04 视图 触发器 存储过程 视图 试图是一个虚拟表,是从数据库中一个或者多个表中导出来的表。视图还可以从已经存在的视图的基础上定义 视图的作用 简单性 安全...
  • MySQL 视图 存储过程

    2013-11-10 19:05:06
    MySQL 视图 存储过程 博文目录 视图的创建及使用 存储过程的创建及使用 Java调用存储过程 视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询,而自身不包含任何数据。 使用视图...
  • 存储过程-04.存储过程视图结合操作 资源多多只取三分
  • MySQL视图、函数、存储过程视图视图的概念视图的操作视图的使用场景存储过程和函数存储过程 视图 视图的概念 1、什么是视图? 视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select...
  • 存储过程视图

    千次阅读 热门讨论 2015-12-27 20:28:38
    还记得自考时数据库系统原理中的存储过程视图吗?那时候我们已经掌握了创建存储过程视图的基本语句,这在机房重构的过程中扮演了不可缺少的角色。 存储过程 一.存储过程的好处  存储过程是在大型数据库系统...
  • 数据库索引,存储过程视图,事务 数据库索引,存储过程视图,事务数据库索引,存储过程视图,事务
  • 存储过程视图

    2021-05-17 14:16:55
    存储过程 定义 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的...
  • sqlserver存储过程视图解密工具
  • 该工具软件可以搜索SQL Server 2012数据库中存储过程以及视图的名称和定义内容中的关键字,并可以复制及保存找到的存储过程视图的定义内容。有助于新接手系统的软件工程师研究已有系统。
  • MySQL视图 MySQL存储过程

    千次阅读 2018-10-05 21:09:37
    MySQL视图 MySQL存储过程
  • 视图存储过程

    2020-05-13 09:24:23
    存储在服务器端的一个查询块,是一张虚拟表 表示一张表的部分数据或多张表的综合数据 其结构和数据是建立在对表的查询基础上 视图的使用,跟普通数据表的查询使用完全一样 视图中不存放数据 ...
  • 视图视图只是一种逻辑对象,是一种虚拟表,它并不是物理对象,因为视图不占物理存储空间,在视图中被查询的表称为视图的基表,大多数的select语句都可以用在创建视图中 优点:集中用户使用的数据,掩码数据的复杂性...
  • 1什么情况下使用存储过程 存储过程:比较复杂的逻辑,需要放在一个事务里的,可能包括select,insert,update等一系列操作 2,存储过程存储函数的区别 存储在数据库中供所有用户程序调用的子程序叫做存储过程和...
  • 一次性删除所有存储过程视图.升级数据库必备
  • sybaseiq 创建 存储过程视图 ,触发器等语法大全
  • 绿色版查看sql加密存储过程视图等工具
  • 最近遇到这样一个需求,...存存储过程存储过程存字符串^_^,前提是可以远程链接数据库) 说一下为什么选存储过程 webconfig修改不方便,需要远程web服务器找到发布目录改webconfig 数据库表改也不方便,sql比较...
  • MyBatis支持普通sql的查询、视图的查询、存储过程调用,是一种非常优秀的持久层框架。接下来通过本文给大家介绍mybatis调用视图存储过程的方法,感兴趣的朋友一起看看吧
  • 存储过程视图的区别

    千次阅读 2019-07-04 12:30:23
    SQL里面不带参数的存储过程视图的区别1、存储过程是程序化的sql可以实现一般sql不能实现的功能。 如:先检索一个表得到一些数据,经过一定的编辑后更新到另外一个表中、这就可以用不带参数的存储过程实现。 2、...
  • MySQL视图存储过程

    2019-05-19 16:29:24
    视图并不在数据库中以存储的数据形式存在 行和列的数据来自定义视图时查询所引用的基表,并且在具体引用视图时动态生成 更新视图的数据,就是更新基表的数据 更新基表数据,视图的数据也会跟着改变 视图优点 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,250
精华内容 110,900
关键字:

存储过程视图