PL/SQL Developer 配置与调试实战:Oracle 开发高效工作台
简介本资源为Oracle数据库专业开发工具PL/SQL Developer的完整安装包面向数据库管理员、后端开发工程师及Oracle初学者解决Oracle环境下的高效编码、调试、对象管理与性能优化等核心开发需求。压缩包为RAR格式大小19.05MB虽未提供具体文件列表但典型安装包包含可执行程序、语言资源含完整中文化界面、配置模板及帮助文档支撑开箱即用的本地部署与快速上手。已有191人学习下载反映出其在国产Oracle开发场景中的实用认可度。用户可直接部署该成熟IDE获得语法高亮、智能提示、断点调试、SQL执行分析、Explain Plan性能诊断、SVN/Git版本集成等一站式能力显著提升PL/SQL开发效率与代码质量尤其适合需兼顾教学演示、日常运维与复杂存储过程开发的技术人员。1. PL/SQL Developer 是什么不是 Oracle 官方工具但却是 Oracle 数据库开发中事实上的“工作台”你刚接手一个遗留 Oracle 系统DBA 给了你一套 .sql 脚本、几个存储过程定义和一份模糊的“数据清洗逻辑说明”要求三天内跑通并输出校验报告——这时候打开 SQL*Plus 手敲clean_data.sql再逐行EXEC包体最后靠SELECT * FROM user_errors查编译失败别折腾了。PL/SQL Developer 就是为这种场景生的它不是 Oracle 官方出品官方推荐的是 SQL Developer 和 Oracle SQLcl但过去二十年里国内绝大多数 Oracle 开发者、DBA、ETL 工程师的桌面右下角永远停着一个蓝白相间的 PL/SQL Developer 图标。它不解决高并发压测或分布式事务调度但它把“写、调试、查、导、比、回滚”这六件事压缩进一个带语法高亮、断点单步、对象浏览器、会话监控、SQL 历史回溯的单进程 GUI 里。适合谁Oracle 10g 到 19c 的存量系统维护者、需要快速验证 PL/SQL 逻辑的 BI 工程师、被甲方要求提供可复现 SQL 脚本的外包团队。它不替代 SQL Developer 的跨数据库能力也不对标 DataGrip 的智能补全但它在 Oracle 生态里至今仍是“改一行包体、立刻 F8 运行、看变量值、CtrlR 回滚”的最短路径。2. 安装与连接配置绕过 Oracle Client 全家桶用精简 Instant Client TNS 配置直连PL/SQL Developer 本身不自带 Oracle 连接驱动它依赖本地已安装的 Oracle 客户端环境。但现实是很多开发机上根本没装 Oracle Database 或完整 Oracle Client动辄 2GB还要配环境变量、注册表。这时候必须走轻量级方案Oracle 官方提供的Instant Client即时客户端。2.1 下载与解压 Instant Client以 Windows x64 为例去 Oracle 官网下载页面搜索 “Oracle Instant Client Downloads”选择对应 Oracle 数据库版本的 Basic 或 Basic Light 包推荐 Basic Light约 50MB含核心 OCI 库不含中文字符集支持够用。注意不要下 SDK 包除非你要编译 C 程序也不要下 SQL*Plus 包PL/SQL Developer 不调用它。# 解压后目录结构示例假设解压到 D:\oracle\instantclient_19_20 D:\oracle\instantclient_19_20\ ├── oci.dll ├── oraocci19.dll ├── orannzsbb19.dll ├── ojdbc8.jar # Java 驱动PL/SQL Dev 不用 └── adrci.exe # 故障诊断工具不用提示Instant Client 版本必须 ≤ 目标 Oracle 数据库版本如连 Oracle 12c可用 12c/18c/19c Instant Client但连 19c 数据库不能用 11g Instant Client。版本错配会导致连接时弹出ORA-12154: TNS:could not resolve the connect identifier specified且无更多日志。2.2 配置 TNSNAMES.ORA 并设置环境变量PL/SQL Developer 默认从%ORACLE_HOME%\network\admin\tnsnames.ora读取连接别名。但 Instant Client 没有ORACLE_HOME。解决方案手动指定路径。在D:\oracle\instantclient_19_20\network\admin\下新建tnsnames.ora若目录不存在则创建写入标准 TNS 条目注意HOST是数据库服务器 IPPORT是监听端口默认 1521SERVICE_NAME是数据库服务名非 SID# D:\oracle\instantclient_19_20\network\admin\tnsnames.ora ORCL_PROD (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.5.100)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl.example.com) ) )设置系统环境变量需重启 PL/SQL DeveloperTNS_ADMIN D:\oracle\instantclient_19_20\network\adminPATH D:\oracle\instantclient_19_20;%PATH%确保oci.dll可被加载2.3 PL/SQL Developer 中新建连接启动软件 → Tools → Preferences → Oracle → ConnectionOracle Home留空因用 Instant ClientOCI Library浏览并指向D:\oracle\instantclient_19_20\oci.dll点击 OK 后File → New → Database ConnectionUsernamescottPasswordtigerDatabase下拉列表应出现ORCL_PROD即tnsnames.ora中定义的别名点击 Connect参数说明Database字段填的是 TNS 别名不是 IP 或服务名若下拉为空检查TNS_ADMIN路径是否拼写错误、tnsnames.ora文件编码是否为 ANSI非 UTF-8、文件名是否多了一个.txt后缀Windows 默认隐藏扩展名。3. 核心开发流程实战从写第一个函数到调试带游标的存储过程PL/SQL Developer 的价值不在“能连上”而在“怎么高效地写、改、验”。下面以一个真实高频需求为例将某张订单表按月汇总金额并返回 REF CURSOR 供报表调用。3.1 创建测试表与基础函数先在 SQL Window 中执行建表语句注意PL/SQL Developer 支持多语句分号分隔但CREATE OR REPLACE FUNCTION必须独占一个执行块-- 创建订单表模拟生产环境结构 CREATE TABLE t_order ( order_id NUMBER PRIMARY KEY, order_date DATE NOT NULL, amount NUMBER(10,2) NOT NULL, status VARCHAR2(20) ); -- 插入测试数据 INSERT INTO t_order VALUES (1, DATE 2023-01-15, 129.99, SHIPPED); INSERT INTO t_order VALUES (2, DATE 2023-02-03, 88.50, PAID); INSERT INTO t_order VALUES (3, DATE 2023-02-18, 215.00, SHIPPED); COMMIT;3.2 编写带参数的月度汇总函数打开 File → New → SQL Window粘贴以下代码注意/是 PL/SQL 块结束符必须独占一行CREATE OR REPLACE FUNCTION get_monthly_summary(p_month DATE) RETURN SYS_REFCURSOR IS v_cursor SYS_REFCURSOR; BEGIN OPEN v_cursor FOR SELECT TO_CHAR(order_date, YYYY-MM) AS month_key, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM t_order WHERE TRUNC(order_date, MM) TRUNC(p_month, MM) GROUP BY TO_CHAR(order_date, YYYY-MM); RETURN v_cursor; END; /点击工具栏绿色三角形Execute Statement观察右下角状态栏提示Function created.。若报错PLS-00103: Encountered the symbol /说明你漏掉了/或把它写在了END;同一行。逻辑说明该函数接收一个日期参数p_month用TRUNC(p_month, MM)截取到月初与订单表中order_date截取后对比确保只查当月数据返回SYS_REFCURSOR是为了兼容报表工具如 Crystal Reports的数据源绑定。3.3 调试存储过程断点 变量监视 单步执行真正复杂的逻辑往往在存储过程中。我们写一个带游标循环更新状态的 SPCREATE OR REPLACE PROCEDURE update_order_status(p_threshold NUMBER DEFAULT 100.0) IS CURSOR c_orders IS SELECT order_id, amount FROM t_order WHERE amount p_threshold AND status PAID; v_order_id t_order.order_id%TYPE; v_amount t_order.amount%TYPE; BEGIN OPEN c_orders; LOOP FETCH c_orders INTO v_order_id, v_amount; EXIT WHEN c_orders%NOTFOUND; -- 模拟业务逻辑金额超阈值则升级为 VIP 处理 UPDATE t_order SET status VIP_PROCESSED WHERE order_id v_order_id; DBMS_OUTPUT.PUT_LINE(Updated order || v_order_id || , amount || v_amount); END LOOP; CLOSE c_orders; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; /调试步骤在左侧 Object Browser 中展开Procedures→ 右键update_order_status→Edit在UPDATE语句前一行第 13 行点击左侧灰色边栏设断点红点点击工具栏虫子图标Debug Procedure→ 输入参数p_threshold 100→ Run执行暂停在断点处此时v_order_id和v_amount显示为NULL尚未 FETCH按 F7Step Into执行 FETCH变量值自动填充按 F8Step Over跳过 UPDATE观察DBMS_OUTPUT是否打印按 CtrlF2 强制终止调试避免锁表。关键细节DBMS_OUTPUT.PUT_LINE的输出需在 SQL Window 中先执行SET SERVEROUTPUT ON才可见调试时若卡死检查是否遗漏CLOSE c_orders或COMMIT导致会话持有行锁。4. 避坑指南五个让老手也翻车的典型问题与血泪解法PL/SQL Developer 用得越久越容易掉进一些隐蔽但高频的坑。以下是我在多个 Oracle 维护项目中反复踩过的五类问题按现象、原因、解法结构化呈现4.1 现象连接成功但执行SELECT * FROM all_objects报ORA-00942: table or view does not exist原因当前用户没有SELECT_CATALOG_ROLE角色或未授权访问ALL_OBJECTS视图该视图默认只返回当前用户可访问的对象元数据非 DBA 用户需显式授权。解决用 DBA 账户登录执行GRANT SELECT_CATALOG_ROLE TO your_user;或改用USER_OBJECTS仅查自己拥有的对象。4.2 现象调试存储过程时断点始终不触发程序直接跑完原因PL/SQL Developer 的调试器依赖数据库端的DBMS_DEBUG_JDWP包而该包在 Oracle 12c 及以后默认禁用出于安全考虑且需DEBUG CONNECT SESSION权限。解决DBA 执行GRANT DEBUG CONNECT SESSION TO your_user;在数据库服务器执行ALTER SYSTEM SET remote_debugger_enabledTRUE SCOPEBOTH;需重启监听器PL/SQL Developer 中 Tools → Preferences → Debugger → 检查 “Enable debugger” 已勾选且 “Host” 填写数据库服务器 IP非 localhost。4.3 现象导入大 SQL 脚本10MB时卡死、内存溢出或中文注释乱码原因PL/SQL Developer 默认用系统 ANSI 编码读取文件若脚本为 UTF-8 无 BOM中文会解析为乱码进而导致语法错误中断执行大文件一次性加载到内存易触发 GC 停顿。解决用 Notepad 将脚本另存为UTF-8-BOM编码分割脚本用SPOOL或外部工具如split -l 500 script.sql part_切成 500 行/片在 PL/SQL Developer 中用D:\path\part_001.sql分批执行而非全量粘贴。4.4 现象Object Browser 中看不到新创建的表或函数刷新后仍不显示原因PL/SQL Developer 默认缓存对象元数据且只在连接建立时加载一次新对象未触发自动刷新或当前 Schema 切换错误左下角显示的 Schema 名非目标用户。解决点击 Object Browser 顶部工具栏刷新按钮两个弯曲箭头右键 Object Browser 根节点 →Select Schema→ 输入目标用户名如SCOTT若仍不显示执行SELECT object_name FROM user_objects WHERE object_type IN (TABLE,FUNCTION,PROCEDURE);确认对象确实在当前用户下。4.5 现象执行INSERT /* APPEND */ INTO ... SELECT时提示ORA-12838: cannot read/modify an object after modifying it in parallel原因APPEND提示强制 Direct-Path Insert会绕过 Buffer Cache但 PL/SQL Developer 的 SQL Window 默认开启AUTOCOMMIT在 Preferences → Options → SQL Window 中导致 INSERT 后立即提交后续同一事务中无法再查该表。解决关闭 AUTOCOMMITPreferences → Options → SQL Window → 取消勾选Auto-commit DML statements手动控制事务INSERT /* APPEND */ ...; COMMIT;或ROLLBACK;替代方案去掉/* APPEND */用常规 INSERT牺牲性能保事务一致性。5. 高效协作技巧用 Compare User Objects 实现跨环境 SQL 脚本比对与一键同步当你的开发库DEV、测试库TEST、生产库PROD结构出现偏差——比如 DEV 上加了字段discount_rate NUMBER(5,2)TEST 却还没同步——人工核对 DDL 脚本极易遗漏。PL/SQL Developer 内置的Compare User Objects功能就是专治这种“环境漂移”的后悔药。5.1 准备工作确保两库间网络可达且账号有权限DEV 库连接名为CONN_DEV用户dev_user密码dev_pwdPROD 库连接名为CONN_PROD用户prod_user密码prod_pwd两个用户均需SELECT_CATALOG_ROLE查ALL_TAB_COLUMNS等视图及SELECT ANY DICTIONARY查系统字典。5.2 启动比对并过滤关键对象Tools → Compare User Objects → 弹窗中Source Connection:CONN_DEVTarget Connection:CONN_PRODOwner: 输入dev_userSource和prod_userTarget保持一致Object Types: 勾选TABLE,VIEW,FUNCTION,PROCEDURE,PACKAGE根据实际需要Exclude Objects: 在下方输入框填LOG_TABLE|AUDIT_*|TMP_%排除日志、审计、临时表减少干扰点击Compare。注意比对过程会查询ALL_TAB_COLUMNS,ALL_SOURCE,ALL_VIEWS等视图若目标库权限不足会报ORA-00942并跳过该类型对象。务必提前验证权限。5.3 解析比对结果与生成同步脚本比对完成后左侧树状图显示差异分类Different: 结构不同如字段类型、长度、是否 NULLMissing in Target: DEV 有、PROD 无如新增表Missing in Source: PROD 有、DEV 无如历史遗留表通常忽略。双击任一差异项如TABLE.T_ORDER右侧显示详细差异字段discount_rate NUMBER(5,2)在 DEV 存在PROD 缺失字段status VARCHAR2(20)在 DEV 为NOT NULLPROD 为NULL。点击工具栏Generate Script按钮自动生成修复 SQL-- Generated by PL/SQL Developer Compare on 2024-06-15 -- Source: CONN_DEV (dev_user) -- Target: CONN_PROD (prod_user) -- Add column to T_ORDER in target ALTER TABLE t_order ADD (discount_rate NUMBER(5,2)); -- Modify column nullability in target ALTER TABLE t_order MODIFY (status NOT NULL);关键参数说明Generate Script对话框中可勾选Include DROP statements慎用生产环境禁用、Use quoted identifiers处理含大小写或特殊字符的对象名、Add comments生成带来源注释的脚本便于审计。5.4 执行同步脚本前的三重校验习惯我从某跨平台系统迁移项目中学到的教训任何自动生成的 DDL必须经过三遍验证才敢在 TEST 库执行语法校验把脚本粘贴到 TEST 库的 SQL Window执行EXPLAIN PLAN FOR your ALTER;确认无语法错误EXPLAIN PLAN不实际执行只解析影响范围校验对ALTER TABLE ... ADD COLUMN执行SELECT COUNT(*) FROM t_order WHERE discount_rate IS NOT NULL;确认新字段默认值为 NULL不影响现有数据回滚预案校验对MODIFY NOT NULL先查SELECT COUNT(*) FROM t_order WHERE status IS NULL;若结果非 0必须先UPDATE t_order SET status UNKNOWN WHERE status IS NULL;否则MODIFY会失败。从那以后我每次同步前都强制走一遍这三步——哪怕只是改一个字段长度。因为线上库的ALTER TABLE一旦失败锁表时间可能长达数分钟而业务方只关心“什么时候能好”不关心你用了什么工具。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI论文网站实战测评:文献检索、降重与辅助写作全指南

