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

滚雪球学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的高级控制结构,从而编写更灵活、健壮的程序逻辑。

相关文章:

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

全文目录: 前言一、PL/SQL基础语法1.1 变量声明变量声明示例: 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表(嵌套表)嵌套表的定义与使用 3.2 关联数组关联数组…...

springboot系列--web相关知识探索二

一、映射 指的是与请求处理方法关联的URL路径,通过在Spring MVC的控制器类(使用RestController注解修饰的类)上使用注解(如 RequestMapping、GetMapping)来指定请求映射路径,可以将不同的HTTP请求映射到相应…...

Oracle 12c在Windows环境下安装

适合初学者使用的Oracle 12c在Windows环境下安装步骤、参数配置、常见问题及参数调优的详细补充说明。 一、Oracle 12c安装步骤 1. 准备工作 在安装Oracle 12c之前,确保你的系统满足以下要求: 操作系统:Oracle 12c支持的Windows版本包括Wi…...

Stable Diffusion绘画 | 来训练属于自己的模型:打标处理与优化

上一篇完成的打标工作,是为了获取提示词,让AI认识和学习图片的特征。 因此,合适、恰当、无误的提示词,对最终模型效果是相当重要的。 Tag 如何优化 通过软件自动生成的 Tag 只是起到快速建立大体架构的作用,里面会涉…...

【论文笔记】Visual Instruction Tuning

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Instruction Tunin…...

ubuntu 设置静态IP

一、 ip addresssudo nano /etc/netplan/50-cloud-init.yaml 修改前: 修改后: # This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-inits # ne…...

Java 每日一刊(第19期):泛型

文章目录 前言1. 泛型概述1.1 不使用泛型 vs 使用泛型1.2 泛型的作用 2. 泛型的基本语法2.1 定义带类型参数的泛型类2.2 使用泛型类2.3 泛型方法 3. 泛型类型推断与钻石操作符3.1 类型推断3.2 钻石操作符 4. 通配符的使用4.1 无界通配符 <?>4.2 上界通配符 <? exten…...

windows下安装rabbitMQ并开通管理界面和允许远程访问

如题&#xff0c;在windows下安装一个rabbitMQ server&#xff1b;然后用浏览器访问其管理界面&#xff1b;由于rabbitMQ的默认账号guest默认只能本机访问&#xff0c;因此需要设置允许其他机器远程访问。这跟mysql的思路很像&#xff0c;默认只能本地访问&#xff0c;要远程访…...

深度剖析音频剪辑免费工具的特色与优势

是热爱生活的伙伴或者想要记录美好声音的普通用户&#xff0c;都可能会需要对音频进行剪辑处理。而幸运的是&#xff0c;现在有许多优秀的音频剪辑软件提供了免费版本&#xff0c;让我们能够轻松地施展音频剪辑的魔法。接下来&#xff0c;就让我们一同深入了解这些音频剪辑免费…...

Oracle中TRUNC()函数详解

文章目录 前言一、TRUNC函数的语法二、主要用途三、测试用例总结 前言 在Oracle中&#xff0c;TRUNC函数用于截取或截断日期、时间或数值表达式的部分。它返回一个日期、时间或数值的截断版本&#xff0c;根据提供的格式进行截取。 一、TRUNC函数的语法 TRUNC(date) TRUNC(d…...

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域&#xff0c;Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸&#xff0c;为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程&#xff0c;让开发者能够专注于业务逻辑的实现。无论是构建小型的…...

PPT 快捷键使用、技巧

前言&#xff1a; 本文操作是以office 2021为基础的&#xff0c;仅供参考&#xff1b;不同版本office 的 ppt 快捷键 以及对应功能会有差异&#xff0c;需要实践出真知。 shift 移动 水平/垂直 移动 &#xff1b; shift 放大/缩小 等比例放大 缩小 &#xff1b; 正圆 正…...

Web安全 - 文件上传漏洞(File Upload Vulnerability)

文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…...

vue3中el-input在form表单按下回车刷新页面

摘要&#xff1a; 在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面&#xff01; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 &#xff0c;并设置style“display:none” <ElInput style"display…...

SQL Server中关于个性化需求批量删除表的做法

在实际开发中&#xff0c;我们常常会遇到需要批量删除表&#xff0c;且具有共同特征的情况&#xff0c;例如&#xff1a;找出表名中数字结尾的表之类的&#xff0c;本文我将以3中类似情况为例&#xff0c;来示范并解说此类需求如何完成&#xff1a; 第一种&#xff0c;批量删除…...

关于按键状态机解决Delay给程序带来的问题

问题产生 我在学习中断的过程中&#xff0c;使用EXTI15外部中断&#xff0c;在其中加入HAL_Delay();就会发生报错 错误地方 其它地方配置 问题原因 在中断服务例程&#xff08;ISR&#xff09;中使用 HAL_Delay() 会导致问题的原因是&#xff1a; 阻塞性&#xff1a; HAL_D…...

62.【C语言】浮点数的存储

目录 1.浮点数的类型 2.浮点数表示的范围 3.浮点数的特性 《计算机科学导论》的叙述 4.浮点数在内存中的存储 答案速查 分析 前置知识:浮点数的存储规则 推导单精度浮点数5.5在内存中的存储 验证 浮点数取出的分析 1.一般情况:E不全为0或不全为1 2.特殊情况:E全为0…...

GO网络编程(一):基础知识

1. 网络编程的基础概念 TCP/IP 协议栈 TCP/IP 是互联网通信的核心协议栈&#xff0c;分为以下四个层次&#xff1a; 应用层&#xff08;Application Layer&#xff09;&#xff1a;为应用程序提供网络服务的协议&#xff0c;比如 HTTP、FTP、SMTP 等。传输层&#xff08;Tra…...

