首页 > 数据库 >Oracle的存储过程

Oracle的存储过程

时间:2023-10-15 09:58:21浏览次数:40  
标签:存储 name -- student Oracle 过程 id

Oracle存储过程简介

什么是存储过程

在oracle中,存储过程是为了完成特定功能的SQL语句集,编译后存储在数据库中,用户通过指定存储过程名字并给出参数(如果该存储过程带有参数)来调用存储过程。

存储过程有什么优点

  • 效率高:存储过程编译一次后,就会存到数据库,每次调用时都直接执行,而如果是执行普通sql语句,每次都要编译后再执行,效率显然更低一些。
  • 复用性高:存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。
  • 减少网络传输:存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句;另外因为一个存储过程中可以执行一系列的操作,程序中如果要执行复杂的sql操作,不需要多次连接数据库执行多条sql。
  • 安全性高:完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。

存储过程的语法格式

基本结构

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常(可写可不写,要增强脚本的容错性和调试的方便性那就写上异常处理)

无参存储过程

无参存储过程是指存储过程没有输入、输出参数,如下就是一个简单的无参存储过程:

CREATE OR REPLACE PROCEDURE pro_01
AS  --这里用AS或者IS是一样的
    
    v_id NUMBER := 100; --学生id
    v_name VARCHAR2;   --学生名称
    v_age NUMBER;      --学生年龄

BEGIN

  SELECT student_name,student_age INTO v_name,v_age
  FROM student where student_id=v_id;
  
  --输出学生信息
  dbms_output.put_line('姓名:'||v_name||',年龄:'||v_age);

  --异常处理
  WHEN OTHERS THEN
    dbms_output.put_line('OTHER_EXCEPTION:' || SQLERRM);

END;

有参存储过程

我们像调用Java中的方法一样,给存储过程定义输入、输出参数,比如对于上面的这个例子,学生id可以通过参数传入:

CREATE OR REPLACE PROCEDURE pro_02(
    i_id IN NUMBER;
    o_resultcode OUT VARCHAR2,
    o_msg OUT VARCHAR2      --最后一个参数不需要以‘,’结尾,参考insert语句最后一个字段后也没有‘,’

)
AS 
    
    v_name VARCHAR2;   
    v_age NUMBER;      

BEGIN

  SELECT student_name,student_age INTO v_name,v_age
  FROM student where student_id=v_id;
  
  --输出学生信息
  dbms_output.put_line('姓名:'||v_name||',年龄:'||v_age);
  o_resultcode := 0;
  o_msg := 'SUCCESS';

  --异常处理
  WHEN OTHERS THEN
    dbms_output.put_line('OTHER_EXCEPTION:' || SQLERRM);
    o_resultcode := -1;
    o_msg := 'OTHER_EXCEPTION:' || SQLERRM;

END;

存储过程参数的几种类型:

  • in 表示传入的参数,是参数的默认模式,例如i_id IN NUMBER和i_id NUMBER语义是相同的。
  • out 表示返回的参数,该参数的值可以传递回调用它的过程。
  • in out 表示此参数可以向该存储过程中传递值,也可以将某个值传出去。

扩展

在存储过程中既可以使用各种循环判断,也可以有事务的控制,比如我们需要写一个存储过程来统计不同月份各个城市的订单量。

CREATE OR REPLACE PROCEDURE pro_03(
    i_month IN NUMBER;
    o_resultcode OUT VARCHAR2,
    o_msg OUT VARCHAR2      

)
AS 
    
    v_count NUMBER := 0;
    cursor cursor_stat is
    select month, citycode, count(*) ordercount from order group by month, citycode;      

BEGIN

  delete from order_stat where month = i_month;
  for stat_item in cursor_stat loop
    insert into order_stat(month, citycode, ordercount)
    values(stat_item.month, stat_item.citycode, stat_item.ordercount);
    v_count := v_count + 1;
    if mod(v_count, 200) = 0 then   --每200条数据commit一次
    commit;
  end loop;
  commit;
  o_resultcode := 0;
  o_msg := 'SUCCESS';


  --异常处理
  WHEN OTHERS THEN
    dbms_output.put_line('OTHER_EXCEPTION:' || SQLERRM);
    o_resultcode := -1;
    o_msg := 'OTHER_EXCEPTION:' || SQLERRM;
    --rollback;  这里也可以进行回滚

END;

存储过程也可以返回结果集。

