16. 存储过程和存储函数

文章目录

    • 1.存储过程和存储函数
    • 2.创建和使用存储过程
      • 2.1 语法:
      • 2.2 第一个存储过程,打印hello world
      • 2.3 调用语法
      • 2.4 带参数的存储过程
      • 2.5 调试存储过程
    • 3.创建和使用存储函数
      • 3.1 存储函数定义
      • 3.2 存储函数语法:
      • 3.3 存储函数案例:
    • 4.in和out参数
      • 4.1 介绍
      • 4.2 使用原则
      • 4.3 案例
    • 5.在应用程序中访问存储过程
    • 6.在应用程序中访问存储函数
    • 7.如何在out函数中使用光标,即out返回集合
      • 7.1 使用光标,申明包结构
      • 7.2 包头
      • 7.3 包体
    • 8.代码中使用游标

1.存储过程和存储函数

1.指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。
2.存储过程和存储函数的相同点:完成特定功能的程序。
3.存储过程和存储函数的区别:是否用return语句返回值。

2.创建和使用存储过程

2.1 语法:

语法:

CREATE [OR REPLACE] PROCEDURE 过程名(参数列表)
AS 
PLSQL子程序体

解释:

1. CREATE 创建
2. OR REPLACE 替换,存储过程/函数不支持修改,只能创建替换。
3. PROCEDURE 关键字
4. 过程名(参数列表) 存储过程/函数名称,可带参数,也可不带
5. AS 声明部分,比如创建变量

2.2 第一个存储过程,打印hello world

案例:

CREATE OR REPLACE PROCEDURE sayhelloworld 
AS-- 说明部分
BEGINDBMS_OUTPUT.PUT_LINE('hello world');
END;

2.3 调用语法

调用存储过程

1.直接调用 exec sayhelloworld()
2.通过其他存储过程调用,如 CREATE OR REPLACE PROCEDURE usesayhelloworldASBEGINsayhelloworld();END;

2.4 带参数的存储过程

例: 给指定员工涨100块钱工资,并打印涨前和涨后的工资。
image

--创建一个带参数的存储过程
CREATE OR REPLACE PROCEDURE raisemoney(userid in NUMBER) 
AS
-- 定义一个变量保存涨前的薪水raisemoney YSTEXT.MONEY%type; -- mon是变量 YSTEXT.money是表名和字段名 
BEGIN-- 得到员工涨前的薪水,into raisemoney表示赋值SELECT money into raisemoney FROM YSTEXT WHERE ID = userid;-- 给该员工涨100工资UPDATE YSTEXT SET MONEY = MONEY + 100 WHERE ID = userid;-- 需不需要commit?-- 注意,一般不在存储过程或者存储函数中,commit和rollback。一般交由调用者处理。-- 打印DBMS_OUTPUT.PUT_LINE('涨前:'||raisemoney||'  涨后:'||(raisemoney +100));
END;

1.Navicat直接执行

image

2.其他的存储过程调用执行

CREATE OR REPLACE PROCEDURE "USERAISEMONEY" AS
BEGINRAISEMONEY(1);RAISEMONEY(1);commit;
END;

image

2.5 调试存储过程

image
image

在调试中可能会出现问题

此会话需要 DEBUG CONNECT SESSION 和 DEBUG ANY PROCEDURE 用户权限

出现该问题是因为权限不足
操作步骤:

1.打开cmd窗口
2.以管理员身份登录sqlplus / as sysdba
3.查看本用户权限USER 为 "SYS"
4.授予调试用户DEBUG CONNECT SESSION 和 DEBUG ANY PROCEDURE权限grant DEBUG CONNECT SESSION , DEBUG ANY PROCEDURE to YS;

image

3.创建和使用存储函数

3.1 存储函数定义

1.函数为一命名的存储函数,可带参数,并返回一计算值。
2.函数和过程的结构类似,但是必须返回一个return子句,用于返回函数值。

3.2 存储函数语法:

语法:

CREATE [OR REPLACE] FUNCTION 函数名(参数列表)
return 函数值类型
AS 
PLSQL子程序体

3.3 存储函数案例:

案例 : 查询某个员工的年收入

CREATE OR REPLACE FUNCTION queryusermoney(eno IN NUMBER) 
return number --定义返回的类型为number
AS--定义变量保存员工的薪水和奖金pmoney YSTEXT.MONEY%TYPE;--薪水pbonus YSTEXT.BONUS%TYPE;--奖金
BEGIN--得到该员工的薪水和奖金--into关键字赋值SELECT MONEY,BONUS INTO pmoney,pbonus FROM YSTEXT WHERE id = eno;--直接返回年收入return pmoney*12 + pbonus;
END;

表结构和数据
image

结果1
查询ID为1的员工,结果为30800,正确
image

结果2
查询ID为3的员工,结果为空
image

奖金字段为空,代表为0,所以正确写法

    CREATE OR REPLACE FUNCTION queryusermoney(eno IN NUMBER) 
return number --定义返回的类型为number
AS--定义变量保存员工的薪水和奖金pmoney YSTEXT.MONEY%TYPE;--薪水pbonus YSTEXT.BONUS%TYPE;--奖金
BEGIN--得到该员工的薪水和奖金--into关键字赋值SELECT MONEY,BONUS INTO pmoney,pbonus FROM YSTEXT WHERE id = eno;--直接返回年收入return pmoney*12 + nvl(pbonus,0);
END;

结果3
image

4.in和out参数

4.1 介绍

1.存储过程和存储函数都可以有out参数。
2.存储过程和存储函数都可以有多个out参数。
3.存储过程可以通过out参数来实现返回值。

4.2 使用原则

那么存储过程和存储函数都能返回一个值,什么时候使用存储函数/存储过程?

原则:

如果只有一个返回值,用存储函数;否则,使用存储过程。

4.3 案例

查询员工的名称,薪水,职位

CREATE OR REPLACE PROCEDURE QUERYUSERINFO(eno IN NUMBER, pname OUT VARCHAR2, pmoney OUT NUMBER, pjob OUT VARCHAR2)
AS
BEGIN--查询员工的名称,薪水,职位SELECT NAME,MONEY,JOB INTO pname,pmoney,pjob FROM YSTEXT WHERE id = eno;
END;

表结构和数据
image

结果
image

5.在应用程序中访问存储过程

代码实现

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>dbtest</artifactId><version>1.0-SNAPSHOT</version><name>dbtest</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>com.oracle</groupId><artifactId>ojdbc14</artifactId><version>9.0.2.0.0</version><type>pom</type></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><version>19.3.0.0</version></dependency></dependencies><build><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin><!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --><plugin><artifactId>maven-site-plugin</artifactId><version>3.7.1</version></plugin><plugin><artifactId>maven-project-info-reports-plugin</artifactId><version>3.0.0</version></plugin></plugins></pluginManagement></build>
</project>

2.JDBCUtils 工具类,创建连接,释放连接。

