存储过程

存储过程

一个人想着一个人 提交于 2020-04-06 21:05:31
https://blog.csdn.net/qq_32939679/article/details/80532747 http://www.cnblogs.com/caozengling/p/5306288.html 存储过程(Stored Procedure)是 一组为了完成特定功能的SQL 语句集, 存储在数据库中。 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,以使用存储过程可提高数据库执行速度,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 2.当对数据库进行复杂操作时(如对多个表进行 Update, Insert,Query, Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。 3.存储过程可以重复使用,可减少数据库开发人员的工作量 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权 相对于直接使用SQL 语句,在应用程序中直接调用存储过程有以下好处: (1)减少网络通信量。 一个存储过程在 网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。 (2)执行速度更快。 1.在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出 最终被存储在系统中的执行计划。 2.执行存储过程要比直接执行sql花费更多

[Err] 1449

╄→尐↘猪︶ㄣ 提交于 2020-04-06 18:54:39
在进行一个数据迁移时,同一服务不同库之间的数据迁移。因为只需要迁移部分满足条件的数据,所以需要带查询条件。 写了大致如下结构的SQL: insert into “表A” select * from “数据库名”.“表A” where id in ('1','2','3'); 结果报错: [Err] 1449 - The user specified as a definer ('root'@'localhost') does not exist 网上搜寻都说是权限问题,我ROOT账号本来就是所有权限了,暴躁了好一会。 突然发现我的root账号是root@%,为啥会提示root@localhost。 检查了一遍后,发现在目标数据库中表A上有触发器,触发器中调用了存储过程,然后存储过程中定义者为root@localhost。 改成 root@%,重新执行正确。 这个问题肯定是权限的问题。一定要仔细检查权限是否授权 : grant all privileges 检查存储过程或者函数的定义者 检查视图的定义者 来源: oschina 链接: https://my.oschina.net/linx/blog/3215504

将存储过程的结果插入临时表

泪湿孤枕 提交于 2020-04-05 20:52:23
问题: How do I do a SELECT * INTO [temp table] FROM [stored procedure] ? 如何 SELECT * INTO [temp table] FROM [stored procedure] 进行 SELECT * INTO [temp table] FROM [stored procedure] ? Not FROM [Table] and without defining [temp table] ? 不是 FROM [Table] ,也没有定义 [temp table] ? Select all data from BusinessLine into tmpBusLine works fine. 从 BusinessLine Select 所有数据到 tmpBusLine 可以正常工作。 select * into tmpBusLine from BusinessLine I am trying the same, but using a stored procedure that returns data, is not quite the same. 我正在尝试相同的方法,但是使用返回数据的 stored procedure 并不完全相同。 select * into tmpBusLine from exec

自动执行存储过程

。_饼干妹妹 提交于 2020-04-05 19:12:40
当需要定时生成一个报表,并且不需要任何操作。那就需要自动执行存储过程的任务。 步骤如下 1、打开SQL Server Management Studio,SQL Server代理--作业--点右键--新建作业 2、作业的名称取为:test001 并进行说明,若作业的数量太多,以方便区别;这里写上定时执行存储过程Pr_test。确定保存. 3、 点击常规下面的步骤,按箭头指示,新建步骤. 4、取名步骤名称:exec pro_test_001 注意选择存储过程所在的数据库,录入需要执行的命令:exec pr_test ,确定保存。若有其它参数命令也可以编写 5、接下来设置计划,自动定时执行的时间。点击新建计划 填写需要的计划名称,设置为每天0点执行任务。 6、完成了最后确定即可 来源: oschina 链接: https://my.oschina.net/qingqingdego/blog/3214837

数据库-存储过程

只愿长相守 提交于 2020-04-05 16:44:55
############### 存储过程 ############## """ 3.存储过程 那么什么是存储过程呢?怎么创建、查看和删除存储过程呢?存储过程有什么优点? 存储过程:类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合, 该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。 1. 查看现有的存储过程 show procedure status; 2 .删除存储过程 drop procedure 存储过程名称; 3. 调用 存储过程 call 存储过程名称(参数入/出类型 参数名 数据类型); ############################# 4.创建存储过程 # 1.体会封装 create procedure p1 () begin select * from account; end # 2, SQL 体会参数 create procedure p2(in i int,out n varchar(50)) begin select name into n from account where id = i; end -- 调用 set @name =null; CALL p2(1,@name); select @name; 注意1: mysql中有三种出入参数类型:分别为:1. in 入参类型 2.out

存储例程