CREATE OR REPLACE PROCEDURE pro_04(
    cur_data OUT SYS_REFCURSOR  --这里使用 cur_data OUT TYPES.CURSORTYPE 也是可以的
)
AS 
 
BEGIN
  open cur_data for
  select id, name, age from student;
END;

其它

查询存储过程的编译错误

存储过程如果问题,在编译时时会报错的,编译界面也可以看到异常信息。另外编译的异常信息也会记录到数据库表,可通过如下sql查询。

select * from SYS.USER_ERRORS where NAME = upper('${存储过程的名称}');

 

标签:存储,name,--,student,Oracle,过程,id
From: https://www.cnblogs.com/xfeiyun/p/17765232.html

相关文章

  • Oracle重新编译视图
    当表名、列名、列类型等底层表的信息发生改变的时候,就会使得视图无法使用,其时就需要对视图进行重新的编译。第一步,查找失效的视图。可以使用数据字典中的user_objects来查找出失效的视图名,还可以利用user_views来查找出相应视图的代码信息。基本的代码如下:----------------查......
  • Oracle中表被锁的查询与处理
    查询引起了锁表的原因selectl.session_idsid,s.serial#,l.locked_mode,l.oracle_username,s.user#,l.os_user_name,s.machine,s.terminal,a.sql_text,a.actionfromv$sqlareaa,v$sessions,v$locked_obje......
  • node-oracledb typeorm 集成试用
    主要是测试下typeorm与node-oracledbthin模式的集成环境准备docker-compose文件version:'3'services:db:image:gvenzl/oracle-xe:21.3.0-slimports:-"1521:1521"environment:-ORACLE_PASSW......
  • 螺杆支撑座对注塑机的生产过程有哪些重要影响?
    螺杆支撑座对注塑机的生产过程具有重要影响,主要体现在以下几个方面:1、精度和稳定性:螺杆支撑座能够提高注塑机的精度和稳定性,从而保证塑料制品的品质和一致性。通过提供稳定的支撑和承载,螺杆支撑座可以减少机器运行过程中的振动和变形,使螺杆在预设的轨道上精确运行。2、生产效率:螺杆......
  • Oracle数据库
    Ⅰ数据库①层次型数据库②网状型数据库③关系型数据库(主要介绍)E-R图:属性(椭圆形),实体(矩形),联系(菱形-一对一、一对多、多对多)注:有的联系也有属性关系型数据库的设计范式:第一范式(1NF):属性不可再分,字段保证原子性第二范式(2NF):在满足1NF的基础上,要求表中的每条记......
  • 手动在本地搭建GPT大模型过程
    20211325手动在本地搭建GPT大模型过程一、搭建原因暑假期间由于闲着无聊且有娄老师在群里经常发一些GPT相关的文章和资料,因此对GPT有了兴趣,再加上我也经常在github上浏览和下载使用一些有趣的公开项目,由此开始着手了解GPT的构建和训练。二、搭建过程(由于当时没有想到要写博......
  • Mysql SELECT 语句执行过程
    整个SELECT语句查询流程1、客户端/服务端通信协议(Connectors)Mysql客户端/服务端通讯协议是半双工的,这就意味着在任意时刻只能有一端能发送数据,要么是客户端向服务端发送数据,要么是服务端向客户端发送数据,这两个动作不能同时进行,一旦一端开始发送数据,另外一端要完整......
  • 存储管理方式
    分段式内存管理原有的16位作系统是通过分段式内存管理,在只有四个段寄存器的情况下,每个寄存器里面所存的是基地址。32位操作系统发生了改变:变化一:在32位时代,段寄存器又增加了两个:fs、gs,用来指向这两个表,分别是gdtr和ldtr,即全局描述符表GDT,也有可能是局部描述符表LD......
  • 21计算机解决问题的过程
    第二单元编程计算同学们进入高中阶段,高中生活丰富多彩,需要学习好科学文化知识的同时,我们还需要丰富课外生活,好的课外生活能够促进科学文化知识的学习,如游戏娱乐、运动、运用智慧增值财富等,这个单元我们将介绍一个娱乐游戏,同学们可以在游戏的开发中学习知识,找到编程的乐趣,理解计算......
  • Windows访问Oracle VM VirtualBox虚拟机下Linux docker
    设置网络中的NAT方式下的端口转发  配置主机端口和客体端口,客体端口设置Linuxdocker容器端口,主机端口设置windows访问docker时用到的端口。比如,Linuxdocker容器端口为80,客体端口设置为80,在windows访问时,通过localhost:主机端口,如localhost:80,就能访问。 ......