PLSQL

news2025/1/16 5:41:11

文章目录

  • 基本pl/sql语法
  • 流程控制
    • 条件判断(两种)
    • 循环结构(三种)
    • goto,exit关键字
  • 游标的使用
  • 异常的处理
  • 存储过程(无返回值),存储函数(有返回值)
  • 触发器

命令行窗口运行plsql之前需要运行
SET SERVEROUTPUT ON 才会将 dbms_output.put_line 的打印结果打印出
在这里插入图片描述

在这里插入图片描述

基本pl/sql语法

申明变量

DECLARE
  --申明变量	%TYPE:获得对应字段的类型
  v_sal       employees.employee_id%TYPE;
  v_email     VARCHAR2(256);
  v_hire_date DATE;
BEGIN
  SELECT salary, email, hire_date
    INTO v_sal, v_email, v_hire_date
    FROM employees
   WHERE employee_id = 100;
  DBMS_OUTPUT.PUT_LINE('v_sal: ' || v_sal || ', ' || 'v_email: ' ||
                       v_email || ', ' || 'v_hire_date: ' ||
                       TO_CHAR(v_hire_date, 'YYYY-MM-DD'));
END;

申明记录

DECLARE
  --申明一个记录类型
  TYPE emp_record_type IS RECORD(
    v_sal       employees.employee_id%TYPE,
    v_email     VARCHAR2(256),
    v_hire_date DATE);
  emp_record emp_record_type;
BEGIN
  SELECT salary, email, hire_date
    INTO emp_record.v_sal, emp_record.v_email, emp_record.v_hire_date
    FROM employees
   WHERE employee_id = 100;
  DBMS_OUTPUT.PUT_LINE(emp_record.v_sal || ', ' || emp_record.v_email || ', ' ||
                       emp_record.v_hire_date);
END;

DECLARE
  --%ROWTYPE:使记录和表结构保持一致;&:运行时会在窗口中输入g_emp_id的值再赋给v_emp_id
  v_emp_id NUMBER := &g_emp_id;
  v_emp_record employees%ROWTYPE;
BEGIN
  SELECT * INTO v_emp_record FROM employees WHERE employee_id = v_emp_id;
  DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id || ', ' || v_emp_record.salary || ', ' || v_emp_record.email);
END;

流程控制

条件判断(两种)

IF ... THEN ...
ELSIF ... THEN ...
ELSE
  ...
END IF;


CASE
  WHEN ... THEN ...
  WHEN ... THEN ...
END;

/*
查询出 150号 员工的工资,
若其工资大于或等于 10000 则打印 'salary >= 10000'
若在 5000 到 10000 之间, 则打印 '5000<= salary < 10000'
否则打印 'salary < 5000'
*/
DECLARE
  v_emp_sal employees.salary%TYPE;
  v_msg VARCHAR2(256);
BEGIN
  SELECT salary INTO v_emp_sal FROM employees WHERE employee_id = 100;
  --方法一
  IF v_emp_sal < 5000 THEN
    DBMS_OUTPUT.PUT_LINE('salary < 5000');
  ELSIF v_emp_sal >= 5000 AND v_emp_sal < 10000 THEN
    DBMS_OUTPUT.PUT_LINE('5000<= salary < 10000');
  ELSE
    DBMS_OUTPUT.PUT_LINE('salary >= 10000');
  END IF;
  --方法二
  v_msg := CASE
              WHEN v_emp_sal < 5000 THEN 'salary < 5000'
              WHEN v_emp_sal >= 5000 AND v_emp_sal < 10000 THEN '5000<= salary < 10000'
              ELSE 'salary >= 10000'
            END;
  DBMS_OUTPUT.PUT_LINE(v_msg);
END;

循环结构(三种)

LOOP ...
EXIT WHEN ...
END LOOP;

WHILE ... LOOP
END LOOP;

FOR i IN ... LOOP
END LOOP;

--循环方式打印1-100
DECLARE
  v_count NUMBER := 1;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE(v_count);
  EXIT WHEN(v_count >= 100);
  v_count := v_count + 1;
  END LOOP;
  
  v_count := 1;
  WHILE v_count <= 100 LOOP
    DBMS_OUTPUT.PUT_LINE(v_count);
    v_count := v_count + 1;
  END LOOP;
  
  FOR i IN 1..100 LOOP
    DBMS_OUTPUT.PUT_LINE(i);
  END LOOP;
END;

goto,exit关键字

