Oracle存储过程创建方式

 更新时间:2025年02月19日 11:15:09   作者:拽着尾巴的鱼儿  
本文介绍了Oracle存储过程的创建,包括package和package body的定义,以及输入/输出参数的类型,通过示例代码,详细说明了如何创建和使用存储过程,并总结了个人经验

前言

在做的一个功能,业务要求数据处理的一部分逻辑要通过Oracle的存储过程实现,因为很少使用存储过程进行数据逻辑的处理,故进行一个记录。

一、Oracle 存储过程

Oracle 存储过程是一种存储在数据库中的可重复使用的代码块,用于执行特定的任务或一系列 SQL 操作。

二、Oracle 存储的创建

2.1 package 的创建

2.1.1 package create

定义一个 package 中的方法,类似于java 中的借口。

(示例):

create or replace package testA is
PROCEDURE find(
    pi$param1   IN NUMBER,  --参数1 数字
    pi$param2   IN VARCHAR2,--参数2 字符串
    pi$param3   IN DATE,    --参数3 日期
    --------------------输出参数-----------------------
    po$count           OUT NUMBER, --总条数
    po$result          OUT  row_types.RESULTSET--结果集
  );
end testA ;
  • create or replace package testA is : testA 对应包名;
  • PROCEDURE find :find 为testA 包名下对应的存储过程名称;
  • pi$param1 IN NUMBER, --参数1 数字: IN 代表是输入的参数,即要传值的参数;
  • po$count OUT NUMBER,: out 代表返回的数据

2.1.2 存储过程 常用的输入/输出参数类型

数字类型(Number)

  • 定义:用于存储数值数据,可以表示整数、小数等。例如,NUMBER(5,2)表示一个总共 5 位,其中小数部分占 2 位的数字。
  • 用途:在输入参数中,可以用于接收如商品价格、员工工资、数量等数值。在输出参数中,可返回计算后的数值结果,如计算后的总价、平均值等。

字符类型(VARCHAR2、CHAR)

定义:

  • VARCHAR2是可变长度的字符类型,存储长度根据实际存储的字符数确定。例如,VARCHAR2(100)可以存储最多 100 个字符的字符串。
  • CHAR是固定长度的字符类型,存储时如果实际字符数小于定义长度,会用空格填充。如CHAR(10)存储长度总是 10 个字符。

用途:作为输入参数,常用于接收名称(如员工姓名、产品名称)、描述信息等字符串。作为输出参数,可以返回如格式化后的名称、错误消息等字符串。

日期时间类型(DATE、TIMESTAMP)

定义:

  • DATE类型用于存储日期和时间信息,精确到秒。它存储世纪、年、月、日、时、分、秒等信息。
  • TIMESTAMP类型比DATE更精确,它可以存储小数秒,并且在处理跨时区的日期时间等场景更有用。

用途:在输入参数方面,可接收如订单日期、员工入职日期等日期时间值。在输出参数中,能返回如计算后的到期日期、操作完成时间等。

2.2 package body的创建

package body 是对package 中存储过程的具体实现(示例):

(1) package body 示例:

create or replace package body testA is
PROCEDURE find(
    pi$param1   IN NUMBER,  --参数1 数字
    pi$param2   IN VARCHAR2,--参数2 字符串
    pi$param3   IN DATE,    --参数3 日期
    --------------------输出参数-----------------------
    po$count           OUT NUMBER, --总条数
    po$result          OUT row_types.RESULTSET--游标结果集
  )
  is
 -- 此处可以声明变量:在 Oracle 存储过程中,使用DECLARE关键字来声明变量。
 -- 变量声明通常放在存储过程的IS或AS关键字之后,BEGIN关键字之前。声明变量的基本格式为变量名 数据类型 [ := 初始值];
 DECLARE
    v_name VARCHAR2(50);
    v_count NUMBER := 0;
    v_1 VARCHAR2(50) :='';
 begin 
 	-- 此处处理业务逻辑
  -- 最后返回结果:
  -- 直接赋值
  po$count := 数量
  -- 通过select  into 赋值
   SELECT COUNT(1) INTO po$count FROM xxx;
  -- 通过游标返回数据集合
   OPEN po$result FOR sql 语句;
  end;
  
  
end testA ;

(2) 结果集定义游标返回:

CREATE OR REPLACE PACKAGE row_types
AS
  TYPE  resultSet  IS REF CURSOR;
  TYPE  strSplit IS TABLE OF VARCHAR2 (40);
  Type  uuidArray is Table OF number(20);
