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

【PL/SQL】常用操作复习20250212

目录标题

  • 1.基本语法结构
    • 二级目录
      • 三级目录
    • 1.基本语法结构
    • 2。变量声明和使用
    • 3. SELECT 查询
    • 4.插入 insert
      • 5.更新UPDATE
      • 6.删除(DELETE)
    • 7游标 cursor
      • 例子1:基本游标使用
      • 例子2:使用FOR循环的简化写法
      • 实际应用例子:给高工资员工增加奖金
    • 8 IF 条件判断
    • 9 循环语句
    • 10 存储过程
    • 11 函数

1.基本语法结构

二级目录

三级目录

1.基本语法结构

BEGIN
– 执行部分 必须

END;
例:
CopyBEGIN
DBMS_OUTPUT.PUT_LINE(‘Hello World’);
END;

结果:
Hello World

PL/SQL procedure successfully completed.

DECLARE
———声明部分 可选
BEGIN
– 执行部分 必须

EXCEPTION
——异常处理部分(可选)
END;

2。变量声明和使用

DECLARE
–基本变量类型
V_name VARCHAR2(100);-- 字符串类型
V_age NUMBER ;—— 数字类型
V_brithday DATE;—— 日期类型
v_is_valid BOOLEAN; – 布尔类型

——变量声明并赋值
v_sarary NUMBER := 8000;–直接赋值
V_dept_name VARCHAR2(50) DFFAULT ‘技术部’ ;—— 使用DEFAULT赋默认值
BEGIN
—— 变量赋值
V_name : = ‘张三’;
V_age := 25;
V_brithday := TO_DATE(‘1998-01-01’, ‘YYYY-MM-DD’);
v_is_valid := TRUE;

——打印变量
DBMS_OUTPUT.PUT_LINE(‘姓名:’ || v_name);
DBMS_OUTPUT.PUT_LINE(‘ 年龄:’ || V_age);
DBMS_OUTPUT.PUT_LINE(‘ 生日:’|| TO_CHAR(v_birthday,‘YYYY-MM-DD’));

END;

3. SELECT 查询

DECLARE
v_emp_name VERCHAR2(100);
V_emp_salary NUMNER;

BEGIN

– 单个值查询

SELECT first_name,salary
INTO v_emp_name,V_emp_salary – 使用INTO将查询结果存入变量
FROM emloyees
WHERE employee_id =100;

DBMS_OUTPUT.PUT_LINE('员工姓名:'||v_emp_name);
DBMS_OUTPUT.PUT_LINE('员工薪资:'||v_emp_salary);

END;

结果:
员工姓名: Steven
工资: 24000

PL/SQL procedure successfully completed.

4.插入 insert

DECLARE
V_emp_id NUMBER :=301;
BEGIN
– 插入一条新记录
INSERT INTO employees
( employee_id,first_name,last_name,email,hire_date,job_id)
VALUES
(v_emp_id,‘小明’,‘王’,‘xiaoming’,SYSDATE,‘IT_PROG’);

– 提交事物
COMMIT;

DBMS_OUTPUT.PUT_LINE(‘插入成功’);
EXCEPTION
WHEN OTHERS THEN

		-- 发生错误时回滚
ROLLBACK;
DBMS_OUTPUT.PUT_LINE(‘插入失败:’||SQLERRM);

END;

5.更新UPDATE

DECLARE
v_salary_increase。NUMber :=1000;

BEGIN

– 更新满足提哦啊贱的记录
UPDATE employees
SET salary=salary + V_salary_increase
WHERE department_id = 90;

– 输出更新的行数

DBMS_OUTPUT.PUT_LINE('更新了’||SQL%ROWCOUNT||‘条记录’);

COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLB ACK:
DBMS_OUTPUT.PUT_LINE('更新失败’||SQLERRM);

END;

6.删除(DELETE)

DECLARE
V_dept_id NUMBER:=10;
BEGIN
– 删除指定部门的员工
DELETE FROM employees
WHERE department_id = v_dept_id;
DBMS_OUTPUT.PUT_LINE('删除了’||SQL%ROWCOUNT||‘条记录’);

	COMMIT;

EXCEPTION

WHEN OTHERS THEN
ROLLBACK;

DBMS_OUTPUT.PUT_LINE(’删除失败:‘||SQLERROM);

END;

7游标 cursor

例如TBL
EMPLOYEE_ID FIRST_NAME SALARY
100 Steven 24000
101 Neena 17000
102 Lex 17000

例子1:基本游标使用

DECLARE
– 1 定义游标

CURSOR emp_cur IS

SELECT employee_id,first_name,salary
FROM employees
WHERE salary > 15000;

– 2 定义变量接收数据
v_emp_id employees.employee_id%TYPE;
v_name. employees.first_name%TYPE;
v_salary. employees.salary%TYPE;

BEGIN

– 3.打开游标

OPEN emp_cur;
– 4 循环读取数据
LOOP
FETCH emp_cur INTO v_emp_id, v_name, v_salary;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ’ || v_emp_id ||
', 姓名: ’ || v_name ||
', 工资: ’ || v_salary);

END LOOP;

– 5,关闭游标
CLOSE emp_cur;

END;

结果
ID: 100, 姓名: Steven, 工资: 24000
ID: 101, 姓名: Neena, 工资: 17000
ID: 102, 姓名: Lex, 工资: 17000

PL/SQL procedure successfully completed.

例子2:使用FOR循环的简化写法

DECLARE
– 只需定义游标
CURSOR emp_cur IS
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > 15000;
BEGIN
– FOR循环自动处理打开、获取和关闭游标
FOR emp_rec IN emp_cur LOOP
DBMS_OUTPUT.PUT_LINE('ID: ’ || emp_rec.employee_id ||
', 姓名: ’ || emp_rec.first_name ||
', 工资: ’ || emp_rec.salary);
END LOOP;
END;

实际应用例子:给高工资员工增加奖金

DECLARE
CURSOR emp_cur IS
SELECT employee_id, salary
FROM employees
WHERE salary > 15000;

v_bonus NUMBER;

BEGIN
FOR emp_rec IN emp_cur LOOP
– 计算奖金:工资的10%
v_bonus := emp_rec.salary * 0.1;

    -- 更新员工奖金UPDATE employees SET bonus = v_bonusWHERE employee_id = emp_rec.employee_id;DBMS_OUTPUT.PUT_LINE('员工ID ' || emp_rec.employee_id || ' 的奖金更新为: ' || v_bonus);
END LOOP;-- 提交事务
COMMIT;

END;

结果

员工ID 100 的奖金更新为: 2400
员工ID 101 的奖金更新为: 1700
员工ID 102 的奖金更新为: 1700

PL/SQL procedure successfully completed.

游标就像一个指针,指向查询结果集中的当前行:

开始时指向第一行之前
每次FETCH后移动到下一行
直到没有更多数据时停止

8 IF 条件判断

DECLARE
v_salary NUMBER := 5000;
BEGIN
– 基本IF语句
IF v_salary > 3000 THEN
DBMS_OUTPUT.PUT_LINE(‘工资高于3000’);
ELSIF v_salary > 2000 THEN
DBMS_OUTPUT.PUT_LINE(‘工资在2000-3000之间’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘工资低于2000’);
END IF;
END;

9 循环语句

有三种循环方式:

– 1. 基本LOOP
DECLARE
v_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('计数: ’ || v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3; – 退出条件
END LOOP;
END;

– 2. WHILE循环
DECLARE
v_counter NUMBER := 1;
BEGIN
WHILE v_counter <= 3 LOOP
DBMS_OUTPUT.PUT_LINE('计数: ’ || v_counter);
v_counter := v_counter + 1;
END LOOP;
END;

– 3. FOR循环
BEGIN
FOR i IN 1…3 LOOP
DBMS_OUTPUT.PUT_LINE('计数: ’ || i);
END LOOP;
END;

10 存储过程

– 创建存储过程
CREATE OR REPLACE PROCEDURE update_salary(
p_emp_id IN NUMBER, – 输入参数
p_salary_increase IN NUMBER,
p_result OUT VARCHAR2 – 输出参数
)
IS
v_old_salary NUMBER;
BEGIN
– 获取原工资
SELECT salary INTO v_old_salary
FROM employees
WHERE employee_id = p_emp_id;

-- 更新工资
UPDATE employees
SET salary = salary + p_salary_increase
WHERE employee_id = p_emp_id;-- 设置输出结果
p_result := '更新成功!原工资:'||v_old_salary||',新工资:'||(v_old_salary + p_salary_increase);COMMIT;

EXCEPTION
WHEN NO_DATA_FOUND THEN
p_result := ‘未找到员工’;
WHEN OTHERS THEN
p_result := ‘更新失败:’||SQLERRM;
ROLLBACK;
END;

– 调用存储过程
DECLARE
v_result VARCHAR2(200);
BEGIN
update_salary(100, 1000, v_result);
DBMS_OUTPUT.PUT_LINE(v_result);
END;

11 函数

– 创建函数
CREATE OR REPLACE FUNCTION calculate_bonus(
p_salary IN NUMBER,
p_rating IN NUMBER
) RETURN NUMBER
IS
v_bonus NUMBER;
BEGIN
– 根据评级计算奖金
CASE p_rating
WHEN 1 THEN v_bonus := p_salary * 0.2;
WHEN 2 THEN v_bonus := p_salary * 0.15;
WHEN 3 THEN v_bonus := p_salary * 0.1;
ELSE v_bonus := 0;
END CASE;

RETURN v_bonus;

END;

– 调用函数
DECLARE
v_bonus NUMBER;
BEGIN
v_bonus := calculate_bonus(5000, 1);
DBMS_OUTPUT.PUT_LINE('奖金是: ’ || v_bonus);
END;

区别:

存储过程:可以有多个输入输出参数,不返回值
函数:可以有多个输入参数,但只能返回一个值

相关文章:

【PL/SQL】常用操作复习20250212

目录标题 1.基本语法结构二级目录三级目录 1.基本语法结构2。变量声明和使用3. SELECT 查询4.插入 insert5.更新UPDATE6.删除(DELETE) 7游标 cursor例子1&#xff1a;基本游标使用例子2&#xff1a;使用FOR循环的简化写法实际应用例子&#xff1a;给高工资员工增加奖金 8 IF 条…...

vue3-02基础认识vue3中main.js入口文件,app.vue(不存在唯一根节点),扩展程序vue-devtools安装

1.main.js入口文件 main.js入口文件 // 引入的再是vue构造函数 // 引入的是createApp的工厂函数-直接进行引用 import { createApp } from vue import App from ./App.vue// vue3中 // createApp(App).mount(#app) // 创建应用实列对象-类似vue2中的vm,app比vm更轻 const app…...

如何下载Qt和运行第一个程序。

Ubuntu24.04 下载比较容易&#xff0c;基本都是无脑操作。途中汇出现有个别package下载不成功的情况&#xff0c;重新下载即可。 文章目录 下载qt运行qt第一个项目 下载qt 1.先找到官网&#xff0c;点击Download。 2.然后选择&#xff0c;community User 3.然后会跳转到这个…...

【MySQL例题】我在广州学Mysql 系列——有关数据备份与还原的示例

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二&#xff0c;明天就是元宵节了呀&#xff01;&#xff01;&#x1f606; 俗话说“众里寻他千百度。蓦然回首&#xff0c;那人却在&#xff0c;灯火阑珊处。” 本文主要对数据库备份与还原的知识点例题学习~~ 前情回顾&…...

硬件学习笔记--40 电磁兼容试验-4 快速瞬变脉冲群试验介绍

目录 电磁兼容试验-快速瞬变脉冲群试验介绍 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验-快速瞬变脉冲群试验介绍 驻留时间是在规定频率下影响量施加的持续时间。被试设备&#xff08;EUT&#xff09;在经受扫频频带的电磁影响量或电磁干扰的情况下&#xff0c;在…...

国密算法SM1、SM2、SM3和SM4 具体的使用和区别

国密算法是中国自主研发的密码算法&#xff0c;包括SM1、SM2、SM3和SM4&#xff0c;分别用于不同场景。以下是它们的具体使用和区别&#xff1a; SM1 对称加密算法 类型: 对称加密 密钥长度: 128位 使用场景: 用于数据加密和解密&#xff0c;适用于金融、政务等领域。 特点: …...

在Ubuntu中安装Docker并配置国内镜像

官方下载安装链接 https://docs.docker.com/engine/install/ubuntu/ 1.查看系统版本&#xff0c;并与之与docker文档对应 OS requirements# 查看系统版本命令 lsb_release -a 2.卸载旧版本 Uninstall old versions 3.安装新版本 Installation methods Install using the…...

【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解

目录 一、前言 二、DeepSeek简介 2.1 DeepSeek 是什么 2.2 DeepSeek R1特点 2.2.1 DeepSeek-R1创新点 2.3 DeepSeek R1应用场景 2.4 与其他大模型对比 三、阿里云百炼大平台介绍 3.1 阿里云百炼大平台是什么 3.2 阿里云百炼平台主要功能 3.2.1 应用场景 3.3 为什么选…...

DeepSeek本地部署详细指南

DeepSeek本地部署详细指南 随着人工智能技术的飞速发展&#xff0c;本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私。以下是…...

厘米和磅的转换关系

在排版和设计领域&#xff0c;厘米&#xff08;cm&#xff09;和磅&#xff08;pt&#xff09;都是常用的长度度量单位&#xff0c;它们之间的转换关系基于特定的换算标准&#xff0c;下面为你详细介绍&#xff1a; 基本换算关系 磅是印刷行业常用的长度单位&#xff0c;1英寸…...

Unity-Mirror网络框架-从入门到精通之LagCompensation示例

文章目录 前言什么是滞后补偿Lag Compensation示例延迟补偿原理ServerCubeClientCubeCapture2DSnapshot3D补充LagCompensation.cs 独立算法滞后补偿器组件注意:算法最小示例前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mir…...

DeepSeek+3D视觉机器人应用场景、前景和简单设计思路

DeepSeek3D视觉机器人在多个领域具有广泛的应用场景和巨大的前景。以下是详细的分析&#xff1a; 应用场景 制造业 自动化装配&#xff1a;机器人可以精确地抓取和装配零件&#xff0c;提高生产效率和产品质量。 质量检测&#xff1a;通过3D视觉技术检测产品缺陷&#xff0c;确…...

STM32+Proteus+DS18B20数码管仿真实验

1. 实验准备 硬件方面&#xff1a; 了解 STM32 单片机的基本原理和使用方法&#xff0c;本实验可选用常见的 STM32F103 系列。熟悉 DS18B20 温度传感器的工作原理和通信协议&#xff08;单总线协议&#xff09;。数码管可选用共阴极或共阳极数码管&#xff0c;用于显示温度值。…...

Java自动生成api文档

在 Java 开发中&#xff0c;自动生成 API 文档是一项非常实用的功能&#xff0c;它能帮助开发者快速了解项目中的类、方法、参数等信息。以下为你介绍几种常见的 Java 自动生成 API 文档的方式&#xff1a; 1. 使用 Javadoc Javadoc 是 Java 自带的工具&#xff0c;它可以从 J…...

PHP的JIT编译器

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 PHP是一种广泛使用的脚本语言&#xff0c;被用于构建…...

Golang学习历程【第七篇 闭包type defer panic recover了解time包】

Golang学习历程【第七篇 闭包&type defer panic recover了解】 1. 闭包1.1 闭包的定义1.2 闭包的特点1.3 闭包的示例 2. 类型(type)2.1 自定义类型2.2 类型示例 3. 延迟执行&#xff08;Defer&#xff09;3.1 defer 的用法3.2 defer 示例 4. 恐慌&#xff08;Panic&#xf…...

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…...

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数

声明 在 src\core\ngx_times.c 中&#xff1a; static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec); 实现 在 src\core\ngx_times.c 中&#xff1a; static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)st…...

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...