--打印1-100,遇到50就结束,并打印结束
--经量少用 goto
BEGIN
  FOR i IN 1..100 LOOP
    IF i = 50 THEN
      GOTO label;
    END IF;
    DBMS_OUTPUT.PUT_LINE(i);
  END LOOP;
  <<label>>
  DBMS_OUTPUT.PUT_LINE('结束');
END;
--推荐这种
BEGIN
  FOR i IN 1..100 LOOP
    IF i = 50 THEN
      DBMS_OUTPUT.PUT_LINE('结束');
      EXIT;
    END IF;
    DBMS_OUTPUT.PUT_LINE(i);
  END LOOP;
END;

游标的使用

游标属性
%FOUND布尔类型,如果游标最近一次数据读取成功则返回TRUE
%NOTFOUND尔类型,与%FOUND相反
%ISOPEN尔类型,如果游标是打开状态,则返回TRUE
%ROWCOUNT数字类型,返回记录数
--打印80号部门的员工工资
DECLARE
  --申明变量
  v_sal employees.salary%TYPE;
  v_id employees.employee_id%TYPE;
  --定义游标
  CURSOR emp_cursor IS SELECT salary, employee_id FROM employees WHERE department_id = 80;
BEGIN
  --打开游标
  OPEN emp_cursor;
  --提取数据
  FETCH emp_cursor INTO v_sal, v_id;
  WHILE emp_cursor%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE('id: ' || v_id || ', salary: ' || v_sal);
    FETCH emp_cursor INTO v_sal, v_id;
  END LOOP;
  --关闭游标
  CLOSE emp_cursor;
END;

DECLARE
  --申明一个记录
  TYPE emp_record_type IS RECORD(
       v_sal employees.salary%TYPE,
       v_id employees.employee_id%TYPE
  );
  --申明一个记录类型的变量
  emp_record emp_record_type;
  --定义游标
  CURSOR emp_cursor IS SELECT salary, employee_id FROM employees WHERE department_id = 80;
BEGIN
  --打开游标
  OPEN emp_cursor;
  --提取数据
  FETCH emp_cursor INTO emp_record;
  WHILE emp_cursor%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE('id: ' || emp_record.v_id || ', salary: ' || emp_record.v_sal);
    FETCH emp_cursor INTO emp_record;
  END LOOP;
  --关闭游标
  CLOSE emp_cursor;
END;

WHILE循环读取游标数据会有很多步骤,FOR循环可以简化

--打印80号部门的员工工资
DECLARE
  --申明一个游标
  CURSOR emp_cur IS SELECT employee_id, salary FROM employees WHERE department_id = 80;
BEGIN
  FOR c IN emp_cur LOOP
    DBMS_OUTPUT.PUT_LINE('employee_id: ' || c.employee_id || ', sal: ' || c.salary);
  END LOOP;
END;

示例题1

/*
利用游标, 调整公司中员工的工资: 
    
    工资范围       调整基数
    0 - 5000       5%
    5000 - 10000   3%
    10000 - 15000  2%
    15000 -        1%
*/
DECLARE
  --申明变量
  v_empid   employees.employee_id%TYPE;
  v_empsal  employees.salary%TYPE;
  v_factory NUMBER(3, 2);
  --申明游标
  CURSOR emp_sal_cur IS
    SELECT employee_id, salary FROM employees;
BEGIN
  /*--打开游标
  OPEN emp_sal_cur;
  --提取数据
  FETCH emp_sal_cur INTO v_empid, v_empsal;
  WHILE emp_sal_cur%FOUND LOOP
    IF v_empsal >= 0 AND v_empsal < 5000 THEN v_factory := 0.05;
    ELSIF v_empsal >= 5000 AND v_empsal < 10000 THEN v_factory := 0.03;
    ELSIF v_empsal >= 10000 AND v_empsal < 15000 THEN v_factory := 0.02;
    ELSIF v_empsal >= 15000 THEN v_factory := 0.01;
    END IF;
    UPDATE employees SET salary = salary * (1+v_factory) WHERE employee_id = v_empid;
    FETCH emp_sal_cur INTO v_empid, v_empsal;
  END LOOP;*/

  FOR c IN emp_sal_cur LOOP
    IF c.salary >= 0 AND c.salary < 5000 THEN
      v_factory := 0.05;
    ELSIF c.salary >= 5000 AND c.salary < 10000 THEN
      v_factory := 0.03;
    ELSIF c.salary >= 10000 AND c.salary < 15000 THEN
      v_factory := 0.02;
    ELSIF c.salary >= 15000 THEN
      v_factory := 0.01;
    END IF;
    UPDATE employees
       SET salary = salary * (1 + v_factory)
     WHERE employee_id = c.employee_id;
  END LOOP;
END;

带参数的游标

--处理带参数的游标
DECLARE
  v_factory NUMBER(3, 2);
  v_id      employees.employee_id%TYPE;
  v_sal     employees.salary%TYPE;
  CURSOR emp_sal_cur(emp_id NUMBER, emp_sal NUMBER) IS
    SELECT employee_id, salary
      FROM employees
     WHERE employee_id = emp_id
       AND salary > emp_sal;
BEGIN
  --while参数应该在open打开的时候添加【for循环直接添加】
  OPEN emp_sal_cur(emp_id => 102, emp_sal => 4000);
  FETCH emp_sal_cur
    INTO v_id, v_sal;
  WHILE emp_sal_cur%FOUND LOOP
    IF v_sal >= 0 AND v_sal < 5000 THEN
      v_factory := 0.05;
    ELSIF v_sal >= 5000 AND v_sal < 10000 THEN
      v_factory := 0.03;
    ELSIF v_sal >= 10000 AND v_sal < 15000 THEN
      v_factory := 0.02;
    ELSIF v_sal >= 15000 THEN
      v_factory := 0.01;
    END IF;
    UPDATE employees
       SET salary = salary * (1 + v_factory)
     WHERE employee_id = v_id;
    FETCH emp_sal_cur
      INTO v_id, v_sal;
  END LOOP;
END;

隐式游标

--隐式游标: 更新指定员工 salary(涨工资 10),如果该员工没有找到,则打印”查无此人” 信息
BEGIN
  UPDATE employees SET salry = salary + 10 WHERE employee_id = 99999;
  IF SQL%NOTFOUND THEN
    DBMS_OUTPUT.PUT_LINE('查无此人');
  END IF;
END;

异常的处理

预定义异常处理

--预定义异常处理
DECLARE
  v_sal employees.salary%TYPE;
BEGIN
  SELECT salary INTO v_sal FROM employees WHERE employee_id > 80;
  DBMS_OUTPUT.PUT_LINE(v_sal);
EXCEPTION
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('输出行数太多');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('出现其它类型异常');
END;

非预定义异常处理

--非预定义异常处理
DECLARE
  e_delid_exception EXCEPTION;
  PRAGMA EXCEPTION_INIT(e_delid_exception, -2292); 
BEGIN
  DELETE FROM employees WHERE employee_id =100;
WHEN e_delid_exception THEN
  DBMS_OUTPUT.PUT_LINE('违反完整性约束');
END;

用户自定义异常

DECLARE 
  e_too_high_sal EXCEPTION;
  v_sal employees.salary%TYPE;
BEGIN
  SELECT salary INTO v_sal FROM employees WHERE employee_id = 100;
  IF v_sal > 10000 THEN
    RAISE e_too_high_sal;
  END IF;
EXCEPTION
  WHEN e_too_high_sal THEN
    DBMS_OUTPUT.PUT_LINE('工资太高了');
END;

示例题

--通过 select ... into ... 查询某人的工资, 若没有查询到, 则输出 "未找到数据"
DECLARE
  v_sal employees.salary%TYPE;
BEGIN
  SELECT salary INTO v_sal FROM employees WHERE employee_id = 1001;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT._PUT_LINE('未找到数据');
END;
--更新指定员工工资,如工资小于300,则加100;对 NO_DATA_FOUND 异常, TOO_MANY_ROWS 进行处理.
DECLARE
  v_sal employees.salary%TYPE;
BEGIN
  SELECT salary INTO v_sal FROM employees WHERE employee_id = 1001;
  IF v_sal > 300 THEN
    UPDATE employees SET salary = salary + 100 WHERE employee_id = 1001;
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT._PUT_LINE('未找到数据');
  WHEN TOO_MANG_ROWS THEN
    DBMS_OUTPUT._PUT_LINE('输出数据太多');
END;
--自定义异常: 更新指定员工工资,增加100;若该员工不存在则抛出用户自定义异常: no_result
DECLARE
  no_result EXCEPTION;
BEGIN
  UPDATE employees SET salary = salary + 100 WHERE employee_id = 1001;
  IF SQL%NOTFOUND THEN
    RAISE no_result;
  END IF;
EXCEPTION
  WHEN no_result THEN
    DBMS_OUTPUT._PUT_LINE('更新失败');
END;

存储过程(无返回值),存储函数(有返回值)

存储函数

--存储函数
CREATE OR REPLACE FUNCTION func_name(dpt_id NUMBER, salary NUMBER)
RETURN NUMBER
IS
--函数需要申明的变量,记录类型,CURSOR【DECLARE】
BEGIN
  --函数执行体
EXCEPTION
  --函数执行遇到的异常
END;

存储函数的使用

--函数的 helloworld: 返回一个 "helloworld" 的字符串
--创建函数
CREATE OR REPLACE FUNCTION say_world(v_word)
RETURN VARCHAR2
IS
BEGIN
  RETURN 'word is:' || v_word;
END;

--调用函数
BEGIN
  DBMS_OUTPUT.PUT_LINE(say_hello('你好, Word'));
END;

--SQL执行
SELECT say_hello('你好, Word') FROM dual;

存储函数的题目

--创建一个存储函数,打印当前的系统时间
CREATE OR REPLACE FUNCTION get_sysdate
RETURN DATE
IS
  v_date DATE;
BEGIN
  v_date := SYSDATE;
  RETURN v_date;
END;
--执行SQL
SELECT get_sysdate FROM dual;

--计算两数和
CREATE OR REPLACE FUNCTION add_param(v_x NUMBER, v_y NUMBER)
RETURN NUMBER
IS
BEGIN
  v_sum NUMBER := v_x+v_y;
  RETURN v_sum;
END;
--执行SQL
SELECT add_param(1,2) FROM dual;

--定义一个函数: 获取给定部门的工资总和, 要求:部门号定义为参数, 工资总额定义为返回值.
CREATE OR REPLACE FUNCTION get_dpt_sal_func1(dpt_id NUMBER)
RETURN NUMBER
IS
  v_sumsal NUMBER;
  CURSOR dpt_sal_cur IS SELECT SUM(salary) FROM employees WHERE department_id = dpt_id;
BEGIN
  FOR c IN dpt_sal_cur LOOP
    v_sumsal: = v_sumal + c.salary;
  END LOOP;
  RETURN v_dpt_sal;
END;

DECLARE
  v_dptid NUMBER := 80;
BEGIN
  DBMS_OUTPUT.PUT_LINE(get_dpt_sal_func2(v_dptid));
END;

/*
要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的参数).
要求: 部门号定义为参数, 工资总额定义为返回值.
*/
CREATE OR REPLACE FUNCTION get_dpt_sal2(dpt_id IN NUMBER, emp_count OUT NUMBER)
RETURN NUMBER
IS
  v_empcount NUMBER := 0;
  v_dpt_sal NUMBER :=0;
  CURSOR dpt_sal_cur IS SELECT salary FROM employees WHERE department_id = dpt_id;
BEGIN
  FOR c IN dpt_sal_cur LOOP
    v_dpt_sal := c.salary + v_dpt_sal;
    v_empcount := v_empcount + 1;
  END LOOP;
  RETURN v_dpt_sal;
END;

DECLARE
  v_num NUMBER := 0;
BEGIN
  DBMS_OUTPUT.PUT_LINE(get_dpt_sal2(80, v_num));
  DBMS_OUTPUT.PUT_LINE(v_num);
END;

存储过程

--定义一个存储过程: 获取给定部门的工资总和(通过 out 参数), 要求:部门号和工资总额定义为参数
CREATE OR REPLACE PROCEDURE get_sal_proc(dpt_id IN NUMBER, OUT sumsal NUMBER)
IS
  CURSOR emp_sal_cur IS SELECT salary FROM employees WHERE department_id dpt_id;
BEGIN
  sumsal := 0;
  FOR c IN emp_sal_cur IN LOOP
    sumsal := sumsal + c.salary;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(sumsal);
END;

BEGIN
  get_sal_proc(80, 0);
END;

/*
自定义一个存储过程完成以下操作:
对给定部门(作为输入参数)的员工进行加薪操作, 若其到公司的时间在 (? , 95) 期间, 为其加薪 %5
                                                      [95 , 98)            %3
                                                      [98, ?)              %1
得到以下返回结果: 为此次加薪公司每月需要额外付出多少成本(定义一个 OUT 型的输出参数).
*/
CREATE OR REPLACE PROCEDURE add_sal_proc(dpt_id IN NUMBER, cost OUT NUMBER)
IS
  CURSOR emp_sal_cur IS SELECT employee_id, salary, hire_date FROM employees WHERE department_id = dpt_id;
  v_factory NUMBER(4,2);