AI论文网站实战测评:文献检索、降重与辅助写作全指南

一转眼又到毕业季,朋友圈里全是赶论文的哀嚎。写毕业论文真正让人崩溃的环节,其实不是“写”本身,而是选题拿不准、文献找不到、引用格式调到头秃、查重降不下来这些琐碎到极点的事。所以每年这个时候,“AI论文网站”都会被搜爆。…

2026/10/18 6:09:48 阅读更多 →
FSD v14架构解析:端到端神经网络与纯视觉系统的工程跃迁

FSD v14架构解析:端到端神经网络与纯视觉系统的工程跃迁

FSD v14这个名字放出来之后,我朋友圈里做智能驾驶的人基本都在转。转到内容分两类:一类是路测视频,焦点是它在几个刁钻路口怎么处理,另一类是技术讨论,焦点集中在两个词上——端到端神经网络、纯视觉系统。我属于后者。…

2026/10/18 6:09:48 阅读更多 →
Google Drive MCP MCP 服务说明文档

Google Drive MCP MCP 服务说明文档

1. 服务概述一句话简介:Google Drive只读SQL查询接口MCP服务器,通过关系型SQL模型暴露Drive数据服务名称:Google Drive MCP Server by CData版本号:1.0开发者/提供方:CDataSoftware协议类型:MCP (Model Con…

2026/10/18 6:09:48 阅读更多 →

最新新闻

400G多模光纤:为何8通道50G比4通道100G更早落地

400G多模光纤:为何8通道50G比4通道100G更早落地

简介:IEEE Std 802.3cm-2020 是 IEEE 发布的以太网修订标准,聚焦多模光纤上 400Gb/s 的物理层与管理参数,面向光通信工程师、数据中心网络架构师及 400G 光模块研发人员。标准新增 Clause 150,定义了 400GBASE-SR8 与 400GBASE-SR…

2026/10/18 10:36:45 阅读更多 →
400G多模光纤标准解析:SR8与SR4.2的物理层设计差异与工程实践

400G多模光纤标准解析:SR8与SR4.2的物理层设计差异与工程实践

简介:IEEE Std 802.3cm-2020 是 IEEE 发布的以太网修订标准,聚焦多模光纤上 400Gb/s 的物理层与管理参数,面向光通信工程师、数据中心网络架构师及 400G 光模块研发人员。标准新增 Clause 150,定义了 400GBASE-SR8 与 400GBASE-SR…

2026/10/18 10:36:45 阅读更多 →
Linux Socket 编程实战:从可编译实例到多连接服务

Linux Socket 编程实战:从可编译实例到多连接服务

简介:这份资源面向Linux网络编程初学者与需要夯实Socket基础的开发者,系统梳理了Socket通信的核心原理与常用接口。内容从网络中进程如何唯一标识讲起,说明IP地址、协议与端口三元组的作用,并解释Socket作为特殊文件的设计思想&am…

2026/10/18 10:36:45 阅读更多 →
微信小程序远程在线诊疗系统:基于SSM的完整设计与实现

微信小程序远程在线诊疗系统:基于SSM的完整设计与实现

简介:面向高校毕业设计场景的微信小程序远程在线诊疗系统完整项目,后端采用Java SSM框架与MySQL数据库,前端为微信开发者工具构建的小程序,并辅以Vue相关后台管理界面。系统内设管理员、用户、医生三类角色,覆盖科室信…

2026/10/18 10:36:45 阅读更多 →
勇士传说横版卷轴游戏:C#动作游戏源码解析与毕业设计实战

勇士传说横版卷轴游戏:C#动作游戏源码解析与毕业设计实战

简介:这份资源是基于C#开发的「勇士传说」横版卷轴游戏完整源码,面向计算机相关专业做毕业设计的学生,以及希望入门Unity 2D游戏开发的学习者。项目以经典横版卷轴玩法为核心,涵盖角色动画、碰撞检测、地图设计、敌人AI与用户输入…

2026/10/18 10:36:45 阅读更多 →
零基础参与开源Python项目:从Fork到首个PR的完整实战指南

零基础参与开源Python项目:从Fork到首个PR的完整实战指南

1. 先搞清楚开源贡献这件事,远不止写代码很多刚接触开源Python项目的人,以为“做贡献”就等于“提PR改源码”。我最初也是这样想的,甚至一度觉得,自己没写出过有设计感的代码,就不配去动别人的仓库。直到后来真正参与进…

2026/10/18 10:35:45 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →