滚雪球学Oracle[4.2讲]:PL/SQL基础语法

全文目录:

    • 前言
    • 一、PL/SQL基础语法
      • 1.1 变量声明
        • 变量声明示例:
    • 二、记录类型与集合类型的使用
      • 2.1 记录类型
        • 记录类型的定义与使用
      • 2.2 集合类型
    • 三、PL/SQL表与关联数组
      • 3.1 PL/SQL表(嵌套表)
        • 嵌套表的定义与使用
      • 3.2 关联数组
        • 关联数组的定义与使用
    • 四、集合操作:BULK COLLECT与FORALL
      • 4.1 BULK COLLECT
        • 使用BULK COLLECT的示例
      • 4.2 FORALL
        • 使用FORALL的示例
    • 五、总结与下期预告

前言

在上一篇文章【PL/SQL简介与环境设置】中,我们介绍了PL/SQL语言的基本概念及其运行环境的配置。PL/SQL(Procedural Language for SQL)是Oracle数据库的扩展语言,通过将过程化编程引入SQL,开发人员可以创建更加灵活和复杂的数据库操作程序。PL/SQL为处理复杂的业务逻辑提供了强大的工具,但在编写高效代码时,理解其基本语法和数据结构至关重要。

本期内容将详细探讨PL/SQL的基础语法,并深入解析记录类型与集合类型的使用。此外,介绍PL/SQL表和关联数组,展示如何使用BULK COLLECTFORALL进行批量数据处理,从而提升数据操作的效率。

在文章的结尾,我们将对下期内容【控制结构与循环】进行预告,继续学习PL/SQL中用于流程控制的结构化语法。

一、PL/SQL基础语法

PL/SQL是Oracle数据库独有的过程式语言,它的基本语法结构类似于其他编程语言,包含变量声明、控制语句、循环、异常处理等。PL/SQL块的基本结构如下:

DECLARE-- 声明部分(可选)v_employee_name VARCHAR2(100);
BEGIN-- 执行部分SELECT first_name INTO v_employee_name FROM employees WHERE employee_id = 100;DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
EXCEPTION-- 异常处理部分(可选)WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('No employee found.');
END;

在此代码块中,DECLARE部分用于声明变量,BEGIN...END构成了主执行逻辑,而EXCEPTION部分处理可能发生的异常。

1.1 变量声明

PL/SQL允许使用各种数据类型声明变量。常见的数据类型包括:

  • NUMBER:用于表示整数和浮点数。
  • VARCHAR2:表示变长字符串。
  • DATE:表示日期和时间。
变量声明示例:
DECLAREv_emp_id NUMBER(6);v_emp_name VARCHAR2(100);v_hire_date DATE;
BEGIN-- 在这里可以使用这些变量
END;

变量必须在使用之前声明,并且每个变量都需要指定其数据类型。PL/SQL支持从表中获取数据并赋值给变量,如通过SELECT INTO语句。


二、记录类型与集合类型的使用

2.1 记录类型

记录类型(Record Type)是PL/SQL中用于存储一组不同类型数据的结构,类似于C语言中的结构体或其他编程语言中的对象。记录类型允许将表中的一行或多个列组合到一个变量中,便于操作多列数据。

记录类型的定义与使用

PL/SQL允许开发者自定义记录类型或基于表行定义记录类型:

  • 自定义记录类型

    DECLARETYPE employee_record IS RECORD (emp_id employees.employee_id%TYPE,emp_name employees.first_name%TYPE,hire_date employees.hire_date%TYPE);v_emp_rec employee_record;
    BEGIN-- 使用记录类型获取一行数据SELECT employee_id, first_name, hire_dateINTO v_emp_rec.emp_id, v_emp_rec.emp_name, v_emp_rec.hire_dateFROM employeesWHERE employee_id = 100;DBMS_OUTPUT.PUT_LINE('Employee: ' || v_emp_rec.emp_name);
    END;
    

    在此示例中,employee_record是一个自定义记录类型,存储了员工的employee_idfirst_namehire_date,并通过SELECT INTO语句将数据存入记录。

  • 基于表行的记录类型
    PL/SQL允许基于某个表的行定义记录类型,简化记录的声明:

    DECLAREv_emp_rec employees%ROWTYPE;
    BEGINSELECT * INTO v_emp_rec FROM employees WHERE employee_id = 100;DBMS_OUTPUT.PUT_LINE('Employee: ' || v_emp_rec.first_name);
    END;
    

    在此示例中,v_emp_rec使用了employees%ROWTYPE,它自动匹配employees表中的列,使操作更简洁。

2.2 集合类型

集合是PL/SQL中用于存储同类型数据的结构。PL/SQL支持三种主要的集合类型:

  1. 嵌套表(Nested Table):类似于动态数组,可以存储无序的元素,且可以动态扩展。
  2. VARRAY(变长数组):具有固定大小的数组,元素是有序的。
  3. 关联数组(索引表):键值对结构,用作稀疏数组。

三、PL/SQL表与关联数组

3.1 PL/SQL表(嵌套表)

PL/SQL表(嵌套表)是一种灵活的集合类型,可以存储一组相同类型的数据。在PL/SQL中,可以使用嵌套表来处理多个数据值,尤其是在批量处理时非常有用。

嵌套表的定义与使用
DECLARETYPE num_table IS TABLE OF NUMBER;v_numbers num_table := num_table(100, 200, 300);
BEGIN-- 访问嵌套表中的元素FOR i IN v_numbers.FIRST .. v_numbers.LAST LOOPDBMS_OUTPUT.PUT_LINE('Number: ' || v_numbers(i));END LOOP;
END;

在此示例中,定义了一个num_table类型的嵌套表,并将一些数字值存储在其中。通过FOR循环可以遍历集合中的所有元素。

3.2 关联数组

关联数组(Index-by Table)是键值对类型的集合。它使用数字或字符串作为索引,通过索引可以访问数组中的元素。

关联数组的定义与使用
DECLARETYPE emp_salary_table IS TABLE OF NUMBER INDEX BY PLS_INTEGER;v_salaries emp_salary_table;
BEGIN-- 为关联数组赋值v_salaries(1001) := 5000;v_salaries(1002) := 6000;-- 访问关联数组中的值DBMS_OUTPUT.PUT_LINE('Salary of emp 1001: ' || v_salaries(1001));
END;

在此例子中,定义了一个关联数组emp_salary_table,并通过索引来存储和访问员工的薪资数据。关联数组非常适合需要根据键值快速查找数据的场景。


四、集合操作:BULK COLLECT与FORALL

4.1 BULK COLLECT

在PL/SQL中,BULK COLLECT用于将查询结果批量加载到集合中,从而减少SQL与PL/SQL之间的切换次数。这种方法非常适合大数据量的查询,能够显著提高性能。

使用BULK COLLECT的示例
DECLARETYPE num_table IS TABLE OF NUMBER;v_emp_ids num_table;
BEGIN-- 使用BULK COLLECT将查询结果加载到集合中SELECT employee_id BULK COLLECT INTO v_emp_ids FROM employees WHERE department_id = 10;-- 遍历集合并输出结果FOR i IN v_emp_ids.FIRST .. v_emp_ids.LAST LOOPDBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp_ids(i));END LOOP;
END;

在此示例中,BULK COLLECT用于将员工ID批量加载到v_emp_ids集合中,从而减少逐条查询的开销。

4.2 FORALL

FORALL是一种PL/SQL的控制结构,用于批量执行INSERTUPDATEDELETE语句。与常规的FOR循环相比,FORALL可以显著提高批量DML操作的性能。

使用FORALL的示例
DECLARETYPE num_table IS TABLE OF NUMBER;v_emp_ids num_table := num_table(1001, 1002, 1003);
BEGIN-- 使用FORALL进行批量更新FORALL i IN v_emp_ids.FIRST .. v_emp_ids.LASTUPDATE employees SET salary = salary * 1.1 WHERE employee_id = v_emp_ids(i);DBMS_OUTPUT.PUT_LINE('Salaries updated.');
END;

在此示例中,FORALL用于批量更新多个员工的薪资,与逐行处理相比,FORALL的执行速度大大提高。


五、总结与下期预告

本期文章详细介绍了PL/SQL中的

基础语法,并深入探讨了记录类型集合类型的使用。我们学习了如何使用PL/SQL表与关联数组来处理批量数据操作,并通过BULK COLLECTFORALL实现了高效的数据处理。掌握这些技术对于提升PL/SQL代码的性能至关重要,尤其是在处理大量数据时。

在下一期内容中,我们将探讨PL/SQL中的控制结构与循环,继续深入学习PL/SQL的高级控制结构,从而编写更灵活、健壮的程序逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单,但也有一些插件安装会比较难。比如我在安装SadTalker时,就遇到很多问题,一度放弃了,后来查了一些网上攻略,自己也反复查看日志,终于解决,不吐不快。 一、在Stable …

闪迪U盘误删的数据该怎么恢复呢?3个方法轻松解决

闪迪是一家全球知名的美国公司,也是全球最大的闪存数据存储卡产品供应商,其中,闪迪U盘作为其主要产品之一,因其便携性、大容量和高速传输能力而深受用户喜爱。然而,在平时存储重要数据的时候,会因为我们一系…

ElasticSearch备考 -- Update by query Reindex

一、题目 有个索引task,里面的文档长这样 现在需要添加一个字段all,这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起,组成一个新的字段,这个就需要脚本, 这里有两种方案&#xff…

CSRF | GET 型 CSRF 漏洞攻击

关注这个漏洞的其他相关笔记:CSRF 漏洞 - 学习手册-CSDN博客 0x01:GET 型 CSRF 漏洞攻击 —— 理论篇 GET 型 CSRF 漏洞是指攻击者通过构造恶意的 HTTP GET 请求,利用用户的登录状态,在用户不知情的情况下,诱使浏览器…

Elasticsearch(二)集成Spring Boot 基本的API操作

