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数据库中ora-12899错误的解决方法

    Oracle数据库中ora-12899错误的解决方法

    大家在使用oracle数据库时,经常会遇到各种各样的问题,其中ORA-12899就是前段时间我在将数据导入到我本地机器上的时候一直出现的问题.经过一番倒腾问题顺利解决,下面小编把实现思路分享到脚本之家平台大家可以参考下
    2017-11-11
  • 解决Oracle RMAN删除归档日志不释放问题的方法

    解决Oracle RMAN删除归档日志不释放问题的方法

    RMAN清除方式会自动清除磁盘上的归档日志文件,同时会释放控制文件中对应的归档日志的归档信息,但最近在使用中就遇到了一个问题,下面这篇文章主要给大家介绍了关于解决Oracle RMAN删除归档日志不释放问题的方法,需要的朋友可以参考下。
    2017-07-07
  • 在客户端配置TNS测试报错ORA-12170:TNS:连接超时

    在客户端配置TNS测试报错ORA-12170:TNS:连接超时

    在Red Hat Enterprise Linux Server Releae 5.5 成功安装ORACLE 10g 后,在客户端配置TNS后,测试是否可以连接到数据块服务器,结果报错:ORA-12170:TNS:连接超时
    2012-12-12
  • oracle11g 通过修改配置文件方式连接远程数据库的方法

    oracle11g 通过修改配置文件方式连接远程数据库的方法

    这篇文章主要介绍了oracle11g 通过修改配置文件方式连接远程数据库的方法,需要的朋友可以参考下
    2017-04-04
  • 自动备份Oracle数据库

    自动备份Oracle数据库

    自动备份Oracle数据库...
    2007-03-03
  • Oracle表空间查看sql使用情况

    Oracle表空间查看sql使用情况

    我们在日常工作中查看表空间的使用情况大多数都是使用DBA。下面脚本之家小编给大家带来了oracle表空间查看sql使用情况的方法步骤,需要的童鞋参考下
    2016-05-05
  • oracle中distinct的用法详解

    oracle中distinct的用法详解

    distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。
    2015-09-09
  • 安装oracle11g时遇到INS-13001的问题及解决

    安装oracle11g时遇到INS-13001的问题及解决

    在Win10安装Oracle 11g时出现INS-13001错误,需修改解压目录下stage/cvu的cvu_prereq.xml文件,将32-bit改为64-bit,保存后重新运行安装程序即可解决兼容性问题
    2025-07-07
  • oracle存储过程常用的技巧(详)

    oracle存储过程常用的技巧(详)

    存储过程是在大型数据库系统中存储过程在数据库中经过第一次编译后就不需要再次编译,用户通过指定存储过程的名字并给出参数来,通过本篇文章带领大家去学习oracle存储过程常用的技巧,感兴趣的朋友一起来学习吧
    2015-08-08
  • Oracle删除表及查看表空间的实例详解

    Oracle删除表及查看表空间的实例详解

    这篇文章主要介绍了Oracle删除表及查看表空间的实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03

最新评论