通过sql调用procedure_oracle存储过程简单案例

通过sql调用procedure_oracle存储过程简单案例文章目录1.存储过程和函数在实际项目中的使用2.存储过程与函数的比较2.1.共同点2.2.不同点3.存储过程StoredProcedure3.1.存储过程概述3.1.1.存储过程的优点3.1.2.存储过程的缺点3.2.创建存储过程createprocedure3.3.调用存储过程call3.4.查看存储过程的定义3.5.修改存储过程alterprocedure…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 存储过程概述

存储过程是一种在数据库中存储复杂程序,以便外部程序调用的数据库对象。

存储过程经编译创建并保存在数据库中,用户可通过指定存储过程的名字和给定参数来调用执行。存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。

作个形象的比喻,存储过程也可以看作是一个”加工厂”,它接收”原料”(in参数)然后将这些原料加工处理成”产品”(out/inout参数),再把”产品”交付给”调用者”。

存储过程的优点

  1. 减少网络流量的使用
  2. 将重复性很高的一系列操作,封装到一个存储过程中,简化了SQL的调用
  3. 批量处理: 通过循环减少流量,也就是“跑批”
  4. 统一接口,确保数据安全。

存储过程的缺点

  1. 存储过程往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  2. 存储过程的性能调校与撰写受限于具体的数据库系统。

2. 创建存储过程 create procedure

创建存储过程的语法如下:

create [definer = {
  
  user|current_user}] procedure [过程名] ( [参数1],[参数2],...,[参数n] )
	[[特征1],[特征2],...,[特征n]] 
	[SQL代码];

-- definer 用于指定存储过程由哪个用户定义,默认是当前用户,注意不是指定存储过程的使用权限

-- [过程名] 该过程名用于指定存储过程,分别用户调用

-- [参数] 参数的形式为:[in|out|inout] [参数名] [参数类型],例如:in pcd_id int、inout pcd_username varchar(3)
-- -- -- in 表示该参数为输入参数,即调用时传入
-- -- -- out 表示该参数为输出参数,即存储过程的返回值
-- -- -- inout 表示该参数即可输入也可输出
-- -- -- 参数类型 可以是 int或者varchar()

-- [特征] 特征是存储过程的属性,它包括了如下几个可选特征
-- -- -- comment '' 注释信息,例如:commet '这是一个存储过程'
-- -- -- language sql 指定存储过程使用的语言为sql
-- -- -- [not] deterministic 是否指定一个输入仅对应一个输出(映射),包含下面2个可选参数
-- -- -- -- -- not deterministic(默认),表示不指定映射关系;
-- -- -- -- -- deterministic,表示指定映射关系
-- -- -- [contains sql | no sql | reads sql data | modifies sql data] 明确子程序对数据的操作,包含下面4个可选参数
-- -- -- -- -- contains sql(默认),表示子程序不包含读或者写数据的语句
-- -- -- -- -- no sql,表示子程序不包含sql
-- -- -- -- -- reads sql data,表示子程序包含读数据的语句,但是不包含写数据的语句
-- -- -- -- -- modifies sql data,表示子程序包含写数据的语句
-- -- -- sql security [definer|invoker] 指定调用权限,包含下面两个可选参数
-- -- -- -- -- sql security definer(默认),使用创建者权限调用存储过程,不受限制
-- -- -- -- -- sql security invoker,使用调用者权限调用存储过程,只有被赋予权限的调用者才能调用

例如:

-- 将tab_sale表中sale_name字段值等于传入参数的记录删除
create procedure delete_sale(in pcd_sale_name varchar(3))
begin
	delete from tab_table
	where tab_table.sale_name= pcd_sale_name ;
end
2.1. 参数 in、out、inout

下面三段代码是对存储过程的参数in、out和inout的代码说明:

-- 创建一个存储过程,参数为in
create procedure test(in i int)
begin
	select i; -- 返回结果i,i=1
	set i=2;
	select i; -- 返回结果i,i=2
end

-- 调用存储过程test,并传入一个参数i=1
set @i = 1; -- 定义全局变量i
call test(@i);
select @i; -- 返回结果i,i=1

-- 由以上代码可知当存储过程的参数为in时,会传入变量的值,并且存储过程内部的赋值不会影响到外部传入的变量
-- 创建一个存储过程,参数为out
create procedure test(out i int)
begin
	select i; -- 返回结果i,i=Null
	set i=2;
	select i; -- 返回结果i,i=2
end

-- 调用存储过程test,并传入一个参数i=1
set @i=1; -- 定义全局变量i
call test(@i);
select @i; -- 返回结果i,i=2

-- 由以上代码可知当存储过程的参数为out时,变量的值不会被传入,并且存储过程内部的赋值运算可以影响到外部传入的变量
-- 创建一个存储过程,参数为inout
create procedure test(inout i int)
begin
	select i; -- 返回结果i,i=1
	set i=2;
	select i; -- 返回结果i,i=2
end

-- 调用存储过程test,并传入一个参数i=1
set @i=1; -- 定义全局变量i
call test6(@i);
select @i; -- 返回结果i,i=2

-- 由以上代码可知当存储过程的参数为out时,会传入变量的值,并且存储过程内部的赋值运算可以影响到外部传入的变量

3. 调用存储过程 call

