news 2026/8/17 21:49:28

Oracle数据库核心架构解析与实战入门指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle数据库核心架构解析与实战入门指南

1. 从“神话”到“基石”:我眼中的Oracle数据库

提到Oracle数据库,很多刚入行的朋友可能会觉得它像一座古老而威严的神殿,充满了神秘感。它常常与“大型企业”、“核心系统”、“昂贵”这些标签绑定在一起。在我十多年的技术生涯里,从最初的敬畏,到后来的深入使用,再到如今能相对客观地看待它,Oracle确实是一个绕不开的庞然大物。它不只是一个存储数据的软件,更是一套完整的、经过数十年锤炼的数据管理哲学和工程实践的集大成者。今天,我们不谈那些宏大的概念,就从最实际的视角出发,聊聊Oracle到底是什么,它能干什么,以及为什么在今天这个百花齐放的数据库时代,它依然占据着不可替代的位置。

简单来说,Oracle数据库是一个关系型数据库管理系统(RDBMS),由甲骨文公司(Oracle Corporation)开发和维护。它的核心价值在于为企业级应用提供高可用、高性能、高安全性和大规模并发的数据服务。如果你接触的是银行的核心交易系统、电信的计费系统、大型电商的库存与订单中心,那么背后十有八九就是Oracle在支撑。它的强大,体现在面对海量数据(TB甚至PB级)和成千上万用户同时在线操作时,依然能保持事务的强一致性(ACID)和系统的稳定运行。这听起来有点“硬核”,但理解它,对于任何想深入后端、架构或数据领域的技术人来说,都是一块重要的基石。

2. 核心架构解析:为什么Oracle如此“坚不可摧”

要理解Oracle的强悍,不能只看表面操作,必须稍微深入其架构。这就像了解一辆顶级跑车,不能只看外观,还得知道它的引擎和底盘是如何设计的。Oracle的架构设计是其稳定性的根本,我们可以从几个关键层面来拆解。

2.1 实例与数据库:动态与静态的分离

这是Oracle初学者最容易混淆的概念,但理解了它,就理解了Oracle运行的基本逻辑。实例(Instance)数据库(Database)是分开的。

  • 数据库:是物理存在的,是一系列存放在磁盘上的文件集合。包括数据文件(.dbf,存放表、索引等实际数据)、控制文件(.ctl,记录数据库的物理结构,如数据文件、日志文件的位置,相当于数据库的“地图”和“目录”)、在线重做日志文件(.log,记录所有数据变更,用于恢复)和参数文件(.ora,配置数据库启动参数)。你可以把它想象成一个装满资料的仓库。
  • 实例:是动态的,是位于内存中的一组后台进程和内存结构的集合。当启动Oracle数据库服务时,我们首先启动的是实例。实例的主要组成部分是系统全局区(SGA)后台进程(Background Processes)。SGA是共享内存区,所有服务器进程都可以访问,里面缓存了数据块、SQL执行计划、日志缓冲区等,是性能的关键。后台进程则各司其职,比如DBWn进程负责将脏数据块从内存写回磁盘,LGWR进程负责将日志缓冲区的记录写入在线重做日志文件。

为什么这样设计?这种分离带来了巨大的灵活性。一个数据库可以被多个实例挂载和访问(RAC集群架构的基础),同样,一个实例在其生命周期内也可以挂载和打开不同的数据库(比如在测试环境)。这种“动静分离”的设计,为高可用和可扩展性打下了基础。

2.2 存储结构:从表空间到数据块的精妙组织

Oracle的数据存储不是简单地把表扔进文件,而是有一套层次分明的逻辑到物理的映射结构:数据库 -> 表空间 -> 段 -> 区 -> 数据块

  1. 表空间(Tablespace):这是最高级的逻辑存储单元。一个数据库由多个表空间构成,例如系统表空间(SYSTEM)、用户表空间(USERS)、临时表空间(TEMP)等。创建用户时,可以指定其默认表空间。这样做的好处是,DBA可以将不同类型的数据(如业务数据、索引、临时数据)分离到不同的物理磁盘上,实现I/O负载均衡,也便于管理和备份。
  2. 段(Segment):存在于表空间中,是占用存储空间的数据库对象。一张表对应一个数据段,一个索引对应一个索引段,等等。
  3. 区(Extent):段是由若干个区组成的。区是Oracle空间分配的最小单位。当段需要更多空间时,Oracle会一次性分配一个区给它,而不是一个数据块一个数据块地分配,这减少了空间管理的开销。
  4. 数据块(Data Block):这是Oracle读写数据的最小I/O单元,也是内存(SGA缓冲区)和磁盘交换数据的基本单位。块大小通常在创建数据库时设定(如8KB)。一个区由连续的数据块组成。

