Oracle 带参与不带参 存储过程

2023-12-25 11:22:34

概要

存储过程是一个命名程序块,包括过程的名称,过程使用的参数以及过程执行的操作。
经常需要用到的一些操作封装后提出来,存在数据库中,那么下次/以后就可以直接去调用这个存储过程就可以得到我们想要的结果。

什么时候需要创建存储过程?

  1. 使用存储过程来对SQL语句进行优化,减少硬盘的读写和与服务器之间的交互次数;
  2. 复杂的逻辑使用存储过程;
  3. 一些数据常用的固定操作;
  4. 表格的数据抽取的ETL操作;
  5. 在传统的数仓分层操作中,通常都使用存储过程操作;

使用存储过程的优点

  1. 增强SQL语句的功能与灵活性;
  2. 高效率性;
  3. 减少网络数据的传输,保障数据安全;

面试问题:存储过程与自定义函数的区别?

  1. 参数的区别:存储过程可以带或不带参数,并且可以有输出参数(或输入输出参数);
    自定义函数必须带参数,并且只能是输入参数;
  2. 存储过程一般是用来完成特定的数据操作(修改、插入数据表或执行某些DDL语句等);函数一般情况下是用来计算并返回一个计算结果。
  3. return返回值的区别:存储过程没有return返回值,自定义函数有return返回值;
  4. 调用方式的区别:存储过程可以用匿名块或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 存储过程名();

例:创建九九乘法表存储过程

    1. 创建存储过程
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. 调用存储过程
---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...);

例:创建加法存储过程

    1. 创建存储过程
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. 调用存储过程
---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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。