oracle定时添加或删除分区表的分区

Oracle定时删除、增加表分区(TOAD,PL/SQL)   今日完成了这个任务,特做总结 首先,建立分区表。 CREATE TABLE MALS_NM_CPU_INFO_T_NEW(  HOST_IP        VARCHAR2(40 BYTE)              NOT NULL,  HOST_NAME      VARCHAR2(15 BYTE)              NOT NULL,  COMMIT_TM   阅读详情

平台如下:

os:centos4.7
oracle 10g

 

定时添加或删除分区表的分区

 

这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里
只保留最近指定的wareid的数据,考虑删除时对表的影响及便利性,我决定
把这个表建立成分区表,定期添加和删除分区

 

 

步骤:


1. 创建相关procedure
    pro_ADD_PARTITION_wareid    ---用户添加分区的过程
    pro_DROP_PARTITION_wareid   ---用户删除分区的过程
    pro_expdatainto_his         ---用户备份要删除分区数据的过程

2.创建系统上的脚本

3.用cron做定时任务

 


1. 创建相关procedure

 


CREATE OR REPLACE PROCEDURE pro_ADD_PARTITION_wareid(tablename      varchar2, ---要添加分区的表
                                                     partNum        NUMBER, --添加分区的个数
                                                     TableSpaceName VARCHAR2, --表空间名
                                                     wareidnum      number default 100 ---分区的范围
                                                     ) AS
  /*******************************************************
  author:skate
  time  :2009/02/28
  功能:添加分区表的指定分区
  说明:可以通过定时任务来完成自动添加分区,添加后要检查索引的状态
        最好是重建索引,以达到对表的分析
  eg:  exec pro_add_partition_wareid('d_order_bak',2,'yytickets','200');
  ********************************************************/

  v_SqlExec     VARCHAR2(2000); --DDL语句变量
  v_Partwareid1 number; --创建分区的wareid
  v_err_num     NUMBER; --ORA错误号
  v_err_msg     VARCHAR2(100); --错误描述

  v_part_wareid_max number; --tablename 表分区的最大wareid号
  v_begin           number; ----字符串的开始位置
  v_count           number; ----取多少个字符串
  v_part_name       varchar2(100); --要添加分区表的名称的前缀

BEGIN

  ----字符串的开始位置
  select INSTR(partition_name, '_', -1, 1) + 1
    into v_begin
    from user_tab_partitions
   where table_name = UPPER(tablename)
     and rownum < 2;

  ----取多少个字符串
  select length(partition_name) - v_begin + 1
    into v_count
    from user_tab_partitions
   where table_name = UPPER(tablename)
     and rownum < 2;

  --查询分区表tablename的最大wareid值
  select max(to_number(SUBSTR(partition_name, v_begin, v_count)))
    into v_part_wareid_max
    from user_tab_partitions
   WHERE table_name = UPPER(tablename);

  ---计算分区表的名称
  select SUBSTR(partition_name, 1, v_begin - 1)
    into v_part_name
    from user_tab_partitions
   WHERE table_name = UPPER(tablename)
     and rownum < 2;

  v_Partwareid1 := v_part_wareid_max;

  FOR i IN 1 .. partNum LOOP

    v_Partwareid1 := v_Partwareid1 + wareidnum; ----计算要添加分区的wareid

    
    
    v_SqlExec := 'ALTER TABLE ' || tablename || ' ADD PARTITION ' ||
                 v_part_name || v_Partwareid1 || ' values less than(' ||
                 v_Partwareid1 || ') TABLESPACE ' || TableSpaceName;
    dbms_output.put_line('创建 d_order 表分区' || i || '=' || v_SqlExec);
    DBMS_Utility.Exec_DDL_Statement(v_SqlExec);

  END LOOP;
  /*EXCEPTION
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := SUBSTR(SQLERRM, 1, 100);
    dbms_output.put_line('pro_ADD_PARTITION_wareid执行出现异常,错误码=' ||
                         v_err_num || '错误描述=' || v_err_msg);*/
 commit;                        
END pro_ADD_PARTITION_wareid;

 

##########################################################################################

删除分区的procedure:

 

CREATE OR REPLACE PROCEDURE pro_DROP_PARTITION_wareid(tablename    varchar2, ---要删除分区表的名称
                                                      beforewareid NUMBER default 200 --要保留最新多少wareid
                                                      ) As

  /*******************************************************
  author:skate
  time  :2009/02/28
  功能:删除分区表的指定分区
  说明:可以通过定时任务来完成自动删除分区,删除后要检查索引的状态
        最好是重建索引,以达到对表的分析

  eg:exec pro_drop_partition_wareid('d_order_bak',10800);
  ********************************************************/

  v_SqlExec VARCHAR2(2000); --DDL语句变量
  v_err_num NUMBER; --ORA错误号
  v_err_msg VARCHAR2(100); --错误描述

  v_begin       number; ----字符串的开始位置
  v_count       number; ----取多少个字符串
  v_ware_id     number;
  v_max_ware_id number;
  b  varchar2(10);
  
  cursor cursor_table_part is
    select partition_name
      from user_tab_partitions
     WHERE table_name = UPPER(tablename)
       AND SUBSTR(partition_name, v_begin, v_count) < v_ware_id
     ORDER BY partition_name;
 ---为禁用或启用约束而定义的游标
    cursor cursor_const_part is
    select b.constraint_name
      from user_constraints a, user_cons_columns b 
      where a.table_name=b.table_name
        and   a.constraint_name=b.constraint_name 
        and   a.owner='TICKETS'
        and   a.table_name=upper(tablename);
        
    ---为索引失效而重建索引定义游标
    cursor cursor_idx is 
    select index_name
      from user_indexes
     where table_name = UPPER(tablename)
       and status = 'UNUSABLE';
  

  record_table_oldpart cursor_table_part%rowType;
  record_cursor_const_part cursor_const_part%rowtype;
  record_cursor_idx cursor_idx%rowtype;

BEGIN

  ----字符串的开始位置
  select INSTR(partition_name, '_', -1, 1) + 1
    into v_begin
    from user_tab_partitions
   where table_name = UPPER(tablename)
     and rownum < 2;

  ----取多少个字符串
  select length(partition_name) - v_begin + 1
    into v_count
    from user_tab_partitions
   where table_name = UPPER(tablename)
     and rownum < 2;

  --确定要删除的最大wareid
  select max(to_number(substr(partition_name, v_begin, v_count)))
    into v_max_ware_id
    from user_tab_partitions
    where table_name = UPPER(tablename);

  --select max(w.ware_id) into v_max_ware_id from d_ware w;
  v_ware_id := v_max_ware_id - beforewareid;

    ---暂时禁用约束
    open cursor_const_part;
    loop
      fetch cursor_const_part into record_cursor_const_part;
      exit when cursor_const_part%notfound;
    
      execute immediate 'alter table '||tablename||' disable constraint '||record_cursor_const_part.constraint_name||' cascade';
    
    end loop;  
    close cursor_const_part;
 
  open cursor_table_part;
  loop
    fetch cursor_table_part
      into record_table_oldpart;
    exit when cursor_table_part%notfound;

    if substr(record_table_oldpart.partition_name, v_begin, v_count) <
       v_ware_id then
      --把要删除的数据提前备份到历史表里 
      pro_expdatainto_his(tablename,record_table_oldpart.partition_name,b); 
      
      --验证是否可以删除指定的分区表
      if (b='Y' or b='R') then 
      
        
         --删除 tablename 表分区
          
          v_SqlExec := 'ALTER TABLE ' || tablename || ' DROP PARTITION ' ||
                       record_table_oldpart.partition_name;
          dbms_output.put_line('删除' || tablename || '表分区=' || v_SqlExec);
          DBMS_Utility.Exec_DDL_Statement(v_SqlExec);
          
        
          
      elsif b='N' then
      exit;
      end if;
         
    end if;
  end loop;
  close cursor_table_part;
  
      ---启用约束
       open cursor_const_part;
         loop
          fetch cursor_const_part into record_cursor_const_part;
          exit when cursor_const_part%notfound;
          
           execute immediate 'alter table '||tablename||' enable novalidate constraint '||record_cursor_const_part.constraint_name;
          
         end loop;  
         close cursor_const_part;
         
     --重建失效的索引
        open cursor_idx;
        loop
          fetch cursor_idx into record_cursor_idx;
          exit when cursor_idx%notfound;
          
          execute immediate 'alter index ' ||record_cursor_idx.index_name||' rebuild';
         
         end loop;
         close  cursor_idx;

 

 

  /*EXCEPTION
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := SUBSTR(SQLERRM, 1, 100);
    dbms_output.put_line(pro_DROP_PARTITION_wareid ||
                         '执行出现异常,错误码=' || v_err_num ||
                         '错误描述=' || v_err_msg);*/

 


END pro_DROP_PARTITION_wareid;
 

 

 

 

#########################################################################################

 

这个存储过程用户在删除分区的时候,用户备份所删除的分区表


create or replace procedure pro_expdatainto_his(tablename      varchar2,---要导数据的表名
                                                part_tablename varchar2,---要导数据的分区表名
                                                issuccess      in out varchar2)--返回是否导入成功 (Y:成功 N:失败 R:之前已经导入过了)
                                                 as

  v_SqlExechis VARCHAR2(2000); --DDL语句变量
  v_SqlExec    VARCHAR2(2000); --DDL语句变量
  v_count      number(30);     --本次导入的数据行数
  v_expcount   number(30);     --历史表中有多少符合本次导入的行数
  /*******************************************************
  author:skate
  time  :2009/04/15
  功能:把预删除的分区表的数据提前导入到历史表中
  说明:这个程序是配合定时删除分区的过程,pro_add_partition_wareid调用
        此过程,本过程适合如下表:
          D_ORDER
          D_ORDER_DETAIL
          D_PRINT_BATCH
          d_batch_detail
         
         如果想让其适合其他表,只要做简单修改即可 
          
  eg:  exec pro_expdatainto_his('d_order','D_ORDER_P_31100',b);
  
  注意:本procedure的表名用到了变量,所以要用动态sql来执行:execute immediate
  ********************************************************/  
  
begin


  if upper(tablename) = 'D_ORDER' then
  
    v_SqlExec := 'select count(1) from ' || tablename || ' partition(' ||
                 part_tablename || ')';
    --准备导入多少行数据             
    execute immediate v_SqlExec
      into v_count;
   --执行导入操作
    execute immediate 'insert into ' || tablename ||
                      '_his  select * from '||tablename||' partition(' ||
                      part_tablename || ') nologing';
  
    v_SqlExechis := 'select count(1)  from ' || tablename || '_his th ,' ||
                    tablename || ' partition(' || part_tablename ||
                    ') t where t.order_id=th.order_id';
  
   --在历史表中有多少和本此导入相同的记录
    execute immediate v_SqlExechis
      into v_expcount;
  
  elsif upper(tablename) = 'D_ORDER_DETAIL' then
  
    v_SqlExec := 'select count(1) from ' || tablename || ' partition(' ||
                 part_tablename || ')';
    execute immediate v_SqlExec
      into v_count;
  
    execute immediate 'insert into ' || tablename ||'_his  select * from '||tablename||' partition('||part_tablename || ') nologing';
  
    v_SqlExechis := 'select count(1)  from ' || tablename || '_his th ,' ||tablename || ' partition(' || part_tablename ||') t where t.detail_id=th.detail_id';
  
    execute immediate v_SqlExechis
      into v_expcount;
  
  elsif upper(tablename) = 'D_PRINT_BATCH' then
  
    v_SqlExec := 'select count(1) from ' || tablename || ' partition(' ||
                 part_tablename || ')';
    execute immediate v_SqlExec
      into v_count;
  
    execute immediate 'insert into ' || tablename ||
                      '_his  select * from '||tablename||' partition(' ||
                      part_tablename || ') nologing';
  
    v_SqlExechis := 'select count(1)  from ' || tablename || '_his th ,' ||
                    tablename || ' partition(' || part_tablename ||
                    ') t where t.batch_id=th.batch_id';
  
    execute immediate v_SqlExechis
      into v_expcount;
  
  elsif upper(tablename) = upper('d_batch_detail') then
  
    v_SqlExec := 'select count(1) from ' || tablename || ' partition(' ||
                 part_tablename || ')';
    execute immediate v_SqlExec
      into v_count;
  
    execute immediate 'insert into ' || tablename ||
                      '_his  select * from '||tablename||' partition(' ||
                      part_tablename || ') nologing';
  
    v_SqlExechis := 'select count(1)  from ' || tablename || '_his th ,' ||
                    tablename || ' partition(' || part_tablename ||
                    ') t where t.batch_detail_id=th.batch_detail_id';
  
    execute immediate v_SqlExechis
      into v_expcount;
  
  end if;

--验证是否导入成功,如果成功就commit,否则rollback
  if v_count = v_expcount then
    issuccess := 'Y';
    commit;
  elsif v_count * 2 = v_expcount then
    issuccess := 'R';
    rollback;
  else
    issuccess := 'N';
    rollback;
  end if;

end pro_expdatainto_his;

 

################################################################

 

2.创建系统上的脚本

 

 

[oracle@svr-db-test sh]$ more ticket_del_part.sh
cd /home/oracle/sh
date
sqlplus /nolog @ ticket_del_part.sql
date
[oracle@svr-db-test sh]$


[oracle@svr-db-test sh]$ more ticket_del_part.sql 
connect tickets/123456
set timing on
exec  pro_drop_partition_wareid('d_order',50);
exec  pro_drop_partition_wareid('d_order_detail',50);
exec  pro_drop_partition_wareid('D_PRINT_BATCH',50);

exit
[oracle@svr-db-test sh]$

 

3.用cron做定时任务

在oracle用户的crontab下增加一条定时任务即可:


#delete partition

1 */3 * * * sh /home/oracle/sh/ticket_del_part.sh >> /home/oracle/sh/ticket_del_part.log

【联邦学习】联邦平均(FedAvg)_附pytorch代码实现 其他代码包括1)数据集划分;2)训练;3)保存结果;4)绘图都可在 https://github.com/kt4ngw/fedavg-pytorch 找到。如果您对文章有建议及指定,也欢迎您留言评论,作者定当虚心修正。 阅读详情