这个结构的价值:它提供了极其精细的存储控制能力。DBA可以通过为不同的表空间指定不同的数据文件路径、大小和自动扩展策略,来优化存储性能和空间利用率。例如,可以将频繁访问的热点表放在由高速SSD磁盘组成的表空间上。

2.3 核心进程与内存:协同作战的引擎

实例中的后台进程是Oracle高效运转的“幕后英雄”。除了前面提到的DBWn和LGWR,还有几个至关重要的角色:

  • PMON(进程监视器):负责清理异常中断的用户进程,释放其占用的资源(如锁),是系统稳定性的“清道夫”。
  • SMON(系统监视器):负责实例恢复(如实例异常崩溃后的重启)、清理临时段、合并空闲空间碎片。
  • CKPT(检查点进程):定期触发,通知DBWn写脏块,并更新控制文件和数据文件头部的检查点信息。检查点标志着在此时间点之前的所有数据变更都已持久化到磁盘,这大大缩短了实例恢复时需要重放的重做日志量。
  • ARCn(归档进程):在归档模式下,负责将写满的在线重做日志文件复制到归档日志目的地。这是实现数据零丢失的关键,为基于时间点的恢复(PITR)提供了可能。

注意:很多开发同学对“归档模式”不敏感。但在生产环境,开启归档模式是DBA的底线操作。它意味着所有历史数据变更都有日志可循,是数据安全的最后一道保险。关闭归档模式固然能提升少许性能并节省空间,但一旦磁盘损坏,你将丢失最后一次备份之后的所有数据。

这些进程与SGA(共享池、数据库缓冲区缓存、重做日志缓冲区等)紧密配合,构成了Oracle处理SQL请求、管理事务、保证数据一致性的完整流水线。理解它们之间的协作,是进行性能调优和故障排查的基础。

3. 实战入门:安装、配置与基础操作避坑指南

理论讲得再多,不如动手一试。结合网络上的高频搜索词,我们聚焦几个最实际的入门和操作场景,并分享一些官方文档不会写的“坑”。

3.1 安装部署:选对版本与注意环境细节

Oracle数据库的安装,尤其是在Windows Server上,步骤并不复杂,但细节决定成败。

1. 版本选择:目前主流版本是19c和21c。对于学习和大多数生产环境,19c是长期支持版本,更为稳定。21c引入了更多新特性,但作为创新版本,支持期限较短。个人建议初学者从19c开始。可以去Oracle官网下载“Database Express Edition (XE)”,这是一个功能齐全但资源限制的免费版本,非常适合学习和开发测试。

2. Windows环境准备: *关闭防火墙或配置例外:安装和后续连接时,防火墙可能会阻断Oracle监听端口(默认1521)。 *管理员身份运行:务必使用具有管理员权限的账户运行安装程序。 *路径与用户名:安装路径不要包含中文和空格。Windows主机名也最好不要有中文,否则可能引发一些意想不到的监听程序问题。 *内存与存储:确保有足够的可用内存(至少2GB)和磁盘空间。安装程序会进行先决条件检查,按照提示安装缺失的组件即可。

3. 安装过程中的关键决策点: *创建数据库:在安装软件时,通常选择“创建并配置一个数据库”。这会引导你进入DBCA(数据库配置助手)。 *数据库类型:选择“一般用途或事务处理”。 *内存管理:对于学习环境,可以选择“自动内存管理”,让Oracle自己分配SGA和PGA。 *字符集这是重中之重!务必选择AL32UTF8(Unicode UTF-8字符集)。如果误选了ZHS16GBK等中文字符集,将来在存储多语言数据或与其它UTF-8系统交互时,会遇到极其棘手的乱码问题,且后期修改字符集代价巨大。 *管理口令:为SYS、SYSTEM等管理员账户设置强密码。记住这个密码。

