如何创建MySQL存储过程,这是一个问题!且看大佬如何整理剖析

MySQL查询缓存深度剖析 在高并发写入环境中可能成为瓶颈MySQL 5.7中默认关闭(官方不再推荐)使用Redis等外部缓存替代方案可能更灵活建议在实际部署前进行压力测试,监控(内存不足导致的缓存清除)指标,根据业务特点动态调整配置。缓存策略本质上是用内存空间换取CPU时间,找到这个平衡点才能发挥最大价值。 阅读详情

简单地说,存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。本篇主要介绍如何创建存储过程和存储函数以及变量的使用,如何调用、查看、修改、删除存储过程和存储函数等。

存储程序可以分为存储过程和函数,MySQL 中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能用输出变量返回值。函数可以从语句外调用(即通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。

如何创建MySQL存储过程,这是一个问题!且看大佬如何整理剖析

 

创建存储过程

创建存储过程,需要使用CREATE PROCEDURE语句,基本语法格式如下:

CREATE PROCEDURE sp name ( [ proc parameter])
[ characteristics…] routine_ body

CREATE PROCEDURE为用来创建存储函数的关键字: sp_ _name为存储过程的名称;proc_ parameter 为指定存储过程的参数列表,列表形式如下:

[N1 OUT 1 INOUT] param name type

其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_ name表示参数名称; type 表示参数的类型,该类型可以是MySQL数据库中的任意类型。

characteristics指定存储过程的特性,有以下取值:

  • LANGUAGESQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值。
  • [NOT] DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC 表示.结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOTDETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC.
  • { CONTAINS SQL |NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句; NO SQL表明子程序不包含SQL语句; READS SQL DATA说明子程序包含读数据的语句; MODIFIES SQL DATA表明子程序包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。
  • SQL SECURITY { DEFINER |INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者才能执行。INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。
  • COMMENT 'string': 注释信息,可以用来描述存储过程或函数。

routine_ body是SQL代码的内容,可以用BEGIN.END来表示SQL代码的开始和结束。编写存储过程并不是件简单的事情,可能存储过程中需要复杂的SQL语句,并且要有创建存储过程的权限;但是使用存储过程将简化操作,减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此存储过程是非常有用的,而且应该尽可能地学会使用。

下面的代码演示了存储过程的内容,名称为AvgFruitPrice,返回所有水果的平均价格,输入代码如下:

CREATE PROCEDURE AvgFruitPrice ()
BEGIN
SELECT AVG(f price) AS avgprice
FROM fruits;
END;

上述代码中,此存储过程名为AvgFruitPrice, 使用CREATE PROCEDURE AvgFruitPrice 0语句定义。此存储过程没有参数,但是后面的0仍然需要。BEGIN和END语句用来限定存储过程体,过程本身仅是一个简单的SELECT语句(AVG为求字段平均值的函数)。

创建查看fruits 表的存储过程,代码如下:

CREATE PROCEDURE Proc()
BEGIN
SELECT * FROM fruits;
END;

这行代码创建了一个查看fruits表的存储过程,每次调用这个存储过程的时候都会执行SELECT语句查看表的内容,代码的执行过程如下:

MySQL> DELIMITER //
MySQL> CREATE PROCEDURE Proc ()
-> BEGIN
-> SELECT ★FROM fruits;
-> END
//
Query OK, 0 rows affected (0.00 sec)
MySQL> DELIMITER ;

这个存储过程和使用SELECT语句查看表的效果得到的结果是一样的,当然存储过程也可以是很多语句的复杂组合,其本身也可以调用其他的函数来组成更加复杂的操作。

“DELIMITER //”语句的作用是将MySQL的结束符设置为//,因为MySQL默认的语句结束符号为分号;’,为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符,并以“END//" 结束存储过程。存储过程定义完毕之后再使用“DELIMITER;”" 恢复默认结束符。DELIMITER 也可以指定其他符号作为结束符。

创建名称为CountProc的存储过程,代码如下:

CREATE PROCEDURE CountProc (OUT paraml INT)
BEGIN
SELECT COUNT(*) INTO paraml FROM fruits;
END;

上述代码的作用是创建-一个获取fruits 表记录条数的存储过程,名称是CountProc,COUNT(*)计算后把结果放入参数paraml中。代码的执行结果如下:

mysq1> DELIMITER 11
mysql> CREATE PROCEDURE CountProc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM fruits;
-> END //
Query OK, 0 rows affected (0.00 sec)
mysq1> DELIMITER ;

当使用DELIMITER命令时,应该避免使用反斜杠(“\' )字符,因为反斜线是MySQL的转义字符。

创建存储函数

创建存储函数,需要使用CREATE FUNCTION语句,基本语法格式如下:

CREATE FUNCTION func name ( [func_ parameter] )
RETURNS type
[characteristic ...] routine_ body

CREATE FUNCTION为用来创建存储函数的关键字; func_ _name 表示存储函数的名称;func_ parameter 为存储过程的参数列表,参数列表形式如下:

[ INIOUT 1 INOUT ] param name type

其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_ name表示参数名称; type 表示参数的类型,该类型可以是MySQL数据库中的任意类型。

RETURNS type 语句表示函数返回数据的类型; characteristic 指定存储函数的特性,取值与创建存储过程时相同,这里不再赘述。

创建存储函数,名称为NameByZip,该函数返回SELECT语句的查询结果,数值类型为字符串型,代码如下:

CREATE FUNCTION NameByZip ()
RETURNS CHAR(50)
RETURN (SELECT s_ name FROM suppliers WHERE S call= 148075') ;

创建一个存储函数, 参数定义为空,返回-一个INT类型的结果。代码的执行结果如下:

mysq1> DELIMITER //
mysql> CREATE FUNCTION NameByZip ()
-> RETURNS CHAR(50)
-> RETURN 设(SELECT s name FROM suppliers WHERE 8 call= 1480755);
-> //
Query OK,0 rows affected (0.12 sec)
mysq1> DELIMITER ;

如果在存储函数中的RETURN语句返回一个类型不同于函数的RETURNS子句中指定类型的值,返回值将被强制为恰当的类型。比如,如果-一个函数返回-一个ENUM或SET值,但是RETURN语句返回一个整数,对于SET成员集的相应的ENUM成员,从函数返回的值是字符串。

指定参数为IN、ouT或INOUT只对PROCEDURE是合法的。(FUNCTION 中总是默认为IN参数)。RETURNS子句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

变量的使用

变量可以在子程序中声明并使用,这些变量的作用范围是在BEGIN..END程序中,本小节主要介绍如何定义变量和为变量赋值。

1、定义变量

在存储过程中使用DECLARE语句定义变量,语法格式如下:

DECLARE var name [, varname]. date type [ DEFAULT value] ;

var_ name为局部变量的名称。DEFAULT value子句给变量提供一个默认值。 值除了可以被声明为一个常数之外,还可以被指定为一个表达式。如果没有DEFAULT 子句,初始值为NULL.

定义名称为myparam的变量,类型为INT类型,默认值为100,代码如下:

DECLARE myparam INT DEFAULT 100;

2、为变量赋值

定义变量之后为变量赋值可以改变变量的默认值MySQL中使用SET语句为变量赋值,语法格式如下:

SET var_ name来expr[,var_ name = expr] ....

在存储程序中的SET语句是一-般SET语句的扩展版本。被参考变量可能是子程序内声明的变量,或者是全局服务器变量,如系统变量或者用户变量。

在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x,b=y, .这样的扩展语法。其中不同的变量类型(局域声明变量及全局变量)可以被混合起来。这也允许把局部变量和--些只对系统变量有意义的选项合并起来。

声明3个变量,分别为varl、var2 和var3,数据类型为INT,使用SET为变量赋值,代码如下:

DECLARE var1, var2, var3 INT;
SET var1 =10, var2 = 20;
SET var3 =varl+var2;

MySQL中还可以通过SELECT ... INTO为-一个或多个变量赋值,语法如下:

SELECT col name[,...] INTO var name[, ...] table_ expr;

这个SELECT语法把选定的列直接存储到对应位置的变量。col name 表示字段名称;var_ name表示定义的变量名称table_ _expr 表示查询条件表达式包括表名称和WHERE子句。

声明变量fruitname 和fruitprice, 通过SELECT ... INtO语句查询指定记录并为变量赋值,代码如下:

DECLARE fruitname CHAR(50) ;
DECLARE fruitprice DECIMAL(8,2) ;
SELECT f_name, f_price INTO fruitname, fruitprice
FROM fruits WHEREf id ='al' ;

以上就是小编整理的MySQL的创建存储过程,只是小编的个人理解,有哪里不准确的地方,还请大家多多指出,小编和大家一起共同进步~~~

喜欢小编请多多点赞评论分享,关注小编,后续小编会带来更多的内容更新,希望能够帮到大家更好的学习!!!

MySQL之查询缓存:深度剖析、优化与替代方案 在MySQL数据库的学习和使用过程中,我发现查询缓存是一个对性能影响较大且较为复杂的功能。深入研究它之后,我收获了很多经验,今天就想和大家分享一下,希望能和大家一起学习进步,让我们在使用MySQL时能更好地利用查询缓存提升系统性能。 阅读详情

相关推荐

一杯茶,带你了解MySQL连接器

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

2401_83411843的博客 1024

MySQL-变量/错误处理(GLOBAL/SESSION/SET/DECLARE CONDITION FOR/DECALRE HANDLER FOR)

在 MySQL 数据库中,变量分为 系统变量 以及 用户自定义变量。 变量由系统定义,不是用户定义,属于 服务器 层面。启动MySQL服务,生成MySQL服务实例期间, MySQL将为MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例的属性、特征。这些系统变量的值要么是编译MySQL时参数的默认值,要么是配置文件 (例如my.ini等)中的参数值。 系统变量分为全局系统变量(需要添加 global 关键字)以及会话系统变量(需要添加 session 关

萌萌虎的博客 1038

Word多级标题出现黑块的解决思路(word 数字必须介于1-1638之间)

遇到多级目录出现黑块问题,看到一篇博客完美解决,在此记录。

AI_Optimization的博客 3717

22MySQL变量

😹 作者: gh-xiaohe 😻 gh-xiaohe的博客 😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

gh_xiaohe的博客 627

数字信号处理实验:信号谱分析与FFT算法的应用

​ (1)给定信号为 ,其中a为42,b为1。理论分析信号 的频率成分。 (2)分别采用采样频率为 , , , 对 进行采样,其中 , , , ,根据是否满足采样定理要求分析四种采样频率下频谱的分布,在满足采样定理情况下做频谱分析。 (3)任意生成两组有限长信号,对信号分别进行直接卷积和FFT算法求卷积,并分析圆周卷积与线性卷积的关系。

m0_56324525的博客 3204

UHPC的疲劳计算——兼论ModelCode2010的适用性

ModelCode2010的混凝土疲劳计算方法是适用于UHPC的。

George的博客 1325

07-MySQL存储过程与函数

07-MySQL存储过程与函数 07-MySQL存储过程与函数 1 创建存储过程和函数 1.1 创建存储过程 1.2 创建存储函数 1.3 变量的使用 1.4 定义条件和处理程序 1.5 流程控制语句 1.5.1 IF语句 1.5.2 CASE 语句 1.5.3 LOOP语句 1.5.4 LEAVE语句 1.5.5 ITERATE语句 1.5.6 REPEAT 语句 1.5.7 WHIL...

EC的博客 478

GD32单片机引脚复用指南:如何让JTAG接口的PA15/PB3发挥第二功能?

本文详细介绍了GD32F103Cx系列单片机如何通过AFIO模块进行引脚复用,特别是将默认用于JTAG调试接口的PA15、PB3等引脚释放为普通IO或复用功能引脚。文章从原理出发,结合代码实践,讲解了如何配置调试端口重映射,将JTAG引脚安全地转换为GPIO或定时器通道,并提供了常见问题排查与最佳实践,帮助开发者高效利用有限的引脚资源。

nept的博客 810

MySQl中DECLARE的顺序

WFY_WFY的博客 767

电路保护设计实战:保险丝选型、I²t计算与多级协同方案

电路保护是电子系统可靠性的基石,其核心原理是在发生过流或过压等异常情况时,及时切断故障回路,防止能量持续灌入导致元器件损坏甚至安全事故。从技术价值看,优秀的保护设计能显著提升产品寿命、安全性和市场口碑,尤其在快充、电动汽车等高功率密度应用中,保护器件已成为不可或缺的安全屏障。在众多保护器件中,保险丝作为最基础的过流保护元件,其正确选型与应用直接关系到保护效果。本文聚焦于保险丝选型的实战细节,深入解析了I²t(电流平方时间积)这一关键参数,它定义了熔断所需的能量阈值,是匹配被保护半导体器件耐受能力、实现有效保

weixin_42662171的博客 309

iOS远程真机之ios-minicap安装使用完全指南

minicap 是开源项目 STF 中的高速截图工具。STF利用此工具不断的传输图片信息并在web端绘制实现 以前只有Android版本,最近有新的ios版本,现在就安装过程中遇到的一些问题进行分享(ps:感谢sorccu 在issue里面给我的指点) 首先上地址:https://github.com/openstf/ios-minicap 你可以git clone或者直接下载zip包。

甫式人生 1万+

MySQL一揽子方案高级

MySQL一揽子方案高级

gsdgsdfs的博客 670

大厂硬件机试选择题与判断题解析-卷1

本文精选30道硬件工程师机试题目,涵盖模拟电路、数字电路、PCB设计三大方向。模拟电路部分重点考察运算放大器、滤波器、整流电路等核心知识;数字电路部分聚焦计数器、电平转换等关键技术;PCB设计部分强调高速信号处理、阻抗控制等实践要点。题目均来自华为、小米等大厂真题,剔除基础题,每道题附详细解析,包括正确答案推导过程及相关公式说明。特别针对易错概念(如负反馈类型判断、Q值与带宽关系等)进行重点解析,帮助考生系统掌握硬件设计的核心考点和解题思路。

启芯硬件的博客 679

mysql建表存储过程实例_如何创建MySQL存储过程,这是一个问题!且看大佬如何整理剖析...

简单地说,存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。本篇主要介绍如何创建存储过程和存储函数以及变量的使用,如何调用、查看、修改、删除存储过程和存储函数等。存储程序可以分为存储过程和函数,MySQL 中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能用输出变量返回值。函数...

weixin_39639514的博客 203

RT-DETR 模型剪枝优化:结构化剪枝对 R18/R50 性能的影响

本文提出分层结构化剪枝策略R18:参数量减少 42%(28M→16.2M),推理速度提升 35%(15→20.3 FPS@Jetson Nano),mAP@0.5 仅降 1.2%;R50:参数量减少 55%(170M→76.5M),推理速度提升 48%(42→62.2 FPS@T4),mAP@0.5 仅降 2.1%。核心价值:为 RT-DETR 提供“精度-效率-部署”平衡的轻量化方案,推动其在边缘设备、工业质检等场景的大规模落地。部署建议。

走向CTO的路上... 466

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

获取mysql存储过程返回值_如何创建MySQL存储过程,这是一个问题!且看大佬如何整理剖析...

简单地说,存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。本篇主要介绍如何创建存储过程和存储函数以及变量的使用,如何调用、查看、修改、删除存储过程和存储函数等。存储程序可以分为存储过程和函数,MySQL 中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能用输出变量返回值。函数...

weixin_39811193的博客 311

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Mysql知识点整理

Mysql知识点整理

xiaohuihuiaz的博客 393

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL 知识点整理

文章目录1. 架构1.1 连接器:管理连接,身份认证1.2 查询缓存:命中则返回结果1.3 分析器:词法分析,语法分析1.4 优化器:执行计划生成1.5 执行器:权限认证,操作引擎,返回结果1.6 存储引擎:存储数据,提供读写接口1.7 查询SQL执行流程1.8 更新SQL执行流程1.8.1 执行器和 InnoDB 引擎内部流程1.9 binlog 与 redo log1.9.1 WAL1.9.2 binlog1.9.3 redo log1.9.4 binlog和redo log区别1.9.5 二阶段提交1

shpunishment的博客 2154

mysql limit原理_Mysql架构整理

MySql的架构原理mysql架构原理图执行流程图 MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层一、网络连接层客户端连接器(Client Connectors ,和谁通信)提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务端编程技术,例如常见的 Java、C、Python、.NET等,它们通过各自API技术与MySQL建立连接。二、服务层(My...

weixin_39787057的博客 557

mysql 给几个主键值 批量校验是否存在_MySQL基础知识整理

MySQL基础架构MySQL基础架构简单来说MySQL主要分为Server层和存储引擎层。Server层主要包括连接器、查询缓存、分析器、优化器和执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binglog。存储引擎层主要负责数据的存储和读取,采用可以替换的插件式架构,支持InnoDB、MyISAM和Memory等多个存储引擎,其中Inn...

weixin_39568889的博客 925

Linux 下的MySQL调优

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33896069的博客 898

【MySQL数据库原理 零】MySQL数据库原理看这一篇就够了

MySQL是使用最广泛的数据库,只有理解了其底层机制,才能更好的写出高性能的SQL查询,所谓知其然,也要知其所以然。本篇Chat为接下来的深入理解MySQL数据原理 精华版本,重点知识,如果某个知识点不理解,可以再深入的看本专栏中的其它Blog内容介绍。 MySQL架构及查询语句执行流程,一条SQL语句的执行流程,MySQL数据库的整体结构 MySQL数据库存储引擎,InnoDB和MyISAM的区别,InnoDB的优势 MySQL日志机制,MySQL的两种日志,日志的作用是什么 MySQL数据库索引,索引

MaoLin Tian's Blog 4921

离开小厂进大厂的第一周,mysql创建存储过程语法

前言 “大专人大专魂,大专都是人上人” 当我看到这句话突然就在各个平台火了之后,又开始涌现出了一批又一批抨击专科的网友。 其中有一条评论我记忆犹新:大专生努力做什么都行,就是别做程序员了,别祸害IT届拉低档次了。看完这条评论时我实在耐不住心情促使我敲出这篇文章。作为一个专科毕业成为程序员的人,我发现大家对专科生当程序员这件事恶意满满,不少人说大专能当程序员?大专能进大厂?大专出身,做Java程序员真的没有春天吗? 流程描述 我们从bind函数开始: 1、首先创建了两个NioEventLoopGroup,这是

m0_57983312的博客 119

[MySQL进阶]——逻辑架构

本文带你深入学习mysql的逻辑架构,帮助你更好地理解mysql的原理

热爱编程的机械生的救赎 2099

mysql 存储过程 百万数据 innodb_重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB

本文转自互联网本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:http://www.how2playlife.com本文是微信公众号【Java技术江湖】的《重新学习MySQL数据库》其中一篇,本文部分内容来源于网络,为了把本文主题...

weixin_39614877的博客 78

数据库知识点整理

1. 什么是存储过程以及存储过程的调用 存储过程是一个预编译的SQL语句集,优点是允许模块化的设计,只需创建一次在之后可以多次调用。如果某次操作需要执行多次SQL,使用存储过程比单纯执行SQL语句要快。 存储过程的调用:(1)可以用一个命令对象调用;可以供外部程序调用(如java程序)。 CREATE PROCEDURE order_tot_amt @o_id int, @p_tot int ou...

weixin_40259742的博客 309
上一篇: 天才!刚入职阿里P6,是如何凭借Dubbo实战一路逆袭P8的?
下一篇: 20年清华扫地僧,整理的Storm、Spark学习笔记,面试官:拿来看看
Java领域指导者
博客等级 码龄7年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值