当前位置: 首页 > news >正文

Oracle Subprogram即Oracle子程序

Oracle Subprogram,即Oracle子程序,是Oracle数据库中存储的过程(Procedures)和函数(Functions)的统称。这些子程序是存储在数据库中的PL/SQL代码块,用于执行特定的任务或操作。下面详细介绍Oracle Subprogram的几个方面:

一、基本概念

  • 过程(Procedures):过程是一系列为了完成特定功能而编写的SQL和PL/SQL语句的集合。过程执行操作但不返回值。
  • 函数(Functions):函数也是一系列SQL和PL/SQL语句的集合,但它执行计算并返回一个值。

二、特点与优势

  • 存储性:子程序存储在数据库中,可以在多个应用程序或数据库会话中重用,减少了代码冗余。
  • 封装性:通过封装复杂的业务逻辑,子程序可以提高代码的可读性和可维护性。
  • 安全性:通过控制对子程序的访问权限,可以保护数据库的安全。

三、类型

  • 独立子程序:在模式级别创建,不依赖于其他包或对象。
  • 包子程序:在包(Package)内创建,与包的其他部分(如类型、变量、游标等)紧密相关。

四、结构与组成

Oracle子程序遵循PL/SQL块结构,通常由以下几个部分组成:

  1. 声明部分(Declarative Part):包含子程序所需的类型、常量、变量、游标、异常等的声明。
  2. 执行部分(Executable Part):包含执行操作的SQL和PL/SQL语句。
  3. 异常处理部分(Exception Handling Part):包含处理执行过程中可能出现的异常的代码。

五、创建与调用

  • 创建:使用CREATE OR REPLACE PROCEDURE(对于过程)或CREATE OR REPLACE FUNCTION(对于函数)语句来创建子程序。
  • 调用:在PL/SQL代码块、触发器、其他子程序或应用程序中,通过指定子程序的名称和必要的参数(如果有)来调用子程序。

六、示例

6.1 以下是一个简单的Oracle过程示例,用于向表中插入一行数据:
CREATE OR REPLACE PROCEDURE AddEmployee(p_employee_id IN NUMBER,p_employee_name IN VARCHAR2,p_hire_date IN DATE
) AS
BEGININSERT INTO employees (employee_id, employee_name, hire_date)VALUES (p_employee_id, p_employee_name, p_hire_date);COMMIT;
EXCEPTIONWHEN OTHERS THENROLLBACK;RAISE_APPLICATION_ERROR(-20001, 'An error occurred while inserting employee.');
END AddEmployee;

在这个示例中,AddEmployee过程接受三个参数:员工ID(p_employee_id)、员工姓名(p_employee_name)和雇佣日期(p_hire_date)。它执行一个INSERT语句将数据插入到employees表中,并在成功插入后提交事务。如果在插入过程中发生任何异常,它将回滚事务并抛出一个应用程序错误。

6.2 声明、定义和调用简单的PL/SQL过程

Declaring, Defining, and Invoking a Simple PL/SQL Procedure

In this example, an anonymous block simultaneously declares and defines a procedure and invokes it three times. The third invocation raises the exception that the exception-handling part of the procedure handles.

DECLAREfirst_name employees.first_name%TYPE;last_name  employees.last_name%TYPE;email      employees.email%TYPE;employer   VARCHAR2(8) := 'AcmeCorp';-- Declare and define procedurePROCEDURE create_email (  -- Subprogram heading beginsname1   VARCHAR2,name2   VARCHAR2,company VARCHAR2)                         -- Subprogram heading endsIS-- Declarative part beginserror_message VARCHAR2(30) := 'Email address is too long.';BEGIN                     -- Executable part beginsemail := name1 || '.' || name2 || '@' || company;EXCEPTION                      -- Exception-handling part beginsWHEN VALUE_ERROR THENDBMS_OUTPUT.PUT_LINE(error_message);END create_email;BEGINfirst_name := 'John';last_name  := 'Doe';create_email(first_name, last_name, employer);  -- invocationDBMS_OUTPUT.PUT_LINE ('With first name first, email is: ' || email);create_email(last_name, first_name, employer);  -- invocationDBMS_OUTPUT.PUT_LINE ('With last name first, email is: ' || email);first_name := 'Elizabeth';last_name  := 'MacDonald';create_email(first_name, last_name, employer);  -- invocation
END;
/

Result:

With first name first, email is: John.Doe@AcmeCorp
With last name first, email is: Doe.John@AcmeCorp
Email address is too long.PL/SQL procedure successfully completed.
6.3 声明、定义和调用简单的PL/SQL函数

Declaring, Defining, and Invoking a Simple PL/SQL Function
In this example, an anonymous block simultaneously declares and defines a function and invokes it.

DECLARE-- Declare and define functionFUNCTION square (original NUMBER)   -- parameter listRETURN NUMBER                     -- RETURN clauseAS-- Declarative part beginsoriginal_squared NUMBER;BEGIN                               -- Executable part beginsoriginal_squared := original * original;RETURN original_squared;          -- RETURN statementEND;
BEGINDBMS_OUTPUT.PUT_LINE(square(100));  -- invocation
END;
/
-- Result
10000PL/SQL procedure successfully completed.
6.4 函数中RETURN语句后恢复执行

Execution Resumes After RETURN Statement in Function

DECLAREx INTEGER;FUNCTION f (n INTEGER)RETURN INTEGERISBEGINRETURN (n*n);END;BEGINDBMS_OUTPUT.PUT_LINE ('f returns ' || f(2) || '. Execution returns here (1).');x := f(2);DBMS_OUTPUT.PUT_LINE('Execution returns here (2).'|| f(x));
END;
/
-- Result
f returns 4. Execution returns here (1).
Execution returns here (2).16PL/SQL procedure successfully completed.
6.5 每个执行路径都指向RETURN语句的函数

Function Where Every Execution Path Leads to RETURN Statement

CREATE OR REPLACE FUNCTION f (n INTEGER)RETURN INTEGERAUTHID DEFINER
IS
BEGINIF n = 0 THENRETURN 1;ELSIF n = 1 THENRETURN n;ELSERETURN n*n;END IF;
END;
/
BEGINFOR i IN 0 .. 3 LOOPDBMS_OUTPUT.PUT_LINE('f(' || i || ') = ' || f(i));END LOOP;
END;
/
-- Result
f(0) = 1
f(1) = 1
f(2) = 4
f(3) = 9PL/SQL procedure successfully completed.
6.6 程序中返回声明后恢复执行

Execution Resumes After RETURN Statement in Procedure

DECLAREPROCEDURE p ISBEGINDBMS_OUTPUT.PUT_LINE('Inside p');RETURN;DBMS_OUTPUT.PUT_LINE('Unreachable statement.');END;
BEGINp;DBMS_OUTPUT.PUT_LINE('Control returns here.');
END;
/
-- Result
Inside p
Control returns here.PL/SQL procedure successfully completed.
6.7 形式参数和实际参数

Formal Parameters and Actual Parameters

DECLAREemp_num NUMBER(6) := 120;bonus   NUMBER(6) := 100;merit   NUMBER(4) := 50;PROCEDURE raise_salary (emp_id NUMBER,  -- formal parameteramount NUMBER   -- formal parameter) ISBEGINUPDATE employeesSET salary = salary + amount  -- reference to formal parameterWHERE employee_id = emp_id;   -- reference to formal parameterEND raise_salary;BEGINraise_salary(emp_num, bonus);          -- actual parameters/* raise_salary runs this statement:UPDATE employeesSET salary = salary + 100WHERE employee_id = 120;       */raise_salary(emp_num, merit + bonus);  -- actual parameters/* raise_salary runs this statement:UPDATE employeesSET salary = salary + 150WHERE employee_id = 120;       */
END;
/
6.8 实际参数和返回值仅继承子类型的范围

Actual Parameter and Return Value Inherit Only Range From Subtype

DECLAREFUNCTION test (p INTEGER) RETURN INTEGER ISBEGINDBMS_OUTPUT.PUT_LINE('p = ' || p);RETURN p;END test;BEGINDBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));
END;
/
-- Result
p = .66
test(p) = .66PL/SQL procedure successfully completed.
6.9 函数隐式地将形式参数转换为受约束的子类型

Function Implicitly Converts Formal Parameter to Constrained Subtype

DECLAREFUNCTION test (p NUMBER) RETURN NUMBER ISq INTEGER := p;  -- Implicitly converts p to INTEGERBEGINDBMS_OUTPUT.PUT_LINE('p = ' || q);  -- Display q, not pRETURN q;                           -- Return q, not pEND test;BEGINDBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));
END;
/
-- Result
p = 1
test(p) = 1PL/SQL procedure successfully completed.

七、总结

Oracle Subprogram是Oracle数据库中强大的编程结构,它们通过封装复杂的业务逻辑、提高代码重用性和维护性,在数据库应用程序开发中发挥着重要作用。

相关文章:

Oracle Subprogram即Oracle子程序

Oracle Subprogram,即Oracle子程序,是Oracle数据库中存储的过程(Procedures)和函数(Functions)的统称。这些子程序是存储在数据库中的PL/SQL代码块,用于执行特定的任务或操作。下面详细介绍Orac…...

自然语言处理实战项目30-基于RoBERTa模型的高精度的评论文本分类实战,详细代码复现可直接运行

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目30-基于RoBERTa模型的高精度的评论文本分类实战,详细代码复现可直接运行。RoBERTa模型是由 Facebook AI Research 和 FAIR 的研究人员提出的一种改进版的 BERT 模型。RoBERTa 通过采用更大的训练数据集、动态掩码机…...

RK3588J正式发布Ubuntu桌面系统,丝滑又便捷!

本文主要介绍瑞芯微RK3588J的Ubuntu系统桌面演示,开发环境如下: U-Boot:U-Boot-2017.09 Kernel:Linux-5.10.160 Ubuntu:Ubuntu20.04.6 LinuxSDK: rk3588-linux5.10-sdk-[版本号] (基于rk3…...

基于GPT-SoVITS的API实现批量克隆声音

目标是将每一段声音通过GPT-SoVITS的API的API进行克隆,因为拼在一起的整个片段处理会造成内存或者缓存溢出。 将目录下的音频文件生成到指定目录下,然后再进行拼接。 通过AI工具箱生成的数据文件是这样的结构,temp目录下是没个片段生成的部分,connect_是正常拼接的音频文件…...

详解华为项目管理,附华为高级项目管理内训材料

(一)华为在项目管理中通过有效的沟通、灵活的组织结构、坚持不懈的努力、细致的管理和科学的考核体系,实现了持续的创新和发展。通过引进先进的管理模式,强调以客户需求为导向,华为不仅优化了技术管理和项目研发流程&a…...

Perl(Practical Extraction and Reporting Language)脚本

Perl(Practical Extraction and Reporting Language)是一种非常灵活的脚本语言,主要用于文本处理、系统管理以及快速原型开发等领域。Perl 脚本可以用来执行一系列任务,包括文件操作、网络通信、数据处理等。 下面是一些关于编写…...

单例模式详细

文章目录 单例模式介绍八种方式1、饿汉式(静态常量)2、饿汉式(静态代码块)3、懒汉式(线程不安全)4、懒汉式(线程安全,同步方法)5、懒汉式(线程不安全&#xf…...

Unity3D 自定义窗口

Unity3D 自定义窗口的实现。 自定义窗口 Unity3D 可以通过编写代码,扩展编辑器的菜单栏和窗口。 简单的功能可以直接一个菜单按钮实现,复杂的功能就需要绘制一个窗口展示更多的信息。 编辑器扩展的脚本,需要放在 Editor 文件夹中。 菜单栏…...

dubbo:dubbo整合nacos实现服务注册中心、配置中心(二)

文章目录 0. 引言1. nacos简介及安装2. 注册中心实现3. 配置中心实现4. 源码5. 总结 0. 引言 之前我们讲解的是dubbozookeeper体系来实现微服务框架,但相对zookeeper很多企业在使用nacos, 并且nacos和dubbo都是阿里出品,所以具备一些天生的契合性&#…...

个人博客指路

Pudding 个人博客 比较懒,直接 github page 了,没国内代理加速。 欢迎大佬们,踩一踩 没做留言,觉得很鸡肋。有问题可以在本文底下评论、或者直接邮件...

【STM32 HAL】多串口printf重定向

【STM32 HAL】多串口printf重定向 前言单串口printf重定向原理实现CubeMX配置Keil5配置 多串口printf重定向 前言 在近期项目中,作者需要 STM32 同时向上位机和手机发送数据,传统的 printf 重定向只能输出到一个串口。本文介绍如何实现 printf 同时输出…...

帆软报表,达梦数据库驱动上传失败

1、按照正常操作新建数据库连接,上传准备好的达梦驱动时,提示如图一需要修改SystemConfig.driverUpload为true才可以。 2、FineDB存储了数据决策系统中除平台属性配置以外的所有信息。详情请参见: FineDB 数据库简介。 3、因此管理员可通过…...

CSS选择器的优先级是如何确定的?有哪些方法可以提高选择器的效率?

CSS选择器的优先级是如何确定的? CSS选择器的优先级决定了当多个选择器同时应用于一个元素时,哪个选择器将最终生效。CSS选择器的优先级由多个因素决定,主要包括以下几个方面: 特殊性(Specificity) 特殊性…...

【MySQL】基础入门(第二篇)

1.MySQL基本数据类型 数值类型 MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。 关键字INT是INTEGER的同义词,关键字DEC是D…...

勇闯机器学习(第二关-数据集使用)

以下内容,皆为原创,重在无私分享高质量知识,制作实属不易,请点点关注。 好戏开场了~~~(这关涉及到了加载数据集的代码,下一关,教你们安装机器学习库) 一.数据集 这一关的目标 知道数据集被分为训练集和测…...

数据库学习(进阶)

数据库学习(进阶) Mysql结构:连接层:服务层(核心层):存储引擎层:系统文件层: 存储引擎(概述):存储引擎特点:InnoDB存储引擎:(为并发条…...

redis的数据结构——跳表(Skiplist)

跳表(Skiplist)是一种用于有序数据存储的高效数据结构,它在Redis中用于实现有序集合(Sorted Set,zset)的底层存储。当有序集合中的数据较多时,Redis会选择使用跳表来存储元素,以便在保持数据有序的同时提供高效的插入、删除、查找操作。 跳表的基本结构 跳表是一种多…...

Docker服务迁移

1 备份当前服务器上的 Docker 数据 1.1 停止 Docker 服务 为了确保数据一致性,在备份之前先停止 Docker 服务: sudo systemctl stop docker1.2 备份 Docker 数据 Docker 的数据通常位于 /var/lib/docker 目录。你可以使用 tar 命令将该目录压缩成一个…...

机器学习:逻辑回归实现下采样和过采样

1、概述 逻辑回归本身是一种分类算法,它并不涉及下采样或过采样操作。然而,在处理不平衡数据集时,这些技术经常被用来改善模型的性能。下采样和过采样是两种常用的处理不平衡数据集的方法。 2、下采样 1、概念 下采样是通过减少数量较多的类…...

React原理之Fiber双缓冲

前置文章: React原理之 React 整体架构解读React原理之整体渲染流程React原理之Fiber详解 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 😊----- 在前面的文章中,简单介绍了 Fiber 架构,也了解了 Fiber 节点的…...

机器学习笔记三-检测异常值

检测异常值是数据预处理中非常重要的一步,因为异常值可能会影响模型的训练效果,甚至导致错误的结论。以下是几种常见的检测异常值的方法: 1. 箱线图(Box Plot): 箱线图是一种简单的统计图形,可…...

如何评估Redis的性能

导语 Redis是一款高性能的内存数据库,被广泛用于缓存、持久化、消息队列等各种场景。为了确保Redis的高性能运行,评估Redis的性能是非常重要的。本文将介绍如何评估Redis的性能,并从问题解决的角度探讨如何优化Redis的性能。 1. 性能评估指…...

RabbitMQ发布订阅模式Publish/Subscribe详解

订阅模式Publish/Subscribe 基于API的方式1.使用AmqpAdmin定制消息发送组件2.消息发送者发送消息3.消息消费者接收消息 基于配置类的方式基于注解的方式总结 SpringBoot整合RabbitMQ中间件实现消息服务,主要围绕3个部分的工作进行展开:定制中间件、消息发…...

Android8.1源码下对APK进行系统签名

在Android8.1上面对APK进行Android系统源码环境下的签名,发现签名时出现如下错误: Exception in thread "main" java.lang.ExceptionInInitializerError at org.conscrypt.OpenSSLBIOInputStream.(OpenSSLBIOInputStream. at org.conscrypt.OpenSSLX509Certificat…...

2024年城市客运安全员考试题库及答案

一、单选题 376.根据《机动车运行安全技术条件》(GB7258---2017),每个应急出口应在其附近设有"应急出口"字样,字体高度应大于或等于()mm。 A.20 B.30 C.40 D.50 答案:C 377.根…...

全网最全面的Nginx内容(理论与实践相结合)

一、Web服​​务 1.1 web服务访问流程 1.2 Web服务 1.2.1 Web服务器分类 Web服务分为Apache和Nginx 1.2.2 Apache经典的Web服务器 1.2.2.1 Apache介绍 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以…...

(七)Flink Watermark

Flink 的 Watermark 是用来标识数据流中的一个时间点。Watermark 的设计是为了解决乱序数据处理的问题,尤其是涉及到多个分区的 Kafka 消费者时。在 Watermark 的作用下,即使某些数据出现了延迟到达的情况,也不会导致整个处理流程的中断。此外,Watermark 还能防止过期的数据…...

springboot 上传文件失败:The temporary upload location

Caused by: java.io.IOException: The temporary upload location [/tmp/tomcat.379776875189163783.8081/work/Tomcat/localhost/jcys-core] is not valid 原因: Linux下会自动清除tmp目录下10天没有使用过的文件,SpringBoot启动的时候会在/tmp目录下生…...

UNiapp之微信小程序导出Excel

效果如下 参考小程序:日常记一记 ---账单页面 主要功能是根据筛选条件导出账单明细列表,实现该功能主要借助一个工具(excel.js),可在文章顶部下载或者一下网盘下载 https://pan.baidu.com/s/1RLisuG4_7FGD0Cnwewyabg?pwdpd2a 提取码: pd2a…...

fsadsadsad

adsadsafsada...

这样做网站/百度建站

Ruby中的字符串处理非常灵活"abc"[0] 返回97 就是a"abc"[1] 98"abc"[2] 99"abc"[3] nil"abc"[-1] 99 从后向前数"abc"[-2] 98"abc"[-3] 97"abc"[-4] nil"abc" * 2 返回"abca…...

做女装的网站/怎么进行网络推广

[Mnsx_x]刷题笔记——顶端迭代器 请你设计一个迭代器,除了支持 hasNext 和 next 操作外,还支持 peek 操作。 实现 PeekingIterator 类: PeekingIterator(int[] nums) 使用指定整数数组 nums 初始化迭代器。 int next() 返回数组中的下一个元素…...

重庆网站优化指导/成都网站快速优化排名

Windows消息被广泛用于各种事件的通知上面,如果你想操作窗口或者控件(UI元素其实也是一种窗口,如:按钮,编辑框,工具栏,树形控件等)的话,给它发送消息即可。消息也可以来至于其他应用程序。你也可以通过消息来实现系统通知,移动鼠标,按下键盘上的某键等操作。 正如我们前面所讨…...

建设工程资料网站/网站seo优化免费

可参考: https://www.zhihu.com/question/28592239 杨立华老师是本科期间最喜欢也是最敬佩的老师之一了。除了楼上说的长得帅、讲课好之外,最喜欢的就是杨立华老师的气质了。 杨立华老师身上有一种气质,有一种看透本质的目光和洞见&#xf…...

建一个电商网站多少钱/廊坊网站推广公司

kafkastormhbase整合:kafka作为分布式消息系统,实时消息系统,有生产者和消费者;storm作为大数据的实时处理系统;hbase是apache hadoop 的数据库,其具有高效的读写性能! 这里把kafka生产的数据作为storm的源…...

清远专业网站建设/一个新品牌怎样营销推广

我经常听到年轻人有这样的抱怨:“不满意自己现在的状态,迷茫、焦虑,怕被淘汰却又不知道该学点什么...”我特别能理解这种无力感:日常琐碎的工作,让年轻人没时间成长,偶尔抽出时间,也是在进行碎片…...