4. 安装后验证: 安装完成后,服务列表中会新增若干以Oracle开头的服务。最关键的是OracleService<ORACLE_SID>(数据库实例服务)和OracleOraDB19Home1TNSListener(监听服务)。确保它们都处于“正在运行”状态。 打开命令行,输入sqlplus / as sysdba,如果能成功连接到SQL提示符,说明实例启动正常。再输入SELECT * FROM dual;,能返回一行数据,说明数据库基本功能正常。

3.2 基础SQL操作与Navicat连接

安装好后,就可以用工具连接操作了。Navicat是一个流行的图形化客户端。

1. 使用SQL*Plus执行基本语句: SQL*Plus是Oracle自带的命令行工具,虽然简陋,但功能强大且稳定。 ```sql -- 创建用户并授权(这是操作的第一步,不要总用SYS/SYSTEM) CREATE USER myuser IDENTIFIED BY mypassword; GRANT CONNECT, RESOURCE TO myuser;

-- 切换到新用户连接 CONNECT myuser/mypassword@localhost:1521/orcl (假设服务名为orcl) -- 创建表 CREATE TABLE employees ( id NUMBER PRIMARY KEY, name VARCHAR2(50) NOT NULL, hire_date DATE DEFAULT SYSDATE ); -- 插入数据 INSERT INTO employees (id, name) VALUES (1, '张三'); -- 查询 SELECT * FROM employees; -- 提交事务 COMMIT; ``` > **注意**:Oracle中,`VARCHAR2`是推荐使用的变长字符串类型,`DATE`类型包含日期和时间。`COMMIT`语句非常重要,在默认设置下,DML语句(INSERT, UPDATE, DELETE)需要显式提交才会永久生效,否则只在当前会话可见,其他会话查不到,重启后也会丢失。

2. 使用Navicat连接: * 打开Navicat,新建一个“Oracle”连接。 * 连接名自定。 * 主机:localhost127.0.0.1* 端口:1521* 服务名/ SID:安装时创建的数据库服务名,如orclxe(对于XE版)。 * 用户名/密码:刚才创建的myuser/mypassword。 *常见坑点:连接失败通常是因为监听服务未启动,或者服务名填写错误。可以通过命令行lsnrctl status查看监听状态和注册的服务名。

3. 关于“Navicat修改Oracle数据库名”: 这是一个容易误解的需求。在Oracle中,数据库名(DB_NAME)在创建时就已经写入控制文件和数据文件头,极难修改,通常需要重建数据库。用户通常想改的是: *实例名(INSTANCE_NAME):相对容易,但涉及参数文件修改和重启。 *服务名(SERVICE_NAMES):这是客户端连接时使用的逻辑名,可以通过修改初始化参数service_names动态调整,或者通过DBCA进行配置。 *表空间名、用户名:这些是可以随意创建和修改的。 所以,当你想“改数据库名”时,先明确到底要改什么。大多数情况下,你需要的是创建一个新的服务名,而不是改动底层的DB_NAME。

3.3 从Oracle迁移到MySQL:思路与工具选择

“将Oracle表结构及数据迁移到MySQL”是一个常见需求,尤其是在去O(去Oracle化)或项目技术栈转型的背景下。这绝非简单的导出导入,需要系统性地处理。

1. 核心挑战: *数据类型映射:Oracle的NUMBERVARCHAR2DATECLOB等类型需要找到MySQL中合适的对应类型(如DECIMAL/INTVARCHARDATETIME/TIMESTAMPLONGTEXT)。NUMBER的精度和标度需要仔细处理。 *SQL语法与函数差异:序列(Sequence)、ROWNUM伪列、NVL函数、MERGE语句等在MySQL中都有不同的实现或替代方案(如AUTO_INCREMENT、变量、IFNULLINSERT ... ON DUPLICATE KEY UPDATE)。 *对象差异:Oracle的包(Package)、存储过程(Procedure)、函数(Function)的PL/SQL语法需要重写为MySQL的SQL/PL语法。 *数据量:如果数据量很大(GB级以上),需要选择支持断点续传、批量并发的工具。