目录 一、集成Spring Boot 1、创建项目 2、pom文件 查看springboot集成的依赖 3、增加es的config类 二、索引相关API 1、创建索引 2、获取索引,判断其是否存在 3、删除索引 三、文档相关API 1、添加文档 2、获取文档,判断是否存在 3、获取文档…

【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet(Residual Network)是一种深度神经网络架构,由微软研究院的Kaiming He等人在2015年提出,并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题,即当网络…

vulnhub-digitalworld.local DEVELOPMENT靶机

vulnhub:digitalworld.local: DEVELOPMENT ~ VulnHub 导入靶机,放在kali同网段,扫描 靶机在192.168.114.129,扫描端口 开了几个端口,8080端口有网页,访问 说是让访问html_pages 似乎把页面都写出来了&…

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…

JavaEE之多线程进阶-面试问题

一.常见的锁策略 锁策略不是指某一个具体的锁&#xff0c;所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高&#xff0c;悲观锁为预测锁冲突的概率较高&#xff0c;乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…

ssm教师办公管理系统的设计与实现+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 JSP技…

大模型存储选型 JuiceFS 在关键环节性能详解

从去年开始&#xff0c;LLM大语言模型领域发展迅速、如 LLaMA、ChatGLM、Baichuan、Qwen 和 yi-model 等基础模型&#xff08;Foundation Models&#xff09;的数量显著增加。众多企业也开始基于这些基础模型做 post-training 的相关工作&#xff0c;以开发特定垂直领域的模型实…

一键生成二维码的源码系统 电脑+手机版自适应代码 带完整的安装代码包以及搭建部署教程

系统概述 一键生成二维码的源码系统是一款集二维码生成、管理和应用于一体的综合性平台。它采用先进的技术和算法&#xff0c;能够快速、准确地生成各种类型的二维码&#xff0c;包括文本、链接、图片等。同时&#xff0c;该系统还具备高度的灵活性和可扩展性&#xff0c;能够…

基于matlab变频器控制交流电机调速系统的设计与仿真(毕业论文)

目录 摘要 I ABSTRACT II 绪论 1 1交流调速技术发展概况 2 1.1电力电子器件 3 1.2变流技术 3 1.3变频调速的控制方式 4 1.4MATLAB/Simulink仿真介绍 4 2逆变电路的建模与仿真 5 2.1绝缘栅双极型晶体管 6 2.2三相桥式逆变电路的基本原理 6 2.3正弦脉冲宽度调制&#xff08;SPWM&…

六西格玛设计DFSS方法论在消费级无人机设计中的应用——张驰咨询

本文基于六西格玛设计方法论&#xff0c;对消费级无人机的设计流程进行系统化研究&#xff0c;探讨如何通过六西格玛设计的理念、工具和方法提升无人机产品的设计质量和市场竞争力。文章从市场定位、客户需求分析出发&#xff0c;深入到关键KPI指标的制定&#xff0c;并逐步阐述…

【数字孪生智慧园区物联网平台建设】智慧园区整体解决方案和集成方案(PPT+Word+实现)

数字孪生智慧园区物联网平台建设 1. 安防监控 2. 消防系统 3. 巡更系统 4. 红外线系统 5. 车辆识别 6. 人流管理 7. 消防机房 8. 能耗管理 9. 配电室 10. 智能集成 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&…

【华为HCIP实战课程十】OSPF网络DR和BDR实战讲解,网络工程师

一、DR与BDR的基础介绍 点到点同步LSA成本小 多点接入网络同步LSA成本大,需要DR/BDR 由于MA网络中,任意两台路由器都需要传递路由信息,网络中有n台路由器,则需要建立n*(n-1)/2个邻接关系。任何一台路由器的路由变化都会导致多次传递,浪费了带宽资源,DR和BDR应运而生!…

uibot发送邮件:自动化邮件发送教程详解!

uibot发送邮件的操作指南&#xff1f;uibot发送邮件的两种方式&#xff1f; 在现代办公环境中&#xff0c;自动化流程的引入极大地提高了工作效率。uibot发送邮件功能成为了许多企业和个人实现邮件自动化发送的首选工具。AokSend将详细介绍如何使用uibot发送邮件。 uibot发送…

使用Pytorch写简单线性回归

文章目录 Pytorch一、Pytorch 介绍二、概念三、应用于简单线性回归 1.代码框架2.引用3.继续模型(1)要定义一个模型&#xff0c;需要继承nn.Module&#xff1a;(2)如果函数的参数不具体指定&#xff0c;那么就需要在__init__函数中添加未指定的变量&#xff1a; 2.定义数据3.实例…

IP地址类型选择指南:动态IP、静态IP还是数据中心IP?

你是否曾经困惑于如何选择最适合业务需求的IP地址类型&#xff1f;面对动态IP、静态IP和数据中心IP这三种选择&#xff0c;你是否了解它们各自对你的跨境在线业务可能产生的深远影响&#xff1f; 在跨境电商领域&#xff0c;选择合适的IP类型对于业务的成功至关重要。动态IP、…