相关推荐

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4899

oracle 数据库通过job定时删除表分区-ok

oracle 数据库通过job定时删除表分区-ok

u013737399的博客 1691

STM32 BLDC无刷电机霍尔信号捕获与换相控制实战解析

本文深入解析了STM32如何实现BLDC无刷电机的霍尔信号捕获与换相控制。详细阐述了硬件接口配置、定时器霍尔传感器模式的使用、抗干扰的滤波器与软件容错设计,以及中断服务与换相逻辑的实战代码。重点解决了信号抖动、换相不准等常见问题,旨在帮助开发者构建稳定可靠的电机驱动基础。

weixin_29193259的博客 370

Oracle 根据日期自动分区 定时删除分区数据

Oracle 自动分区

weixin_44041875的博客 1909

【SWAT水文模型】SWAT-CUP参数率定与模型验证实战指南

本文提供了SWAT水文模型参数率定与模型验证的完整实战指南。详细介绍了如何使用SWAT-CUP工具,特别是SUFI-2算法,进行自动化参数校准,并阐述了模型验证的关键步骤以避免过度拟合。内容涵盖从工程搭建、核心参数选择、迭代优化到结果分析与常见问题排查的全流程,旨在帮助用户提升SWAT模型模拟的准确性与可靠性。

weixin_29072299的博客 501