2. 迁移步骤与工具推荐: *步骤一:评估与规划。梳理要迁移的对象(表、视图、索引、序列、代码),分析差异,制定映射和改造方案。 *步骤二:结构迁移。 *手动/半自动:使用Oracle的DBMS_METADATA.GET_DDL包导出对象DDL,然后手动修改为MySQL语法。或者使用Navicat、SQL Developer等工具的“导出SQL”功能,再进行调整。 *专业工具:使用Oracle SQL Developer,它内置了“迁移工作台”,可以连接Oracle和MySQL,进行类型映射和结构转换,自动化程度较高,是官方推荐工具。 *步骤三:数据迁移。 *小数据量:使用Navicat的“数据传输”功能,图形化界面,简单直接。 *大数据量/生产级:使用专业的ETL工具。这里就涉及到你提到的Apache SeaTunnel。它是一个高性能、分布式的数据集成平台。你可以编写一个SeaTunnel的配置文件,使用其Oracle源连接器读取数据,通过一些转换插件处理数据类型,再使用MySQL连接器写入。它支持分布式运行,能高效处理海量数据。对于“将Oracle的视图迁移到达梦的数据库的实体表中”这类异构数据库、跨厂商的复杂迁移,SeaTunnel这类工具的优势非常明显,因为它将数据源和目标抽象为统一的配置,核心是数据流本身。 *步骤四:代码与业务逻辑迁移。这是最耗时的一步,需要将PL/SQL存储过程、触发器等逐一重写为MySQL兼容的形式。 *步骤五:验证与测试。对比数据一致性、验证业务功能。

实操心得:迁移前,务必在测试环境进行全流程演练。数据一致性校验可以使用行数对比、抽样校验MD5等方式。对于无法自动转换的复杂存储过程,提前评估重写工作量是关键。不要试图追求100%的自动化,尤其是业务逻辑部分,人工审核和重写是保证质量的核心。

4. 开发集成与运维核心:连接、存储与状态监控

作为开发者或初级DBA,除了基本操作,还需要掌握如何让应用连接Oracle,以及如何判断数据库的健康状态。

4.1 应用连接:以Java和Lazarus为例

1. Java连接Oracle(JDBC): 这是最常见的场景。你需要Oracle官方的JDBC驱动(ojdbc.jar)。现在推荐使用Maven依赖来管理。xml <!-- 在pom.xml中添加依赖,版本号请根据你的Oracle版本选择 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>21.9.0.0</version> <!-- 示例版本,对应Oracle 19c/21c --> </dependency>连接代码示例: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;

public class OracleDemo { public static void main(String[] args) { String url = "jdbc:oracle:thin:@//localhost:1521/orcl"; // 服务名方式 // 或 "jdbc:oracle:thin:@localhost:1521:orcl"; // SID方式(较老) String user = "myuser"; String password = "mypassword"; try (Connection conn = DriverManager.getConnection(url, user, password)) { String sql = "SELECT * FROM employees WHERE id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, 1); try (ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { System.out.println(rs.getInt("id") + ", " + rs.getString("name")); } } } } catch (Exception e) { e.printStackTrace(); } } } ``` **关于“存储文件至Oracle数据库”**:通常不建议将大文件(如图片、PDF)直接以`BLOB`类型存入数据库,这会使数据库体积膨胀,影响备份和性能。更佳实践是文件存储在文件系统或对象存储(如OSS、S3)中,数据库中只保存文件的访问路径(URL)。如果必须存,可以使用`BLOB`字段,并通过JDBC的 `setBinaryStream()` 或 `setBlob()` 方法写入。

2. Lazarus连接Oracle: Lazarus是Free Pascal的IDE,使用SQLConnector组件可以连接多种数据库。连接Oracle需要配置: *驱动:选择Oracle。 *主机名localhost*数据库名:这里需要填写连接字符串,格式类似于//localhost:1521/orcl(服务名方式)或localhost:1521:orcl(SID方式)。 *用户名/密码:你的数据库用户。 关键点在于确保本机安装了Oracle客户端(或Instant Client),并且SQLConnector能通过它找到正确的OCI(Oracle Call Interface)库。通常需要设置环境变量PATH包含OCI库的路径。

4.2 实例状态监控:理解“UNKNOWN”状态

在运维中,查看数据库状态是基本操作。使用sqlplus / as sysdba登录后,执行SELECT status FROM v$instance;可以查看实例状态。常见的状态有:

  • OPEN:正常打开状态。
  • MOUNT:实例已加载控制文件,但数据库未打开。通常用于恢复或重命名数据文件等维护操作。
  • NOMOUT:实例已启动,但未加载控制文件。

当状态显示为UNKNOWN时,通常意味着问题比较严重,可能的原因和排查思路如下:

  1. 监听器问题:实例未向监听器正常注册。检查监听服务是否运行(lsnrctl status),查看实例是否在监听列表中。可以尝试在实例中执行ALTER SYSTEM REGISTER;手动注册。
  2. 实例进程异常:Oracle的核心后台进程(如PMON、SMON)可能已经崩溃或挂起。检查操作系统进程是否存在,尝试用STARTUP FORCE重启实例。
  3. 控制文件损坏或丢失:控制文件是实例识别数据库的“地图”。如果所有控制文件都损坏,实例将无法识别数据库,状态可能变为UNKNOWN。需要从备份中恢复控制文件。
  4. 参数文件错误:初始化参数文件(pfile或spfile)中的关键参数(如db_name,control_files)设置错误,导致实例无法识别数据库。
  5. 存储故障:如果控制文件所在的磁盘出现物理故障,也会导致此问题。

排查命令链

# 1. 检查监听 lsnrctl status # 2. 检查Oracle进程(Linux示例) ps -ef | grep ora_ # 3. 尝试以nomount状态启动,看能否读取参数文件 STARTUP NOMOUNT; -- 如果失败,查看告警日志(alert_<sid>.log),通常在$ORACLE_BASE/diag/rdbms/<dbname>/<sid>/trace/下 -- 如果nomount成功,再尝试加载控制文件 ALTER DATABASE MOUNT; -- 如果mount失败,控制文件很可能有问题

遇到UNKNOWN状态,首要任务是查看数据库的告警日志(Alert Log),里面会记录实例启动过程中的详细错误信息,这是定位问题的第一手资料。

5. 进阶认知:模式、面试与未来展望

最后,我们聊聊一些更深入的话题,帮助你构建对Oracle更立体的认知。

5.1 OceanBase的“模式”与Oracle兼容性

你提到了“OceanBase查询数据库是Oracle还是MySQL模式”。这是一个非常有意思的点。OceanBase是阿里自研的分布式数据库,它的一大特性就是提供了高度的语法兼容性。为了降低用户从传统数据库迁移过来的成本,OceanBase可以运行在“Oracle模式”或“MySQL模式”下。

  • Oracle模式:在此模式下,OceanBase会尽量模拟Oracle的行为。例如,系统视图的名称(如USER_TABLES)、数据类型(支持NUMBER,VARCHAR2)、SQL语法(支持ROWNUMDECODE函数、MERGE语句)、甚至PL/SQL的某些特性。你连接进去后,感觉就像在用Oracle。
  • MySQL模式:同理,模拟MySQL的行为和语法。

你可以通过执行SELECT @@version_comment;或查看一些特定的系统变量来确认当前所处的模式。这个设计体现了分布式数据库对生态的尊重和拥抱,让开发者能够以较小的代价进行迁移。但需要注意的是,这只是“语法兼容”,在底层架构、事务实现、性能特性上,OceanBase与Oracle有本质的不同,深度的SQL调优和运维仍需按照OceanBase的最佳实践来。

5.2 经典面试题背后的原理思考

准备Oracle相关的面试,死记硬背命令不如理解原理。这里剖析几个经典问题:

  1. Oracle的体系架构是怎样的?这几乎是必问题。回答时不要只背组件名称,要讲出逻辑关系。可以从“存储结构”(物理文件、逻辑结构)和“内存进程结构”(SGA、PGA、后台进程)两条线展开,并强调“实例”和“数据库”的区别。最后用一句“用户发起一个SQL查询,这个请求是如何经过这些组件协同处理并返回结果的”作为串联,展示你的整体理解。

  2. 事务的ACID特性在Oracle中是如何实现的?

    • 原子性(A):通过撤销段(Undo Segments)实现。如果事务失败,Oracle利用撤销段中的前镜像数据来回滚所有修改。
    • 一致性(C):由原子性、隔离性和数据库的完整性约束(主键、外键、检查约束)共同保证。
    • 隔离性(I):通过锁(Lock)多版本并发控制(MVCC)实现。Oracle默认的读已提交(Read Committed)和可串行化(Serializable)隔离级别,读操作不会阻塞写操作,这主要得益于MVCC机制——查询看到的是语句或事务开始时的数据快照。
    • 持久性(D):通过重做日志(Redo Log)实现。任何数据变更在写入数据文件之前,会先写入重做日志缓冲区,并由LGWR进程持久化到在线重做日志文件。即使系统崩溃,重启后也能利用重做日志进行恢复。
  3. 什么是锁?Oracle有哪些常见的锁?锁是管理并发访问的机制。要区分共享锁(Share Lock)排他锁(Exclusive Lock)。重点理解行级排他锁(Row Exclusive, RX):当执行UPDATE或DELETE某一行时,会在该行上加RX锁,防止其他事务修改同一行,但允许其他事务读取(因为MVCC)。还有表级锁,比如执行DDL语句(ALTER TABLE)时加的排他锁。

