16. 存储过程和存储函数

news2024/10/6 2:31:12

文章目录

    • 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
	-- 说明部分
BEGIN
	DBMS_OUTPUT.PUT_LINE('hello world');
END;

2.3 调用语法

调用存储过程

1.直接调用 exec sayhelloworld()
2.通过其他存储过程调用,如 
    CREATE OR REPLACE PROCEDURE usesayhelloworld
    AS
    BEGIN
    	sayhelloworld();
    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
BEGIN
    RAISEMONEY(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 {

    @Test
    public 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,并通过连接获取一个statement
            call = 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 {

    @Test
    public 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,并通过连接获取一个statement
            call = 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) AS
    BEGIN
        --打开光标
        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 {

    @Test
    public 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,并通过连接获取一个statement
            call = 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.coloradmin.cn/o/771866.html

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

相关文章

VR全景医疗:多渠道矩阵式使用,展现医疗实力

VR全景医疗的市场正在趋于成熟&#xff0c;医院将VR全景展示作为一种新颖的展示方式&#xff0c;在全景中嵌入官网&#xff0c;展现医院全貌&#xff0c;更可以凭借多渠道矩阵式使用&#xff0c;展现医疗实力&#xff0c;提高医院知名度。虽然这是一个全新的领域&#xff0c;但…

k8s1.18.20:cert-manager 1.8 安装部署

cert-manager 安装部署 一、官网安装文档 https://cert-manager.io/docs/installation/ 1.1、简介 cert-manager 在 Kubernetes 集群中增加了证书 (certificates) 和证书颁发者 (certificate issuers) 作为资源类型&#xff0c;并简化了获取、更新和应用这些证书的过程。 …

传统软件测试过程中的测试分工

最近看了点敏捷测试的东西&#xff0c;看得比较模糊。一方面是因为没有见真实的环境与流程&#xff0c;也许它跟本就没有固定的模式与流程&#xff0c;它就像告诉人们要“勇敢”“努力”。有的人在勇敢的面对生活&#xff0c;有些人在勇敢的挑战自我&#xff0c;有些人在勇敢的…

利用内存映射文件进行程序间通信2一代码

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 为了测试代码&#xff0c;需要分别创建两个应用程序文件。 窗体如下&#xff1a; 两个项目的代码在最前面添加&#xff1a; Impor…

新晋 Committer!来自复旦大学的帅哥一枚

点亮Star⭐️ 支持我们 https://github.com/apache/dolphinscheduler 最近&#xff0c;社区星力量又迎来一位新晋 Committer&#xff0c;这次是来自复旦大学研究生在读的王维饶同学&#xff0c;一起来认识一下吧&#xff01; 个人简介 姓名&#xff1a;王维饶职位&#xff1a…

从0到1构建证券行业组织级项目管理体系的探索与实践︱东吴证券PMO负责人娄鹏呈

东吴证券股份有限公司信息技术总部PMO负责人娄鹏呈先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;从0到1构建证券行业组织级项目管理体系的探索与实践。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&a…

简笔风和写实风的区别

现实主义和风格化 当我们谈论现实主义和风格化时&#xff0c;我们是什么意思&#xff1f;这看起来相当明显&#xff0c;现实主义指的是模仿逼真的逼真的图形。它不一定需要存在于现实世界中&#xff0c;但被传达为它属于我们的世界。10年前&#xff0c;我们认为现实的东西在今…

数据结构之vector的实现

数据结构之vector的实现 Vector类分为&#xff1a;构造函数、析构函数、只读函数、修改函数、私有函数、成员变量&#xff08;数据区和大小&#xff09; # include <iostream> # include <algorithm> # include <cstdlib># define DEFAULT_CAPACITY 3templat…

数学建模-图论 最短路径

作图 %% 注意&#xff1a;以下代码需要较新版本的matlab才能运行&#xff08;最好是2016版本及以上哦&#xff09; % 如果运行出错请下载新版的matlab代码再运行%% Matlab作无向图 % &#xff08;1&#xff09;无权重&#xff08;每条边的权重默认为1&#xff09; % 函数graph(…

SCT52A40,对标UCC27200、UCC27201半桥驱动IGBT/MOSFET栅极驱动器

特点&#xff1a; • 8-24V宽供电电压 • 驱动高侧和低侧N通道MOSFET • 4A峰值输出源电流和汇电流 • 升压电源电压范围可达120V • 集成阴极负载二极管 • TTL兼容输入&#xff0c;-10V输入 • 45ns传输延迟 • 1000pF负载下7ns上升和4.5ns下降时间 • 2ns延迟匹配时间 • 静…

[centos]安装mysql8.0.26

1、首先&#xff0c;根据自己的机子到MySQL官网下载对应的数据库https://dev.mysql.com/downloads/mysql/ 2、卸载mariadb&#xff0c;并解压Mysql 3、安装 rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm --nodeps rpm -ivh mysql-community-libs-8.0.26-1.el7.x…

《向量数据库指南》:向量数据库Pinecone快速入门

目录 ⚠️警告 ℹ️注意 ⚠️警告 如何开始使用Pinecone向量数据库。 本指南介绍如何在几分钟内设置Pinecone向量数据库。 安装Pinecone客户端(可选)此步骤是可选的。只有在您想使用Python客户端时才执行此步骤。 使用以下shell命令安装Pinecone: Python pip insta…

potplayer放大画面,画面拖拽。备份

放大画面&#xff1a; 按住alt和鼠标左键&#xff0c;就可以拖动放大后的画面了 窗口化示图

UE4/5AI制作基础AI跳跃(适合新手)

目录 制作 添加逻辑 添加导航链接代理 结果 在上一章中&#xff0c;我们讲解了简单的AI跟随玩家&#xff0c;制作了一个基础的ai。 UE4/5AI制作基础AI&#xff08;适合新手入门&#xff0c;运用黑板&#xff0c;行为树&#xff0c;ai控制器&#xff0c;角色类&#xff0c;任…

TCP实现FTP功能

目录 server client makefile 运行顺序 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上传输文件的标准协议。 它允许用户通过网络将文件从一个计算机&#xff08;称为FTP服务器&#xff09;传输到另一个计算机&#xff08;称为FTP客户端&…

【Python】pyinstaller全新的打包方案,堪称完善!

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤-*- mode: python ; coding: utf-8 -*-剩下的项就省略了-*- mode: python ; coding: utf-8 -*-用一个函数选择性对依赖文件目标路径改名打印 a.binaries&#xff0c;检查依赖文件目标路径剩下的省略了2. 第二步&#xff…

Taurus .Net Core 微服务开源框架:Admin 插件【4-3】 - 配置管理-Mvc【Plugin-MicroService 微服务】

目录 1、系统配置节点&#xff1a;Mvc - Plugin - MicroService 配置界面&#xff1a;注册中心 2、系统配置节点&#xff1a;Mvc - Plugin - MicroService 配置界面&#xff1a;注册中心&#xff08;从&#xff09; 3、系统配置节点&#xff1a;Mvc - Plugin - MicroService…

代码随香录day21

235. 二叉搜索树的最近公共祖先 本题思路&#xff1a; 还是要利用二叉搜索树的特性&#xff0c;中序遍历为有序数组。如果pq两个节点都小于root&#xff0c;那么最近公共祖肯定是在他的左子树&#xff0c;如果都大于那么&#xff0c;肯定就在右子树。然后直接return root 代码…

C++编程(四) —— OOP

文章目录 前言一、this指针二、构造和析构三、深拷贝浅拷贝浅拷贝深拷贝 编程实践 前言 什么是OOP思想&#xff1f; OOP语言的四大特征&#xff1a; 抽象&#xff0c;封装/隐藏&#xff0c;继承&#xff0c;多态 一、this指针 this指针》类》很多对象 一套成员方法是如何处…

04.MySQL——用户管理

用户管理 用户管理的价值 用户 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 use mysql;select host,user,authentication_string from user;host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是localhost&#xff0c;表示只能从…