【Linux】用虚拟机配置Ubuntu环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…...

Gitのrebase用法

在 Git 中&#xff0c;rebase 是一种用于整合多个提交历史的操作&#xff0c;它可以将一个分支的变更“重放”到另一个分支上。与 merge 不同&#xff0c;rebase 会产生一个线性的提交历史&#xff0c;使得项目的历史记录更加整洁和易于理解。 1. 什么是 Rebase&#xff1f; …...

二分查找一>:在排序数组中查找元素的第一个和最后一个位置

1.题目&#xff1a; 2.解析:这里不能用传统二分&#xff0c;因为涉及范围&#xff0c;传统二分时间复杂度会降为O(N)&#xff0c;要做些改动。 步骤一&#xff1a;查找区间左端点 细节图&#xff1a; 步骤二&#xff1a;查找区间右端点&#xff1a; 细节图&#xff1a; 代码…...

undeclared identifier ‘UNITY_PREV_MATRIX_M‘ - Unity Shader自己写URP,引用内部 hlsl

碰到这样的问题&#xff0c;居然非常淡定 这个链接里说了问题&#xff1a; 一个哥们A问&#xff0c;为什么include urp common.hlsl 提示莫名其妙 另一个哥们B说&#xff0c;这个issue 说了&#xff0c;可能是这个原因&#xff08;也没正面答&#xff09; 从issue我们知道&a…...

信息安全工程师(29)存储介质安全分析与防护

前言 存储介质安全分析与防护是确保数据安全与完整性的重要环节。存储介质&#xff0c;如硬盘、U盘、SD卡等&#xff0c;作为数据的载体&#xff0c;其安全性直接关系到数据的安全。 一、存储介质安全分析 1. 数据泄露风险 格式化不彻底&#xff1a;传统的格式化操作往往只能删…...

Html5知识点介绍

HTML5 是 HTML 的最新版本&#xff0c;它引入了许多新特性和元素来增强 Web 开发的能力和灵活性。以下是一些关键的 HTML5 知识点&#xff1a; 1. 语义化标签 HTML5 增加了许多新的语义化标签&#xff0c;用来更好地定义页面结构和内容&#xff0c;这些标签使代码更加清晰易读&…...

探索机器学习中的特征选择技术

在机器学习和数据科学领域&#xff0c;特征选择是一个关键步骤&#xff0c;它不仅有助于提高模型的性能&#xff0c;还能帮助我们更好地理解数据。本文将深入探讨特征选择的重要性、常见方法以及如何在实际项目中应用这些技术。 一、特征选择的重要性 降低维度&#xff1a;减…...

数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块

9月24日&#xff0c;2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上&#xff0c;中国信通院发布了2024年《高质量数字化转型产品及服务全景图&#xff08;上半年度&#xff09;》和《高质量数字化转型技术解决方案&#xff08;上半年度&#xff09;》等多项…...

什么是分布式数据库

分布式数据库&#xff08;Distributed Database&#xff09;是一种数据库系统&#xff0c;它的数据被存储在不同的物理位置&#xff0c;但对用户来说表现得就像一个单一的、统一的数据库。这种系统由多个自治的数据库站点组成&#xff0c;这些站点通过网络相互连接&#xff0c;…...

从u盘直接删除的文件能找回吗 U盘文件误删除如何恢复

U盘上的文件被删除并不意味着它们立即消失。事实上&#xff0c;删除操作只是将文件从文件系统的目录中移除&#xff0c;并标记可用空间。这意味着在文件被覆盖之前&#xff0c;它们仍然存在于存储介质上。因此&#xff0c;只要文件没有被新的数据覆盖&#xff0c;我们就有机会恢…...

如何使用ssm实现基于HTML的中国传统面食介绍网站的搭建+vue

TOC ssm758基于HTML的中国传统面食介绍网站的搭建vue 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔…...

全球最大的平面设计网站/深圳优化公司找高粱seo服务

在项目中使用MyBatisPlus中的or()查询时由于误用&#xff0c;导致查询数据不对&#xff0c;仅作记录。写法一&#xff1a;LambdaQueryWrapper queryWrapper new QueryWrapper().lambda();queryWrapper.eq(Task::getUserId, "15").eq(Task::getStatus, 2).or().eq(Ta…...

网站开发团队需要哪些人/源云推广

单片机数字滤波算法 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档…...

免费注册企业网站/百度网址输入

、修改Tomcat的conf的server.xml文件加上 URIEncoding"UTF-8" 二、在tomcat的bin 目录下的catalina.bat 配置文件中&#xff0c;添加以下设置 set "JAVA_OPTS%JAVA_OPTS% %JSSE_OPTS% -Dfile.encodingUTF-8" 三、控制台打印出现乱码。cmd输入regedit 进…...

怎么跟网站建设公司谈/seo修改器

1、问题描述&#xff1a; 今天项目运行时&#xff0c;突然报如下错误&#xff1a; Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 我的第一反应是jedis的连接池中没有可用连接了&#xff0c;直接把连接池je…...

套模版做网站/站长之家素材

学校C语言课设 文章目录Calculate.hCalculate.cppCalculate.h #pragma once#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node* LIST;struct Date//每个数字的系数和指数 {int c;//系数i…...

zblog和wordpress哪个好/营销模式

The man who has never made a mistake will never make else. 从不犯错的人将一事无成。 原文载于&#xff1a;爱词霸英语学习网-每日一句...