BEGIN
  cost += 0;
  FOR c IN emp_sal_cur LOOP
    IF c.hire_date < TO_DATE('1995', 'YYYY') THEN
      v_factory := 0.05;
    ELSIF c.hire_date >= TO_DATE('1995', 'YYYY') AND c.hire_date < TO_DATE('1998', 'YYYY') THEN
      v_factory := 0.03;
    ELSE
      v_factory := 0.01;
    END IF;
    cost := cost + salary * v_factory;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(cost);
END;
BEGIN
  add_sal_proc(80, 0);
END;

触发器

CREATE OR REPLACE TRIGGER update_emp_trigger
  AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
  dbms_output.put_line('更新前old salary: ' || :old.salary || ', 更新后new salary: ' || :new.salary);
END;

SELECT * FROM employees;
UPDATE employees SET salary = salary - 100 WHERE employee_id = 100;

在这里插入图片描述
示例题

--编写一个触发器, 在对 employees 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录
CREATE TABLE my_emp_bak AS SELECT employee_id, salary  FROM employees WHERE 1=2;
CREATE OR REPLACE TRIGGER my_emp_bak
BEFORE
DELETE ON employees
FOR EACH ROW
BEGIN
  INSERT INTO my_emp_bak(employee_id, salary) VALUES(:old.employee_id, :old.salary);
END;
SELECT * FROM employees;
SELECT * FROM my_emp_bak;
DELETE FROM employees;
ROLLBACK;

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

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

相关文章

苹果手机远程控制安卓手机,为什么不能发起控制?

这位用户想要用iOS设备远程控制安卓设备&#xff0c;在被控端安装好AirDroid之后&#xff0c;就在控制端的苹果手机上也安装了AirDroid&#xff0c;然而打开控制端的软件&#xff0c;却没有在手机界面上看到【远程控制】按钮&#xff0c;于是提出了以上疑问。 解答 想要让iOS设…

A,B,C , D, E类地址的划分及子网划分汇总的详解

一、 A类地址 &#xff08;1&#xff09;A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。它的第1个字节的第一位固定为0. &#xff08;2&#xff09;A类地址范围&#xff1a;1.0.0.1—126.255.255.254 &#xff08;3&#xff09;A类地址中的私有地址和保留地…

苹果电脑快捷键集合

苹果电脑Windows系统下的ALT键是组合键。苹果电脑键盘左下角的Fnoption是Windows的alt键。同时按下两个键是ALT键的功能。在非组合状态下&#xff0c;单独按Option键。 补充&#xff1a; 1. 按controlalt&#xff08;选项&#xff09;delete 启动任务管理器。 2. Option-Del…

nrf52832 使用ADC点LED

#define SAMPLES_IN_BUFFER 5 volatile uint8_t state 1;/*** brief UART events handler.*/void saadc_callback(nrf_drv_saadc_evt_t const * p_event) { // }//saadc的初始化 void saadc_init(void) {ret_code_t err_code;nrf_saadc_channel_config_t channel_config NR…

C#,数值计算——柯西微分(Cauchy deviates)的计算方法与源代码

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Cauchy deviates /// </summary> public class Cauchydev : Ran { private double mu { get; set; } private double sig { get; set; } public…

C++ -- 学习系列 static 关键字的使用

static 是 C 中常用的关键字&#xff0c;被 static 修饰的变量只会在 静态存储区&#xff08;常量数据也存放在这里&#xff09; 被分配一次内存&#xff0c;生命周期与整个程序一样&#xff0c;随着程序的消亡而消亡。 一 static 有以下几种用法&#xff1a; 1. 在文件中定义…

管理类联考——数学——汇总篇——知识点突破——应用题——交叉比例法/杠杆原理

读书笔记 甲有&#xff1a;x个a&#xff0c;乙有&#xff1a;y个b&#xff0c;甲乙的平均值为c&#xff0c;根据总数相等&#xff0c;得&#xff1a;axbyc(xy)&#xff0c;即ax-cxcy-by&#xff0c;则 x y c − b a − c \frac{x}{y}\frac{c-b}{a-c} yx​a−cc−b​ &#…

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…

rv1126之isp黑电平(BLC)校准!

前言&#xff1a; 大家好&#xff0c;今天我们继续来讲解isp第二期内容&#xff0c;这期内容主要分三个部分&#xff1a; 1、tunning的工作流程 2、利用RKISP2.x_Tuner来创建tunning工程&#xff0c;并连接上rv1126开发板进行抓图 3、BLC(黑电平校准)的原理和校准方法以及实战…

UE4(Unreal Engine 4)运行setup.bat发生403报错的问题

最近UE官方在迁移服务器&#xff0c;有些D:\UE4\Engine\Build\Commit.gitdeps.xml文件需要更新。此时需要你去往UE对应的版本下载新的Commit.gitdeps.xml文件&#xff0c;并且覆盖原有的Commit.gitdeps.xml文件。UE的官方说明 覆盖前 覆盖后

Tomcat多实例与负载均衡

Tomcat多实例与负载均衡 一、Tomcat多实例1.1、安装JDK1.2、安装tomcat1.3、配置tomcat环境变量1.4、修改tomcat中的主配置文件1.5、修改启动脚本和关闭脚本1.6、 启动tomcat并查看 二、NginxTomcat负载均衡、动静分离2.1、部署Nginx负载均衡2.2、部署第一台tomcat2.3、部署第二…

Windows系统远程桌面连接CentOS7

1. 安装 GNOME 桌面环境&#xff08;如果尚未安装&#xff09; yum groupinstall "GNOME Desktop" 2. 安装 VNC Server yum install tigervnc-server 设置 vnc 账号密码 vncpasswd root root 是账号&#xff0c;接下会提示两次输入密码 3. 安装 xrdp 检查cento…

编译器01-整体概述

一&#xff1a;编译器各个阶段及它们之间接口 二&#xff1a;编译器各个阶段解释 三&#xff1a;编译器中常用的数据结构-树与链表

基于springboot+vue的实验室耗材管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Mysql数据库之常用SQL语句及事务学习总结

数据库介绍 几个常见的缩写&#xff1a; DB&#xff1a;数据库。全称&#xff1a;DataBase。DBMS&#xff1a;数据库管理系统。全称&#xff1a;DataBase Management System。DBS&#xff1a;数据库系统。全称&#xff1a;DataBase System。DBA&#xff1a;数据库管理员。全称…

Matlab图像处理-分水岭算法

基本概念 最常用的分水岭算法是F.Meyer在20世纪90年代早期提出的基于灰度图像的分割算法&#xff0c;它是一种基于拓扑理论的数学形态学的分割方法&#xff0c;其基本思想是把图像看作是测地学上的拓扑地貌&#xff0c;图像中每一点像素的灰度值表示该点的海拔高度&#xff0c…

二分搜索树层序遍历(Java 实例代码)

目录 二分搜索树层序遍历 Java 实例代码 src/runoob/binary/LevelTraverse.java 文件代码&#xff1a; 二分搜索树层序遍历 二分搜索树的层序遍历&#xff0c;即逐层进行遍历&#xff0c;即将每层的节点存在队列当中&#xff0c;然后进行出队&#xff08;取出节点&#xff0…

分身空间(应用多开)会员版,提供更便捷的应用多开体验

分身空间&#xff08;应用多开&#xff09;会员版是一款功能强大的跨平台多设备同步工具。通过这个应用&#xff0c;您可以在手机、平板电脑和电脑等多个设备上同时登录和使用多个账号&#xff0c;实现应用的多开。 无论是社交媒体、游戏、聊天工具还是其他应用&#xff0c;分…

Windows MySQL服务安装及问题解决方案

Windows MySQL服务安装及问题解决方案 安装及配置步骤一&#xff1a;官网下网MySQL安装包步骤二&#xff1a;设置环境变量步骤仨&#xff1a;配置MySQL,ini配置文件步骤四&#xff1a;初始化MySQL步骤五&#xff1a;开启MySQL服务步骤六&#xff1a;测试是否安装成功步骤七&…

【Linux】Systemd 中的单元(Unit)和单元文件(Unit File)怎么理解?

单元&#xff08;Unit&#xff09;单元文件&#xff08;Unit File&#xff09;感谢 &#x1f496; 关于systemd是什么&#xff0c;http://t.csdn.cn/pMkG7这篇文章里有详细说明。 这篇文件我们一起来看看Systemd 中的单元&#xff08;Unit&#xff09;和单元文件&#xff08;Un…