存储过程的调用使用call关键字
例如:

-- 将tab_sale表中sale_name字段值等于'辣条'的记录删除
create procedure delete_sale(in pcd_sale_name varchar(3))
delete from tab_table
where tab_table.sale_name= pcd_sale_name ;

-- 调用存储过程delete_sale
call delete_sale('辣条');

4. 查看存储过程

4.1. 查看存储过程的状态

语法如下:

show procedure status like '[状态名]';

[状态名]可以查看博客:show status 查看各种状态

例如:

--查看查询时间超过long_query_time秒的查询的个数。
show procedure status like 'slow_queries';
4.2. 查看存储过程的定义

语法如下:

show create procedure '[过程名]'

例如:

-- 查看存储过程delete_sale的定义
show create procedure delete_sale

结果如下:

Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
delete_sale ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root@localhostPROCEDUREdelete_sale`(in pcd_num int) delete from tab_sale where tab_sale.num = pcd_num utf8mb4 utf8mb4_0900_ai_ci utf8mb4_0900_ai_ci
4.2. 从information_schema.Routines表查看存储过程的信息 mysql

MySQL数据库的所有存储过程的信息都保存在information_ schema数据库中的routines表中,因此可以使用select语句查询存储过程的相关信息。

语法为:

select * from information_schema.ROUTINES
where routine_name='[过程名]'

例如下面的SQL语句是查看存储过程delete_sale相关信息的语句。

select * from information_schema.ROUTINES
where routine_name='delete_sale'

执行结果如下:

SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE
delete_sale def sqlcourse4 delete_sale PROCEDURE

5. 修改存储过程 alter procedure

修改存储过程的特性可以使用alter procedure关键字,语法如下:

alter procedure [存储过程名] [特性]

例如:

-- 修改存储过程delete_sale,使它可以写数据(modifies sql data)
alter procedure delete_sale modifies sql data;

6. 删除存储过程 drop procedure

语法:

drop procedure [if exists] [存储过程名]

例如:

-- 如果存储过程delete_sale存在,则删除它
drop procedure if exists delete_sale;

存储过程和函数的博客分为三章,链接分别为:

  1. SQL 存储过程 procedure 讲解+代码实例
  2. SQL 函数 function 讲解+代码实例
  3. SQL 存储过程和函数的对比、变量、条件和处理程序、游标、流程控制详解+代码示例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185645.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 内外网同时使用route add

    内外网同时使用route add使用routeadd添加路由,使两个网卡同时访问内外网routeadd命令格式:route[-f][-p][Command][Destination][maskNetmask][Gateway][metricMetric][ifInterface] 通过配置电脑的静态路由来实现同时访问内外网的。电脑的网络IP配置不用变,两个网卡都按照正常配置(都配置IP地址、子网掩码、网…

  • C语言空格代码_c语言中空格是字符吗

    C语言空格代码_c语言中空格是字符吗一、逗号,之后加空格printf("error!score[%d]=%d\n",i,score[i]);二、分号;之后加空格for(i=0;i<student_num;i++);三、关系运算符<、<=、>、>=、==、!=前后加空格if((score[i]>=0)&&(s…

  • 微生物组-宏基因组分析第8期 (报名直播课免费参加线下课2020.7,最后一周)

    微生物组-宏基因组分析第8期 (报名直播课免费参加线下课2020.7,最后一周)“福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析、宏基因组、Python课程和转录组的线上直播课。报名参加线上直播课的老师可在1年内选择参加同…

  • 黑盒测试用例设计方法一(等价类划分、边界值分析)

    黑盒测试用例设计方法一(等价类划分、边界值分析)文章目录黑盒测试用例设计方法黑盒测试用例设计方法概述等价类划分法边界值分析法黑盒测试用例设计方法黑盒测试用例设计方法概述测试数据选择等价类划分法边界值分析法测试步骤设计因果图法判定表法正交实验法功能图法场景法等价类划分法等价类划分法原理把程序的输入域划分成若干份,然后从每个部分中选取少数代表性数据作为测试用例每一类的代表性数据在测试中的作用等价于这一类中的其他值,如果某一类中的一个例子发现了错误,这一等价类中的其他例子也能发现同样的错误。反之,如果某一类中的一个例子没有

  • cocos2dx触屏响应(单点触摸)CCTouchBegan,CCTouchMove,CCTouchEnd[通俗易懂]

    cocos2dx触屏响应(单点触摸)CCTouchBegan,CCTouchMove,CCTouchEnd[通俗易懂]今天白白跟大家分享一下cocos2dx单点触摸经验。cocos2dx触摸CCTouch类的单点触摸有四个函数CCTouchBegan,CCTouchMove,CCTouchEnd,CCTouchCan

  • mac 安装配置android sdk[通俗易懂]

    mac 安装配置android sdk[通俗易懂]一、安装sdk在mac上可以使用brew包管理工具来安装软件,所以要安装sdk,首先需要安装brew包,详情可参照我上一篇博客,这里就不过多赘述。1、安装好brew后,通过以下命令进行sdk的安装brewinstallandroid-sdk2、查看是否已安装成功,在终端执行:android二、配置sdk1、查看sdk安装路径brewlistandroid-sdk可见,我的sdk的安装路径是在/opt/homebrew/Caskroom/android.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号