  4. 如何优化一条执行缓慢的SQL?这是一个实战题。标准思路是:

    • 定位:从AWR/ASH报告、或实时监控中找到高负载的SQL_ID。
    • 获取执行计划:使用EXPLAIN PLAN FORDBMS_XPLAN.DISPLAY_CURSOR查看SQL的实际执行计划。
    • 分析瓶颈:看执行计划中哪一步的代价(COST)最高,是全表扫描(TABLE ACCESS FULL)?低效的连接(NESTED LOOPS)?还是错误的索引使用(INDEX RANGE SCAN vs. INDEX FULL SCAN)?
    • 优化手段
      • 确保统计信息是最新的(DBMS_STATS.GATHER_TABLE_STATS)。
      • 考虑添加或修改索引(覆盖索引、函数索引)。
      • 重写SQL(例如将IN改为EXISTS,避免在WHERE子句中对字段使用函数)。
      • 检查绑定变量窥探(Bind Peeking)是否导致执行计划不稳定。
      • 考虑使用SQL Profile或SQL Plan Baseline固定好的执行计划。

5.3 Oracle的当下与未来:它过时了吗?

在云原生、开源数据库(如MySQL、PostgreSQL)和NewSQL(如TiDB、CockroachDB)的冲击下,很多人质疑Oracle是否已经过时。我的看法是:远未过时,但它的角色在演变。

  • 不可替代的领域:在对数据一致性、可靠性、安全性要求达到极致的领域,如金融核心交易、电信计费、大型制造业的ERP,Oracle经过全球无数关键业务场景数十年的验证,其稳定性和功能完整性依然是首选。它的RAC(实时应用集群)、Data Guard(数据卫士)等高可用和容灾方案非常成熟。
  • 面临的挑战:高昂的授权费用和相对封闭的生态是其主要挑战。许多互联网公司和初创企业出于成本和技术栈灵活性的考虑,会优先选择开源方案。
  • Oracle的应对:Oracle自身也在向云转型(Oracle Cloud Infrastructure, OCI),推出了自治数据库(Autonomous Database)等云服务。同时,它也提供了MySQL HeatWave等产品来参与开源竞争。

对于技术人员而言,学习Oracle的价值在于:

  1. 理解经典数据库设计的精髓:它的很多设计思想(如MVCC、锁机制、存储架构)是数据库领域的通用知识,理解了Oracle,再学其他数据库会触类旁通。
  2. 接触企业级最佳实践:在Oracle环境中,你能接触到严谨的备份恢复策略、性能调优方法论、高可用架构设计,这些经验非常宝贵。
  3. 保持职业广度:很多传统行业、金融机构的技术栈依然以Oracle为主,掌握它意味着更广的就业选择。

所以,不必神话Oracle,也不必唱衰它。把它看作数据库技术图谱中一个厚重而经典的板块,深入理解它,会让你对整个数据管理世界的认知更加完整和深刻。无论是为了应对现有的工作,还是为了构建更坚实的技术基础,花时间研究Oracle都是一笔值得的投资。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 21:47:29

第23篇:动态模板 dynamic_table:让大模型自定义表格列定义

第23篇:动态模板 dynamic_table:让大模型自定义表格列定义 60 个固定模板能覆盖大部分查询场景,但总有覆盖不到的时候。用户说"按预算降序排列项目,只看编号、名称和预算三列"——固定模板 project_list 总是展示 8 列,无法满足"只看三列"的需求。再比…

作者头像 李华
网站建设 2026/8/17 21:45:53

网盘下载总被限速?这个开源助手能生成直链免客户端下载

网盘下载总被限速&#xff1f;这个开源助手能生成直链免客户端下载 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 凌晨两点&#xff0c;客户丢来一个网盘链接&#xff0c;300MB素材卡在20KB/…

作者头像 李华