END;

(3)使用 CALL 或 EXECUTE 关键字来调用存储过程:

DECLARE
  count_1 NUMBER;
  result_1 row_types.RESULTSET;
  TYPE result_record_type IS RECORD (
        str1   VARCHAR2(500),
        str2   VARCHAR2(4000),
        str3   VARCHAR2(500),
        str4   VARCHAR2(500),
        str5   VARCHAR2(500),
        str6   VARCHAR2(500),
        str7   VARCHAR2(500),
        str8   VARCHAR2(500),
        str9   VARCHAR2(500),
        str10 VARCHAR2(500),
        str11 VARCHAR2(500),
        str12 VARCHAR2(500),
        str13 VARCHAR2(500),
        str14 VARCHAR2(500),
        str15 VARCHAR2(500),
        str16 VARCHAR2(500),
        str17 VARCHAR2(500),
        str18 VARCHAR2(500),
        str19 VARCHAR2(500),
        str20 VARCHAR2(500),
        str21 VARCHAR2(500),
        str22 VARCHAR2(500),
        str23 VARCHAR2(500),
        num1 NUMBER,
        num2 NUMBER,
        num3 NUMBER,
        num4 NUMBER,
        num5 NUMBER,
        num6 NUMBER,
        num7 NUMBER,
        num8 NUMBER,
        num9 NUMBER,
        DT   DATE,
        DT1  DATE,
        DT2  DATE,
        DT3  DATE,
        DT4  DATE
    );
    result_row result_record_type;
begin
	testA.find(1,'test',count_1,result_1);
  DBMS_OUTPUT.put_line('DHIDHDIDIH:'||count_1);
  loop
      fetch result_1 into result_row.str1,result_row.DT;
      EXIT WHEN result_1%NOTFOUND;
      dbms_output.put_line('结果内容:'||result_row.str1 ||'=='|| 
      result_row.DT  
      );
  end loop;
  close result_1;
end;

总结

本文对 oracle 存储过程的创建进行记录。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle rac案例讲解

    Oracle rac案例讲解

    这篇文章主要介绍了Oracle rac案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Oracle使用like查询时对下划线的处理方法

    Oracle使用like查询时对下划线的处理方法

    这篇文章主要介绍了Oracle使用like查询时对下划线的处理方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Oracle执行计划查看方法汇总及优劣对比详解

    Oracle执行计划查看方法汇总及优劣对比详解

    这篇文章主要介绍了Oracle执行计划查看方法汇总及优劣对比,在 Oracle 数据库中,查看执行计划是优化 SQL 语句性能的重要工具,本文给大家介绍了几种常用的查看执行计划的方法及其优劣比较,需要的朋友可以参考下
    2024-11-11
  • 基于OGG实现Oracle实时同步MySQL的全过程

    基于OGG实现Oracle实时同步MySQL的全过程

    这篇文章详细阐述了基于OGG实现Oracle实时同步MySQL全过程,文中通过图文结合和代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-11-11
  • oracle如何查询表中所有字段

    oracle如何查询表中所有字段

    这篇文章主要介绍了oracle如何查询表中所有字段问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • db2与oracle的sql语句有什么不同

    db2与oracle的sql语句有什么不同

    Oracle和DB2都是关系型数据库管理系统(RDBMS),但它们的设计理念、特性及性能等方面存在一些显著的差异,本文将详细比较Oracle和DB2,帮助企业和数据库管理员了解这两个系统各自的优势和局限性,并指导用户根据自己的业务需求作出合适的选择
    2024-02-02
  • 详解Oracle 中实现数据透视表的几种方法

    详解Oracle 中实现数据透视表的几种方法

    这篇文章主要介绍了详解Oracle 中实现数据透视表的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • redhat 4中安装Oracle 10g图文教程

    redhat 4中安装Oracle 10g图文教程

    本文主要讲诉了在redhat 4中安装Oracle 10g的全过程的详细记录,不过只是安装过程,建库不在本教程范围内,呵呵,自己摸索或者等待本文续篇
    2014-08-08
  • Oracle Index索引无效的原因与解决方法

    Oracle Index索引无效的原因与解决方法

    这篇文章主要给大家介绍了关于Oracle Index索引无效的原因与解决方法,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • oracle 树查询 语句

    oracle 树查询 语句

    oracle 树查询,需要的朋友可以参考下,代码有点乱不好意思啊
    2009-07-07

最新评论