Oracle 带参与不带参 存储过程
2023-12-25 11:22:34
Oracle 存储过程
概要
存储过程是一个命名程序块,包括过程的名称,过程使用的参数以及过程执行的操作。
经常需要用到的一些操作封装后提出来,存在数据库中,那么下次/以后就可以直接去调用这个存储过程就可以得到我们想要的结果。
什么时候需要创建存储过程?
- 使用存储过程来对SQL语句进行优化,减少硬盘的读写和与服务器之间的交互次数;
- 复杂的逻辑使用存储过程;
- 一些数据常用的固定操作;
- 表格的数据抽取的ETL操作;
- 在传统的数仓分层操作中,通常都使用存储过程操作;
使用存储过程的优点
- 增强SQL语句的功能与灵活性;
- 高效率性;
- 减少网络数据的传输,保障数据安全;
面试问题:存储过程与自定义函数的区别?
- 参数的区别:存储过程可以带或不带参数,并且可以有输出参数(或输入输出参数);
自定义函数必须带参数,并且只能是输入参数; - 存储过程一般是用来完成特定的数据操作(修改、插入数据表或执行某些DDL语句等);函数一般情况下是用来计算并返回一个计算结果。
- return返回值的区别:存储过程没有return返回值,自定义函数有return返回值;
- 调用方式的区别:存储过程可以用匿名块或call调用,自定义函数用匿名块或select语句调用;
面试问题:如何找到存储过程哪个环节执行的快慢?
是用日志来追溯问题的,记录整个程序的运行情况,知道哪个环节报错了,记录每一步花了多少时间,判断哪一步性能不好,从而多程序进行修改和优化。
一、不带参存储过程
1.创建存储过程
语法格式:
CREATE [OR REPLACE] PROCEDURE sp_过程名
IS/AS
PL/SQL过程体;
提示:这里是存储过程说明
- OR REPLACE:表示如果存储过程已经存在,则替换已有的存储过程。
- IS/AS:在IS/AS后声明变量不要加DECLARE语句。
- PL/SQL过程体;
begin ......end;
命名规范:
存储过程命名规范:SP_目标表名
2.调用存储过程
1、用匿名块调用
DECLARE ---当我们不需要声明的时候,默认把DECLARE给省略了
BEGIN
存储过程名;
--[另一个存储过程名;]
END;
2、用call调用存储过程,适用于不带输出参数(out)的存储过程
call 存储过程名();
例:创建九九乘法表存储过程
-
- 创建存储过程
create or replace procedure sp_cf99
is
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(i||'*'||j||'='||i*j||' ');
end loop;
dbms_output.put_line('');
end loop;
end;
-
- 调用存储过程
---1.匿名调用
begin
sp_cf99;
end;
---2.用call 调用 注:存储过程名后面的括号()不能省。
call sp_cf99();
二、带参存储过程
1.创建存储过程
语法格式:
CREATE OR REPLACE PROCEDURE 存储过程名(参数1 [IN/OUT/IN OUT] 数据类型,参数2 [IN/OUT/IN OUT] 数据类型...) --- 参数的数据类型也是不能带长度
IS/* / AS*/ --声明
BEGIN
--执行体/逻辑体
END;
提示:这里是存储过程说明
OR REPLACE
:表示如果存储过程已经存在,则替换已有的存储过程。IN
表示传入参数,不可以被赋值;OUT
表示传出参数,可以被赋值;IN OUT
表示传入传出参数,可以传入值,可以被赋值,可以返回值。如果这部分省略,默认表示传入参数,创建存储过程可以带参也可以不带参。IS/AS
:在IS/AS后声明变量不要加DECLARE语句。- 参数的数据类型也是不能带长度。
命名规范:
- 存储过程命名规范:
SP_目标表名
- 存储过程传入参数命名规范:
P_参数名(P_START_DATE)
- 存储过程变量命名规范:
V_变量名(V_END_DATE)
2.调用存储过程
1、用匿名块调用
DECLARE ---当我们不需要声明的时候,默认把DECLARE给省略了
BEGIN
存储过程名(参数1,参数2...);
--[另一个存储过程名;]
END;
2、用call调用存储过程,适用于不带输出参数(out)的存储过程
call 存储过程名(参数1,参数2...);
例:创建加法存储过程
-
- 创建存储过程
create or replace procedure sp_jiafa(p_m in number,p_n in number,p out number)
is
begin
p:=p_m+p_n; --对输出参数p进行赋值,输入参数在代码块中不能
dbms_output.put_line(p_m||'加上'||p_n||'的值是:'||p);
end;
-
- 调用存储过程
---1.匿名调用
declare
a number; --声明一个变量
begin
sp_jiafa(34,56,a);
sp_jiafa(p_m=>78,p_n=>12,a); -- => 为赋值符号
sp_jiafa(p_m=>&参数1,p_n=>&参数2,a); -- &参数 用于弹窗输入参数值
end;
存储过程输出结果:
注意:带参的存储过程
不能使用call
进行调用。会报错
call sp_jiafa(10,20,p); ---不能用call
文章来源:https://blog.csdn.net/weixin_42321155/article/details/132781673
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!