徘徊边缘 提交于 2020-04-04 17:59:57
存储例程 存储例程是存储程序的一种类型,本质上也是封装了一些可执行的语句,只不过它的调用方式是:需要手动去调用!存储例程又可以分为存储函数和存储过程。 存储函数 创建存储函数 存储函数其实就是一种函数,只不过在这个函数里可以执行命令语句而已。函数它可以把处理某个问题的过程封装起来,之后直接调用函数就可以去解决同样的问题了。MySQL 中定义存储函数的语句如下: CREATE FUNCTION 存储函数名称([参数列表]) RETURNS 返回值类型 BEGIN 函数体内容 END 从这里可以看出,定义一个存储函数需要指定函数名称、参数列表、返回值类型以及函数体内容,如果该函数不需要参数,那参数列表可以被省略,函数体内容可以包括一条或多条语句,每条语句都要以分号 ; 结尾。里边的制表符和换行仅仅是为了好看,完全可以用空格代替。 mysql> delimiter $ mysql> create function avg_score(s varchar(100)) -> returns double -> begin -> return (select avg(score) from student_score where subject = s); -> end $ Query OK, 0 rows affected (0.01 sec) 定义了一个名叫 avg_score 的函数

8.1 存储过程

妖精的绣舞 提交于 2020-04-04 09:30:37
一、创建 ★ create procedure 存储过程名(参数模式 参数名 参数类型) begin 存储过程体 end 注意: 1. 参数模式:in、out、inout,其中in可以省略 2. 存储过程体的每一条sql语句都需要用分号结尾 二、调用 call 存储过程名(实参列表) 举例: 调用in模式的参数: call sp1(‘值’); 调用out模式的参数: set @name; call sp1(@name);select @name; 调用inout模式的参数: set @name=值; call sp1(@name); select @name; 三、查看 show create procedure 存储过程名; 四、删除 drop procedure 存储过程名; 来源: https://www.cnblogs.com/huabro/p/12630376.html

MySQL 大表数据定期归档

拜拜、爱过 提交于 2020-04-02 19:40:56
数据库有一张表数据量很大,真正WEB项目只用到一个月内的数据,因此把一个月前的旧数据定期归档。 1 - 创建一个新表,表结构和索引与旧表一模一样 create table table_news like table_name; 2 - 新建存储过程,查询30天的数据并归档进新数据库,然后把30天前的旧数据从旧表里删除 delimiter $ create procedure sp() begin insert into tb_new select * from table_namewhere create_time < NOW() - INTERVAL 30 DAY; delete from db_smc.table_namewhere create_time < NOW() - INTERVAL 30 DAY; end 3 - 创建EVENT,每天晚上凌晨00:00定时执行上面的存储过程 create event if not exists event_temp on schedule every 1 day on completion preserve do call sp(); 备注: 第一次执行存储过程的时候因为历史数据过大, 可能发生意外让该次执行没有成功。重新执行时会遇到报错ERROR 1205 (HY000): Lock wait timeout exceeded;

oracle——存储过程参数

半腔热情 提交于 2020-04-01 03:25:15
oracle 存储过程类型: 1、in:输入类型,即由应用程序将数据传入oracle存储过程中;这种参数在存储过程中是 只读参数 ,在存储过程中无法对该类型的参数进行修改; 2、out:输出参数,是在存储过程中对该值进行赋值,在程序中获取值。 3、in out:输入输出参数,兼具以上两种特性,但可读可写。 验证输入参数: 由于默认参数是输入类型的,在上图中,对BAcount参数赋值,报错。 解决办法: CREATE OR REPLACE PACKAGE body BAWQ_PROC_JGZX IS PROCEDURE PROC_CSJGZX ( pproc VARCHAR2, BAcount int :=3 ) IS i int :=BAcount; --定义变量,通过变量替代参数 BEGIN i:=BAcount; dbms_output.put_line(i); delete CSJGZX; while i>0 LOOP i := i-1 ; insert into CSJGZX (CSJGZX_PROC,id,bh,mc,data) values(pproc,SYS_GUID(),SYS_GUID(),'济南',cast(DBMS_RANDOM.VALUE(1,200) as int)); commit; end loop; END PROC_CSJGZX; END BAWQ

Oracle存储过程merge into

依然范特西╮ 提交于 2020-03-31 20:38:56
最近本人在做一个后台新增数据功能时,用到了merge into函数,这里把碰到的一些自己理解进行一下总结,有什么不好的,不对的希望大家可以提出来。 merge into的形式: MERGE INTO 表A USING 表B ON(a.a=b.b) WHEN MATCHED THEN 更新数据 WHEN NOT MATCHED THEN 新增数据 该SQL语句功能是: 判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表但是有很多可选项,如下: 1.只update或者只insert 2.带条件的update或带条件的insert 3.全插入insert实现 4.带delete的update 接下来我们进行测试一下: 1、首先新建3张表,A、B、C create table A ( id NUMBER not null, name NVARCHAR2(200) not null, year NUMBER ); create table B ( id NUMBER not null, aid NUMBER not null, name NVARCHAR2(200) not null, year NUMBER, city NVARCHAR2(200) ); create table C ( id NUMBER not null, name