告别黑窗口:XShell+X11转发图形化界面的5分钟保姆级教程(附Xming配置)

本文详细介绍了如何使用XShell和X11转发技术快速实现Linux图形化界面的远程访问。通过5分钟快速配置指南,包括服务端设置、客户端工具选择及XShell+Xming的完美配置,帮助用户高效运行GUI应用程序,提升远程工作效率。特别适合需要图形化操作的开发者和运维人员。

weixin_29223603的博客 328

创建定时任务删除Oracle分区

--建测试分区表 CREATE TABLE "DB"."NXZ_TEST" ( "name" VARCHAR2(400), "dates" TIMESTAMP (6) DEFAULT sysdate, CONSTRAINT "NXZ_TEST_PK" PRIMARY KEY ("name") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1

huangrunxing的专栏 871

JetBrains Air:多Agent协同的IDE运行时架构解析

IDE智能编程正从单模型增强迈向多Agent协同范式。多Agent架构通过职责分离、上下文精简与运行时隔离,显著提升代码生成稳定性与合规性;其核心依赖轻量级嵌入式运行时(如ARL),支持AST级内存共享、eBPF安全拦截与毫秒级冷启动。该架构天然适配本地化部署、离线开发与高安全合规场景(如PCI-DSS、金融内网),并为Java/Python/TS等语言提供可扩展的规则驱动开发流水线。JetBrains Air正是这一技术路径的工程化落地代表。

weixin_30443075的博客 578

oracle删除子分区限定值,oracle定时添加或删除分区表的分区 - 冰刀(skate) - 博客频道 - 优快云...

分类: oracle 管理知识总结有奖征资源,博文分享有内涵 4月推荐博文汇总 专访朱燚:弃移动和互联网应用战场转战传统应用的弄潮儿oracle定时添加或删除分区表的分区2009-04-15 20:07 5921人阅读 评论(1) 收藏 举报oracle table user insert constraints exceptionauthor :skatetime : 2009/04/15平台如...

weixin_34430692的博客 216

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

避开SiC MOSFET驱动设计的3个大坑:电流/电阻/电压配置全指南

本文深入解析SiC MOSFET驱动设计中的三大关键参数:驱动电流、栅极电阻和工作电压,揭示常见设计误区与优化方案。通过实际案例与数据对比,指导工程师避开第三代电力电子半导体应用中的典型陷阱,提升系统可靠性与效率。特别针对驱动电源配置、栅极电阻选型等核心问题提供可落地的解决方案。

weixin_29214199的博客 385

oracle定时创建分区,oracle定时添加或删除分区表的分区

oracle定时添加或删除分区表的分区 收藏author:skatetime: 2009/04/15--------------------------------------------------------------------------------平台如下:os:centos4.7oracle 10g定时添加或删除分区表的分区这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表...

weixin_28700593的博客 765

SAP DRC 是什么?一文读懂 SAP Document and Reporting Compliance 的定位、架构与落地案例

把视线拉长,会发现SAP DRC的价值并不仅是用来交差的工具。它更像是企业在全球化经营中建设的一套公共底座:既能以最低的重复成本去应对各国不断演进的监管要求,也能为财务数字化与供应链协同提供可信数据回路。依托本地与云的分层职责、与的生态联动、以及按国家不断更新的任务目录,企业可以将合规变成一种标准化、工程化、可持续运营的能力。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1656

oracle 定时修改表,oracle定时添加或删除分区表的分区

author:skatetime: 2009/04/15平台如下:os:centos4.7oracle 10g定时添加或删除分区表的分区这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里只保留最近指定的wareid的数据,考虑删除时对表的影响及便利性,我决定把这个表建立成分区表,定期添加和删除分区步骤:1. 创建相关procedurepro_ADD_PARTITION_wareid...

weixin_29432863的博客 253

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

oracle 指定分区删表,引用 oracle定时添加或删除分区表的分区

定时添加或删除分区表的分区这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里只保留最近指定的wareid的数据,考虑删除时对表的影响及便利性,我决定把这个表建立成分区表,定期添加和删除分区步骤:1. 创建相关procedurepro_ADD_PARTITION_wareid ---用户添加分区的过程pro_DROP_PARTITION_wareid ---用户删除分区的过程p...

weixin_31041421的博客 272

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2010年8月9日——oracle定时添加或删除分区表的分区

author:skatetime: 2009/04/15--------------------------------------------------------------------------------平台如下:os:centos4.7oracle 10g定时添加或删除分区表的分区这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里只保留最近指定的wareid的数据,考虑删除时对表的影响及便利性,我决定把这个表建立成分区表,定期添加和删除分区步骤:1. 创建相关procedure  

Alim之家 527

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

工业电源路径保护:TPS259483AYWPR与PIC18LF4550的eFuse可编程方案

在工业供电环境中,母线波动、浪涌冲击和热插拔短路是导致后级电路损坏的主要原因。eFuse(电子熔断器)作为一种可恢复的主动保护器件,通过限流与过压钳位机制,在异常发生的微秒级时间内切断或限制通路,相比一次性保险丝和TVS具备可编程、可观测、可恢复的技术价值。其典型应用覆盖工业网关、PLC扩展模块、现场仪表及嵌入式数据采集终端。当eFuse与MCU配合时,保护逻辑从硬件固定升级为软件可编程,实现故障分级响应与状态上报。本文以TPS259483AYWPR与PIC18LF4550的组合为例,深入解析限流阈值设计、

weixin_34082695的博客 314

oracle定时添加或删除分区表的分区 存儲過程 增刪分區 操作分區表, 包 pl/sql

oracle定时添加或删除分区表的分区 存儲過程 增刪分區 操作分區表, 包 pl/sql 本定时创建的是以时间 做为分区表的分区字段 ,字段类型是timestamp   先创建包头:     create or replace package pkg_partition_alter is /** date:2010-09-14 author:wanggang */ ...

阿哥的专栏 296

oracle 定时器时间分区_oracle分区表定时添加删除分区

创建相关procedurepro_ADD_PARTITION_wareid ---用户添加分区的过程pro_DROP_PARTITION_wareid ---用户删除分区的过程pro_expdatainto_his---用户备份要删除分区数据的过程----环境准备create table t_auto_p( seqnumber not null,idint,constraint t_au...

weixin_39795116的博客 344

oracle 定时器时间分区_oracle按时间创建分区表

首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现。当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO。oracle分区表是oracle数据库提供的一种表分区的实现形式。表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表一、分区表基本操作1、按时间分区表创建:create table t_t...

weixin_36160225的博客 353

定时添加或删除分区表分区的方法

平台如下: os:centos4.7 oracle 10g 定时添加或删除分区表的分区 这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里 只保留最近指定的wareid的数据,考虑删除时对表的影响及便利性,我决定 把这个表建立成分区表,定期添加和删除分区 步骤: 1. 创建相关procedure     pro_ADD_PARTITION_wareid    --

HUONG的专栏 1012
上一篇: 自动导出数据库分区表数据
下一篇: 分区索引总结
myheartjava
博客等级 码龄14年 6粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值