package storage.utils;import java.sql.*;public class JDBCUtils {private static String driver = "oracle.jdbc.OracleDriver";private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";private static String user = "YS";private static String password = "123456";//注册数据库驱动static {try {//1.java方式注册驱动Class.forName(driver);//2.使用jdbc自带方式注册驱动//DriverManager.registerDriver(driver);} catch (ClassNotFoundException e) {throw new ExceptionInInitializerError(e);}}//获取数据库连接public static Connection getConnection(){try{return DriverManager.getConnection(url,user,password);}catch (SQLException e){e.printStackTrace();}return null;}//释放数据库资源public static void release(Connection conn, Statement st, ResultSet rs){if(rs != null){try{rs.close();}catch(SQLException e){e.printStackTrace();}finally {rs = null;}}if(st != null){try{st.close();}catch(SQLException e){e.printStackTrace();}finally {st = null;}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();} finally {conn = null;}}}}

3.RunProcedure 单元测试

package storage.run;import oracle.jdbc.OracleTypes;
import org.junit.jupiter.api.Test;
import storage.utils.JDBCUtils;import java.sql.CallableStatement;
import java.sql.Connection;public class RunProcedure {@Testpublic void runProcedure(){//调用一个已有的存储过程,如:
//        CREATE OR REPLACE PROCEDURE QUERYUSERINFO(eno IN NUMBER,  --查询员工的名称,薪水,职位
//                pname OUT VARCHAR2,
//                pmoney OUT NUMBER,
//                pjob OUT VARCHAR2)
//        AS
//                BEGIN
//        --查询员工的名称,薪水,职位
//        SELECT NAME,MONEY,JOB INTO pname,pmoney,pjob FROM YSTEXT WHERE id = eno;
//        -- DBMS_OUTPUT.PUT_LINE('Navicat for Oracle');
//        END;//存储过程写法,四个问号表示四个参数String sql = "{call QUERYUSERINFO(?,?,?,?)}";Connection conn = null;CallableStatement call = null;try {//1.获取数据库连接conn = JDBCUtils.getConnection();//2.传入sql,并通过连接获取一个statementcall = conn.prepareCall(sql);//3.对于输入参数 in,需要赋值call.setInt(1,1);//对于输出参数 out,需要申明,申明是一个输出参数.第二个参数为输出参数类型call.registerOutParameter(2, OracleTypes.VARCHAR);call.registerOutParameter(3, OracleTypes.NUMBER);call.registerOutParameter(4, OracleTypes.VARCHAR);//4.执行调用call.execute();//5.取出结果String name = call.getString(2);double money = call.getDouble(3);String job = call.getString(4);System.out.println(name + "\t" + money + "\t" + job);} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(conn, call, null);}}
}

4.执行结果

数据库数据
image
运行结果
image

6.在应用程序中访问存储函数

pom.xml和JDBCUtils工具类和存储过程一致

1.存储函数代码

package storage.run;
/*** 执行存储函数*/import oracle.jdbc.OracleTypes;
import org.junit.jupiter.api.Test;
import storage.utils.JDBCUtils;import java.sql.CallableStatement;
import java.sql.Connection;public class RunFunction {@Testpublic void runFunction(){//调用一个已有的存储函数,如:
//        CREATE OR REPLACE FUNCTION QUERYUSERMONEY(eno IN NUMBER) --查询某个员工的年收入
//        return number --定义返回的类型为number
//                AS
//        --定义变量保存员工的薪水和奖金
//        pmoney YSTEXT.MONEY%TYPE;--薪水
//        pbonus YSTEXT.BONUS%TYPE;--奖金
//        BEGIN
//                --得到该员工的薪水和奖金
//                --into关键字赋值
//        SELECT MONEY,BONUS INTO pmoney,pbonus FROM YSTEXT WHERE id = eno;
//
//        --直接返回年收入
//        return pmoney*12 + nvl(pbonus,0);
//        END;//存储函数写法,最前面问号表示返回值String sql = "{?=call QUERYUSERMONEY(?)}";Connection conn = null;CallableStatement call = null;try {//1.获取数据库连接conn = JDBCUtils.getConnection();//2.传入sql,并通过连接获取一个statementcall = conn.prepareCall(sql);//3.对于返回值,需要申明类型call.registerOutParameter(1,OracleTypes.NUMBER);//给传入参数赋值call.setInt(2, 1);//4.执行调用call.execute();//5.取出结果double yearMoney = call.getDouble(1);System.out.println("该员工年收入为" + "\t" + yearMoney);} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(conn, call, null);}}
}

2.执行结果

数据库数据
image
运行结果
image

7.如何在out函数中使用光标,即out返回集合

7.1 使用光标,申明包结构

包结构包括包头和包体,包同样为数据库的对象,地位和表、视图、序列,存储过程,存储函数一样。
1.包头:只负责申明。
2.包体:只负责实现,包体要实现包头定义的所有存储过程和存储函数。

7.2 包头

语法

--PACKAGE定义包头的关键字
CREATE OR REPLACE PACKAGE MYPACKAGE 
AS-- 定义一个光标参数usrcursor,ref cursor是引用光标的意思type usrcursor is ref cursor;-- 调用存储过程PROCEDURE QUERYUSERLIST(dno IN NUMBER, usrList OUT usrcursor);END MYPACKAGE;

快速创建包体
image

7.3 包体

语法

-- PACKAGE BODY定义包体的关键字
CREATE OR REPLACE 
PACKAGE BODY MYPACKAGE AS--存储过程PROCEDURE QUERYUSERLIST(dno IN NUMBER, usrList OUT usrcursor) ASBEGIN--打开光标open usrList for SELECT * FROM YSTEXT WHERE id = dno;END QUERYUSERLIST;END MYPACKAGE;

执行结果
image

8.代码中使用游标

代码

package storage.run;import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.sql.NUMBER;
import org.junit.jupiter.api.Test;
import storage.utils.JDBCUtils;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;public class RunCursor {@Testpublic void runCursor(){//调用一个已有的包结构,如://      CREATE OR REPLACE
//      PACKAGE MYPACKAGE AS --PACKAGE定义包的关键字
//          -- 定义一个光标参数usrcursor,ref cursor是引用光标的意思
//          type usrcursor is ref cursor;
//          -- 调用存储过程
//          PROCEDURE QUERYUSERLIST(dno IN NUMBER, usrList OUT usrcursor);
//      END MYPACKAGE;//存储函数写法,最前面问号表示返回值String sql = "{call MYPACKAGE.QUERYUSERLIST(?,?)}";Connection conn = null;CallableStatement call = null;ResultSet rs = null;try {//1.获取数据库连接conn = JDBCUtils.getConnection();//2.传入sql,并通过连接获取一个statementcall = conn.prepareCall(sql);//3.给传入参数赋值call.setInt(1, 1);//对于返回值,需要申明类型.这里为游标类型call.registerOutParameter(2, OracleTypes.CURSOR);//4.执行调用call.execute();//5.取出结果,这里使用CallableStatement接口的实现类rs = ((OracleCallableStatement)call).getCursor(2);//6.打印结果System.out.println("ID" + "\t" + "NAME" + "\t" + "AGE" + "\t" + "MONEY" + "\t" + "DATE" + "\t" + "BONUS" +"\t" + "JOB");while(rs.next()){int id = rs.getInt("ID");String name = rs.getString("NAME");int age = rs.getInt("AGE");double money = rs.getDouble("MONEY");String date = rs.getString("DATE");double bonus = rs.getDouble("BONUS");String job = rs.getString("JOB");System.out.println(id + "\t" + name + "\t" + age + "\t" + money + "\t" + date + "\t" + bonus +"\t" + job);}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.release(conn, call, null);}}
}

运行结果
image

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

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

相关文章

Mybatis操作数据库执行流程的先后顺序是怎样的?

MyBatis是一个支持普通SQL查询、存储及高级映射的持久层框架&#xff0c;它几乎消除了JDBC的冗余代码。使Java开发人员可以使用面向对象的编程思想来操作数据库。对于MyBatis的工作原理和操作流程的理解&#xff0c;我们先来看下面的工作流程图。 MaBatis的工作流程 在上图中…

为什么弹性内容交付网络是决定网站性能的关键

如今的用户对于所访问网站都对网站有自己的标准&#xff0c;他们期望访问的网站性能良好&#xff0c;具有快速的页面加载时间和易于访问、新鲜且动态的内容&#xff0c;同时他们还希望享受无缝且安全的体验&#xff0c;无需停机或内容访问受到限制。比如微博等平台每次在网络热…

布隆过滤器在海量数据去重验证中应用

布隆过滤器在海量数据去重验证中应用 文章目录 布隆过滤器在海量数据去重验证中应用引子面试结束级方案——从数据库中取新手级方案——利用redis的set数据结构专业级方案——利用布隆过滤器 布隆过滤器基本概念优点缺点布隆过滤器的数据结构布隆过滤器的工作流程布隆过滤器的优…

数据库应用:MySQL备份与恢复

目录 一、理论 1.数据备份 2.完全备份与恢复 3.完全备份与恢复应用 4.增量备份与恢复 5.增量备份与恢复应用 6.使用脚本备份 7.日志管理 二、实验 1.完全备份与恢复 2.增量备份与恢复 3.使用脚本备份 三、问题 1.mysqldump报错 四、总结 一、理论 1.数据备份 …

企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + 前后端分离 + 二次开发

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

(ceph)CephFS 文件系统 MDS接口

创建 CephFS 文件系统 MDS 接口 //服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 systemctl status cep…

浙大数据结构第三周之03-树3 Tree Traversals Again

题目详情&#xff1a; An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2)…

怎么对XMind思维导图加密?

在现代社会中&#xff0c;信息安全变得越来越重要。对于那些使用XMind思维导图来组织和管理重要信息的人来说&#xff0c;保护思维导图中的内容免受未经授权的访问变得至关重要。本文将介绍如何加密XMind思维导图&#xff0c;以确保您的信息安全。 什么是XMind思维导图&#x…

什么是从人类反馈中强化学习(RLHF)?

目录 一、什么是RLHF? 二、语言作为强化学习问题 三、用于语言模型的RLHF 四、ChatGPT如何使用RLHF 五、RLHF对语言模型的限制 自从OpenAI公司发布ChatGPT以来&#xff0c;人们对大型语言模型(LLM)的这一重大进步感到兴奋。虽然ChatGPT与其他最先进的大型语言模型大小相同…

数据可视化——根据提供的数据,将数据经过处理后以折线图的形式展现

文章目录 前言处理数据获取数据筛选数据将JSON数据转换为Python数据筛选出横坐标数据和纵坐标数据 根据处理后的数据绘制折线图整体代码展示 前言 前面我们学习了如何使用 pyecharts 模块绘制简单的折线图&#xff0c;那么今天我将为大家分享&#xff0c;如何根据提供的数据将…

【JavaScript 03】语句 变量 变量提升 标识符 注释 区块 作用域 条件语句 循环语句 break continue 标签

JS 语句变量变量提升标识符注释区块条件语句ifif...elseswitch三元运算符 ?: 循环语句whilefordo...whilebreak语句 and continue语句标签 语句 JS程序的执行单位是行&#xff08;line&#xff09; **语句&#xff08;statement&#xff09;**是为了完成特定任务而进行的操作…

STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库…

【25】SCI易中期刊推荐——神经网络科学(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

Docker 基本管理与应用

目录 一、Docker介绍 1、docker概述 2、容器优势 3、Docker与虚拟机的区别 4、Docker核心概念 二&#xff1a; 安装 Docker 1、环境准备、安装依赖包 2、 设置阿里云镜像源&#xff0c;安装 Docker-CE并设置为开机自动启动 3、信息查看 ​三&#xff1a;Docker 镜像操作…

【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

目录 前言 1.冒泡排序 1.1冒泡排序动图 1.2冒泡排序源代码 1.3冒泡排序的特性总结 2.快速排序&#x1f451; 2.1hoare版本实现思想 排序前 排序中 排序后 2.2hoare版本快排源代码 2.3分析先走 情况1&#x1f947; 情况2&#x1f948; 前言 交换类排序两个常见的排…

包的使用及其创建

文章目录 前言类名冲突完整的类路径创建包导入类包总结 前言 java语言中&#xff0c;包在整个管理过程中发挥了重要的作用。使用包&#xff0c;可以有效地管理繁多的类文件&#xff0c;解决了类名重复的问题。在类中应用包和权限修饰符&#xff0c;可以控制他人对类成员的方法的…

【Jenkins】Jenkins构建前端流水线

目录 一、前言二、新建前端流水线1、点击新建任务2、填写流水线名称&#xff08;这里我选择的是自由风格的软件项目&#xff09;&#xff0c;任务名称一般格式为&#xff1a;项目名称-前后端3、创建成功后的结果 三、配置前端流水线1、进入刚创建好的任务页面中&#xff0c;点击…

Grafana_数据可视化工具

目录 一、简介 二、安装部署 1、下载 2、安装 3、启用 三、使用简介 1、添加数据源 2、创建DashBoard 3、查看dashboard 4、选择查看的时间段 5、阈值颜色控制 源码等资料获取方法 一、简介 Grafana是一个跨平台开源的纯html/js编写的度量分析和可视化工具&#x…

Meta提出全新参数高效微调方案,仅需一个RNN,Transformer模型GPU使用量减少84%!

近来&#xff0c;随着ChatGPT和GPT-4模型的不断发展&#xff0c;国内外互联网大厂纷纷推出了自家的大语言模型&#xff0c;例如谷歌的PaLM系列&#xff0c;MetaAI的LLaMA系列&#xff0c;还有国内公司和高校推出的一些大模型&#xff0c;例如百度的文心一言&#xff0c;清华的C…

Linux——认识Linux的目录结构 常用命令 vim命令 权限及其控制

目录 linux的目录结构常用linux的命令ls(list)和llcd 切换目录mkdir 创建文件夹touch命令&#xff1a;创建普通文本文件pwd 显示路径whoamisu&#xff1a;普通--超级账号man&#xff1a;查看手册rm&#xff1a;删除网络命令ifconfig重定向 >>cat 查看文本文件clear清屏hi…