简介「Oracle 11g从入门到精通第二版」配套实例源程序面向数据库初学者与准备进阶的DBA把书中19章示例集中打包便于边读边动手验证。内容沿教材脉络展开从数据库基本概念、Oracle体系结构与安装配置到SQL查询、表与索引设计再到视图、存储过程、触发器、游标等数据库对象以及用户权限、角色管理、备份恢复策略、SQL调优、分区与并行执行等主题末段还涉及分布式系统与数据仓库等进阶方向。rar压缩包共495个文件、约1.21MB以txt脚本与学习笔记、java源文件及class编译产物、xml配置文件、jpg运行截图为主另含bak备份脚本、doc/xls文档表格与dmp、ctl等导入导出样例可在本地环境复现书中实验。已有405人学习适合按章节查漏补缺、对照练习。1. 先别急着导入《oracle11g从入门到精通第二版》实例源程序里装的到底是什么解压这份《oracle11g从入门到精通第二版》的实例源程序压缩包多数人第一反应是找安装包——其实里面没有数据库安装程序全是书里每一章配套的.sql脚本、少量.txt数据文件偶尔夹一两个.dmp导出文件。它解决的是同一个问题书上的 SQL 和 PL/SQL 示例你照着敲容易漏掉分号或写错字段名直接跑配套脚本就能拿到一份和作者屏幕一致的结果集。适合三类人——刚接触 Oracle、想按章节顺序把示例过一遍的新手要从 11g 迁移到服务端、需要对照样例代码的人工还有带课的讲师直接拿脚本当课堂素材。但它是“教材配套”不是“生产部署包”脚本的组织方式和健壮性得你自己补。2. 环境对齐让 11g 实例源程序跑在正确的库上2.1 先确认三个环境参数再谈导入拿到脚本之前先把运行环境固定下来否则后面所有报错都是干扰项。11g 家族里被当作学习目标最多的版本是 11.2.0.4教材配套脚本也是按这个版本写的早期 11.1 的部分语法尤其是LISTAGG、PIVOT的细节行为不完全一致。先确认三件事数据库版本、字符集、监听状态。-- 以 sysdba 身份登录后执行 SELECT * FROM v$version; -- 关注输出中的 11.2.0.x教材脚本多数按 11.2 编写 SELECT parameter, value FROM nls_database_parameters WHERE parameter IN (NLS_CHARACTERSET, NLS_LANGUAGE, NLS_TERRITORY); -- 字符集常见为 AL32UTF8 或 ZHS16GBK这个值决定后面数据文件会不会乱码lsnrctl status # 看监听是否在跑、服务名是否为 orcl lsnrctl services # 确认实例已经动态注册到监听先说字符集这条线。数据库建库时选的字符集是不可随意更改的ALTER DATABASE CHARACTER SET只能从子集往超集改从 ZHS16GBK 改到 AL32UTF8 属于“理论可行、实操代价极高”的操作。所以正确姿势是先读NLS_CHARACTERSET然后让客户端的NLS_LANG去适配它而不是反过来。库是 AL32UTF8客户端就设SIMPLIFIED CHINESE_CHINA.AL32UTF8库是 ZHS16GBK客户端设SIMPLIFIED CHINESE_CHINA.ZHS16GBK。两端不一致时DBMS_OUTPUT输出中文会变问号SPOOL出来的日志也会花很容易被误判成脚本本身有问题。监听这条线也常翻车。教材脚本里连接串一般写orcl靠的是本地tnsnames.ora里的别名解析如果你在另一台机器上用 IP 连就得写成127.0.0.1:1521/orcl这种 EZConnect 形式否则会撞上ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。这个错的意思是监听活着但它不认识你请求的服务名——通常是SERVICE_NAME写错或者实例根本没注册上去。2.2 建表空间、建用户、授权三步一个都不能省教材源码里所有对象默认建在示例用户下scott、hr或者书里自定义的用户名。我不建议直接往scott里塞一个原因是scott的DEFAULT TABLESPACE通常是USERS脚本跑多了之后想清理很麻烦另一个原因是真出问题时你分不清是脚本的锅还是系统 schema 的锅。单独开一个用户出了问题DROP USER ... CASCADE一删了事。-- 以 sysdba 执行先建独立表空间 CREATE TABLESPACE ts_book DATAFILE D:\app\oracle\oradata\orcl\ts_book01.dbf SIZE 200M AUTOEXTEND ON NEXT 50M MAXSIZE 4G SEGMENT SPACE MANAGEMENT AUTO; -- 建用户并绑定默认表空间 CREATE USER book IDENTIFIED BY book DEFAULT TABLESPACE ts_book TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON ts_book; -- 基础角色 教材里常缺的几个系统权限 GRANT CONNECT, RESOURCE TO book; GRANT CREATE VIEW, CREATE SYNONYM, CREATE DATABASE LINK TO book;参数逐条说。DATAFILE路径必须和你机器上实际的ORACLE_BASE对上照抄书上的 Linux 路径放到 Windows 上必报ORA-01119。AUTOEXTEND ON NEXT 50M MAXSIZE 4G是给练手库用的省得跑到一半ORA-01653报空间不足生产环境我不这么写但在学习库里这样最省心。QUOTA UNLIMITED ON ts_book这行最容易被漏——只要漏了脚本里第一条CREATE TABLE就是ORA-01950: no privileges on tablespace TS_BOOK。关于RESOURCE角色有个老坑11g 的RESOURCE里包含CREATE TABLE、CREATE SEQUENCE、CREATE PROCEDURE、CREATE TRIGGER、CREATE TYPE但不包含CREATE VIEW。所以教材里只要有一章讲视图脚本执行到那一步必然报ORA-01031: insufficient privileges。上面那句GRANT CREATE VIEW就是补这个洞的别省。2.3 用包装脚本批量执行别手动一条条贴源程序包里的文件通常按章节命名几十个.sql。在 SQL*Plus 里一个个太慢而且执行顺序错了会连环报错。写一个 Shell 或批处理包装脚本把所有文件串起来一次跑完。#!/bin/bash # run_all.sh —— 按依赖顺序执行教材源程序日志统一落盘 export ORACLE_SIDorcl export NLS_LANGSIMPLIFIED CHINESE_CHINA.AL32UTF8 LOG./run_all_$(date %Y%m%d%H%M).log sqlplus -S book/book127.0.0.1:1521/orcl EOF $LOG 21 SET DEFINE OFF SET SERVEROUTPUT ON SIZE UNLIMITED SET ECHO OFF SET FEEDBACK ON SET PAGESIZE 200 SET LINESIZE 200 WHENEVER SQLERROR CONTINUE SPOOL run_detail.log APPEND sql/01_create_tables.sql sql/02_primary_key.sql sql/03_foreign_key.sql sql/04_index.sql sql/05_sequence.sql sql/06_insert_data.sql sql/07_views.sql sql/08_procedures.sql sql/09_packages_spec.sql sql/10_packages_body.sql sql/11_triggers.sql SPOOL OFF EXIT EOF几个参数值得单独讲。SET DEFINE OFF必须放在第一行——教材脚本里如果有字符串包含比如地址“研发测试部”SQL*Plus 会把它当成替换变量提示你输入脚本就卡在那里等人敲键盘无人值守跑批时直接超时。SET SERVEROUTPUT ON SIZE UNLIMITED打开DBMS_OUTPUT缓冲教材里演示PUT_LINE的章节不加这句什么都看不到新手常以为存储过程没执行。WHENEVER SQLERROR CONTINUE的意思是出错继续跑下一条这样一次能收集全部问题如果你希望出错立即停改成WHENEVER SQLERROR EXIT SQL.SQLCODE脚本的退出码会带上 Oracle 错误号方便写 CI 判断。和的区别也顺手记一下按当前工作目录解析按调用它的那个脚本所在目录解析。把执行脚本放在外层目录、.sql放在sql/子目录时用才不会被路径问题坑到。3. 脚本目录解剖DDL、DML、PL/SQL 三类文件的正确打开顺序3.1 表结构脚本先跑约束和索引拆开跑教材配套脚本的组织方式大同小异建表、加约束、建索引、插数据、建视图和存储过程。直接按文件名首字母排序执行是最容易翻车的做法因为文件名里带数字前缀不一定反映真实依赖。我一般先做一次人工归类把那堆.sql分成四层层级内容典型文件名特征执行顺序L1表结构create_table、ddl、tab1L2主键、外键、检查约束pk、fk、constraint2L3索引、序列、同义词index、seq、synonym3L4视图、过程、函数、包、触发器view、proc、pkg、trg4分层的原因是外键。教材里常见的emp/dept结构如果建表脚本里内联了REFERENCES dept(deptno)那dept必须先建而如果脚本顺序反了ORA-00942: table or view does not exist就会在第一条外键处爆出来。更稳妥的做法是把约束从建表语句里剥出来单独用ALTER TABLE ... ADD CONSTRAINT追加这样建表阶段没有互相依赖后面加约束时即使失败也能单独重跑那一条不用整表重建。-- 单独追加约束的好处可重跑、可单独排查 ALTER TABLE emp ADD CONSTRAINT pk_emp PRIMARY KEY (empno) USING INDEX TABLESPACE ts_book; ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL; -- 教材示例常用生产环境务必想清楚再选ON DELETE SET NULL这个子句值得多说一句。教材为了演示“删除部门后员工还在”常这么写但它意味着删一条dept记录会静默修改 N 条emp记录的deptno而且这个修改不会触发你写的AFTER DELETE触发器里的业务逻辑。自己要往真实数据上套的时候先把这行改成ON DELETE RESTRICTOracle 里就是省略ON DELETE子句或干脆不加外键。3.2 数据装载编码和分隔符是两个必踩的坑教材里的演示数据一般有两种形式INSERT语句脚本或者.txt/.csv数据文件配一个 SQL*Loader 控制文件。前者简单insert_data.sql就完事后者才是问题高发区。-- emp.ctlSQL*Loader 控制文件示例 LOAD DATA INFILE emp.csv BADFILE emp.bad DISCARDFILE emp.dsc APPEND INTO TABLE emp FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY TRAILING NULLCOLS ( empno, ename, job, mgr, hiredate DATE YYYY-MM-DD, sal, comm, deptno )TRAILING NULLCOLS必须加。教材数据里comm奖金这一列大量为空不加这句的话空字段会被当成“行结束”报SQL*Loader-350: Syntax error或者整行错位灌进去最后表里deptno列出现的全是工资数字——这种脏数据不会报错只会让你在后面的多表连接查询里得到莫名其妙的结果属于最阴的一类问题。DATE YYYY-MM-DD的掩码要和文件里实际格式严格对应掩码写错不会报错只会把hiredate灌成0001-01-01之类。编码这条线更隐蔽。数据文件如果是 GBK 存的而你的NLS_LANG设成了AL32UTF8ename里的中文会变成乱码反过来也一样。判断方法很简单装载完成后SELECT ename, LENGTH(ename) FROM emp WHERE empno 7900;中文正常的话LENGTH应该等于实际汉字数出现一堆问号或长度翻倍就是编码对不上。修复方式不是改数据文件而是执行前把NLS_LANG调到与文件编码一致。3.3 PL/SQL 对象spec 必须先于 body错误要去 USER_ERRORS 里查教材后半部分开始讲存储过程、函数、包、触发器。这些文件执行时最大的特点是SQL*Plus 的报错信息极其吝啬。你跑一个CREATE OR REPLACE PROCEDURE屏幕上可能只出现Warning: Procedure created with compilation errors.这时候很多人第一反应是回滚看脚本其实错在哪数据库已经记下来了。-- 查当前用户下所有编译失败的对象 SELECT object_name, object_type, status FROM user_objects WHERE status INVALID ORDER BY object_type, object_name; -- 查具体错误行号和原因 SELECT name, type, line, position, text FROM user_errors WHERE name RAISE_SALARY ORDER BY type, sequence;USER_ERRORS里的LINE是相对于该对象源码的行号POSITION是列号TEXT会告诉你PLS-00103: Encountered the symbol ;这类信息。绝大多数教材脚本编译失败原因就那么几种一是文件从 PDF 或网页复制时混进了全角空格或中文引号Oracle 的语法分析器不认识报的位置往往还偏一行二是包PACKAGE的声明和包体PACKAGE BODY分在两个文件里顺序跑反了包体编译时找不到声明三是脚本里的END;后面少了单独一行的/导致 PL/SQL 块压根没提交给数据库执行。第三点单独强调一下。SQL*Plus 里执行 PL/SQLEND;之后必须跟一个独占一行的/或者一个空行。教材配套脚本一般是对的但从书里手抄的时候就很容易漏表现出来是光标停在2提示符上不动你敲什么它都不执行。这不是卡死是它还在等 PL/SQL 块结束符。4. 典型实例拆解从演示用户到存储过程、触发器的验证4.1 先把 scott 和 hr 演示用户跑通Oracle 11g 安装完成后scott默认是锁定状态hr示例 schema 默认不创建。教材里凡是用emp/dept举例的章节都默认你已经把scott打开了。-- 解锁 scott 并重设密码 ALTER USER scott ACCOUNT UNLOCK; ALTER USER scott IDENTIFIED BY tiger; -- 验证登录与表数据 CONN scott/tigerorcl SELECT COUNT(*) FROM emp; -- 正常应为 14 SELECT COUNT(*) FROM dept; -- 正常应为 4hr要麻烦一点它不在默认建库流程里需要跑安装介质里的hr_main.sql。这个脚本在$ORACLE_HOME/demo/schema/human_resources/目录下执行时会用替换变量问你四个参数hr用户的密码、默认表空间、临时表空间、日志输出目录。这里正是SET DEFINE OFF会害你的地方——这个脚本依赖替换变量所以执行前反而要SET DEFINE ON。我见过有人全局在glogin.sql里写了SET DEFINE OFF然后hr_main.sql一跑就报ORA-00922: missing or invalid option查了半天。-- 在 hr_main.sql 所在目录执行注意这里要保持 DEFINE 打开 SET DEFINE ON hr_main.sql -- 依次输入hr 密码 / users / temp / 日志目录跑完之后CONN hr/hrorclSELECT table_name FROM user_tables;应该能看到 7 张表。这一步通过说明字符集、权限、表空间三条线都是通的后面教材里的复杂示例才有个可靠的基线。4.2 一个存储过程实例参数模式、游标、异常要一起看教材讲 PL/SQL 的章节几乎一定会给一个“批量调薪”的过程。这类例子看着简单但把IN/OUT参数、显式游标、FOR UPDATE、自定义异常、RAISE_APPLICATION_ERROR全串起来了是理解整套机制的抓手。CREATE OR REPLACE PROCEDURE raise_salary( p_deptno IN NUMBER, p_percent IN NUMBER DEFAULT 5, p_rows OUT NUMBER ) AS v_cnt NUMBER : 0; -- 显式游标加 FOR UPDATE锁定待修改的行避免并发下丢失更新 CURSOR c_emp IS SELECT empno, sal FROM emp WHERE deptno p_deptno FOR UPDATE OF sal NOWAIT; e_invalid_pct EXCEPTION; -- 自定义异常业务规则校验用 BEGIN IF p_percent 0 OR p_percent 50 THEN RAISE e_invalid_pct; END IF; FOR r IN c_emp LOOP UPDATE emp SET sal ROUND(sal * (1 p_percent / 100), 2) WHERE CURRENT OF c_emp; -- 定位到游标当前行比再写一遍主键快 v_cnt : v_cnt 1; END LOOP; p_rows : v_cnt; COMMIT; EXCEPTION WHEN e_invalid_pct THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20001, 调薪比例必须在 0 到 50 之间); WHEN OTHERS THEN ROLLBACK; RAISE; -- 保留原始错误栈别吞异常 END; /参数说明几个点。p_percent IN NUMBER DEFAULT 5给了默认值调用时写raise_salary(20)就走 5%。p_rows OUT NUMBER是出参调用方必须先声明变量接住SET SERVEROUTPUT ON DECLARE v_n NUMBER; BEGIN raise_salary(20, 10, v_n); DBMS_OUTPUT.PUT_LINE(影响行数 || v_n); END; /FOR UPDATE OF sal NOWAIT是关键。不加的话两个会话同时调这个过程中会互相等待表现是“程序卡住不返回”加了NOWAIT则立即抛ORA-00054: resource busy and acquire with NOWAIT specified你能马上知道是锁冲突而不是性能问题。WHERE CURRENT OF c_emp依赖游标的FOR UPDATE如果游标没加这个子句却写了CURRENT OF编译阶段就报ORA-00904。RAISE_APPLICATION_ERROR的错误号必须落在-20000到-20999之间这个区间的错误是用户自定义的不会和 Oracle 系统错误号冲突。教材里有些例子图省事写-1跑起来报ORA-00001: unique constraint violated把自己绕进去。4.3 触发器实例行级还是语句级先想清楚再写教材讲触发器那章会同时给行级FOR EACH ROW和语句级两种例子。区别很直白行级触发器对每一条受影响的记录触发一次能用:NEW/:OLD伪记录语句级触发器整条语句只触发一次拿不到行数据通常用于记录操作日志或做权限校验。-- 行级触发器员工薪资变动审计 CREATE OR REPLACE TRIGGER trg_emp_sal_audit AFTER UPDATE OF sal ON emp FOR EACH ROW WHEN (OLD.sal NEW.sal) -- WHEN 子句里不能写冒号 DECLARE v_user VARCHAR2(30) : USER; BEGIN INSERT INTO emp_sal_audit(empno, old_sal, new_sal, chg_time, chg_user) VALUES (:OLD.empno, :OLD.sal, :NEW.sal, SYSDATE, v_user); END; /两个细节容易错。第一WHEN子句里的OLD.sal和NEW.sal不带冒号但BEGIN ... END块里必须带:OLD/:NEW这个不一致是 Oracle 的历史遗留教材上常只写一种抄的时候要对齐。第二AFTER UPDATE OF sal里的OF sal限定了只有sal列被更新时才触发不加的话UPDATE emp SET comm 100也会触发审计表里就会多出一堆old_sal new_sal的垃圾记录。审计表本身的建法也有讲究。emp_sal_audit别加外键指向emp否则删除员工时会因为审计记录存在而失败也别在审计表上再建触发器容易触发递归。验证方式很直接UPDATE emp SET sal sal 100 WHERE empno 7369; SELECT * FROM emp_sal_audit WHERE empno 7369 ORDER BY chg_time DESC; ROLLBACK; -- 练手环境记得回滚别把示例数据改花了5. 避坑与排查源程序跑不起来的五类现场5.1 ORA-00942表或视图不存在八成不是表真的不存在现象脚本前半段明明建表成功了执行到视图或过程时报ORA-00942: table or view does not exist。原因三种可能。一是对象建在了另一个 schema 下你当前登录的用户没有权限也没建同义词Oracle 在解析时按“当前 schema → 同义词 → 公共同义词”的顺序找找不到就报这个错。二是对象名用了双引号包裹的小写或混合大小写形式Emp而查询时写的是emp两者在数据字典里是不同的名字。三是脚本里用了table_name这种替换变量SET DEFINE OFF之后没被替换实际执行的 SQL 里带着字符解析失败。解决先SELECT owner, object_name FROM all_objects WHERE object_name EMP;确认对象到底在哪个 schema大小写问题用SELECT table_name FROM user_tables WHERE UPPER(table_name) EMP;反查替换变量问题检查执行脚本开头有没有SET DEFINE OFF如果有而这个脚本恰恰需要变量就临时改回ON。5.2 ORA-01031权限不足角色权限在存储过程里会失效现象在 SQL*Plus 里直接SELECT * FROM hr.employees没问题但把这个查询写进存储过程编译通过、执行时报ORA-01031: insufficient privileges。原因Oracle 的DEFINERS RIGHTS存储过程默认模式在执行时不启用通过角色获得的权限只认直接授予用户的系统权限和对象权限。你在 SQL*Plus 里能查是因为CONNECT、RESOURCE这些角色生效了过程里这些角色不生效。解决两种选法。给用户直接授权GRANT SELECT ON hr.employees TO book;不用角色或者把过程改成AUTHID CURRENT_USER让它在调用者的权限上下文中执行。教材示例通常不涉及跨 schema但如果你的练习是把书上的脚本挪到自己建的库上跑这个坑几乎必踩。5.3 PLS-00103遇到符号“;”先查全角字符现象一段看起来完全正确的存储过程编译报PLS-00103: Encountered the symbol ; when expecting one of the following: ...报的行号指向一行毫无问题的语句。原因从 PDF 或网页复制代码时混入了全角空格U3000、中文全角分号、中文引号“ ”。这些字符在编辑器里和半角字符长得几乎一样但 Oracle 的语法分析器不认。报错行号偏一行也正常因为解析器是在读到下一个 token 时才判断前一个有问题。解决用编辑器打开文件正则搜[\u3000\uFF1B\u201C\u201D\uFF08\uFF09]批量替换。更稳的办法是用od -c file.sql | grep -n 343 200 200这类命令查一遍字节或者干脆把脚本先用iconv -f GBK -t UTF-8转一次再统一处理。5.4 ORA-28040 和 ORA-01017版本错配与密码大小写现象用 11g 的客户端连高版本服务端报ORA-28040: No matching authentication protocol或者明明密码对却报ORA-01017: invalid username/password; logon denied。原因前者是客户端和服务端的认证协议版本不匹配11g 客户端默认只协商到较低版本的协议后者常见于服务端开启了密码大小写敏感SEC_CASE_SENSITIVE_LOGON而教材脚本里写的密码是全小写或者你在不同工具里输入时首字母大写了。解决版本错配在客户端sqlnet.ora里加SQLNET.ALLOWED_LOGON_VERSION_SERVER8和SQLNET.ALLOWED_LOGON_VERSION_CLIENT8服务端和客户端各配一处然后重启监听。密码问题用ALTER USER book IDENTIFIED BY book;重新设一次注意这里加了双引号密码就按字面大小写生效。5.5 脚本跑一半中断DDL 已经隐式提交现象批量执行到第 6 个脚本报错退出你以为整个事务回滚了重新跑一遍发现第 1 到 5 个脚本的表已经存在报ORA-00955: name is already used by an existing object。原因Oracle 的 DDL 语句会隐式提交当前事务CREATE TABLE执行成功的那一刻就已经落盘了跟你有没有COMMIT无关。WHENEVER SQLERROR EXIT只是终止了客户端继续发送后续语句前面已经执行的 DDL 一个都不会回滚。解决所有批量脚本都写成幂等的——建表前先判断存在性或者执行前先跑一个drop_all.sql清场。清场脚本用 PL/SQL 动态生成最省事-- drop_all.sql按依赖倒序删除当前用户下的表 BEGIN FOR r IN (SELECT table_name FROM user_tables WHERE table_name NOT LIKE BIN$% -- 跳过回收站对象 ORDER BY table_name DESC) LOOP EXECUTE IMMEDIATE DROP TABLE || r.table_name || CASCADE CONSTRAINTS PURGE; END LOOP; END; /CASCADE CONSTRAINTS顺带删掉外键PURGE不进回收站——不加PURGE的话反复重建几次之后USER_TABLES里查不到但表空间里全是BIN$开头的回收站对象磁盘空间照占新手常在这上面白折腾半天。6. 进阶把教材实例改造成能反复重建的验证库教材脚本是“一次性演示”思路跑通了就不管了但你自己要用它练手、做实验、验证某个索引到底有没有生效就需要一套可重复重建的结构。我的做法是把源程序包拆成两个目录ddl/放结构dml/放数据中间夹一个drop_all.sql形成“清场 → 建结构 → 灌数据 → 验证”的闭环一条命令就能回到初始状态。在此基础上再补一张验证清单每次改完脚本跑一遍比肉眼比对结果可靠得多验证项检查语句期望结果对象数量SELECT object_type, COUNT(*) FROM user_objects GROUP BY object_type;与教材章节对象数一致无效对象SELECT object_name FROM user_objects WHERE statusINVALID;返回空表行数SELECT table_name, num_rows FROM user_tables;与示例数据量一致约束完整性SELECT constraint_name, status FROM user_constraints WHERE statusENABLED;返回空索引是否被用EXPLAIN PLAN FOR ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);执行计划走 INDEX RANGE SCAN最有价值的是最后一项。教材讲索引那章通常只告诉你“建索引能加速查询”但不会告诉你什么时候优化器根本不走索引。自己动手验证一次比看十页书管用EXPLAIN PLAN FOR SELECT * FROM emp WHERE UPPER(ename) SMITH; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, BASIC COST));你会看到TABLE ACCESS FULL。原因是在ename上做函数运算普通 B*Tree 索引失效了得建函数索引CREATE INDEX idx_emp_upper_ename ON emp(UPPER(ename));才会走。这类“教材没写、但一到真实场景就撞上”的细节才是配套源程序真正的用法——不是照着敲一遍看它对不对而是拿它当基座改一个条件看执行计划和结果怎么变。从那以后我每次拿到别人整理的.sql包都强制先跑一遍drop_all.sql再全量重建哪怕对方说“已经测过了”。教材配套源程序尤其如此它是为了配合书上的讲解顺序写的不是为了一次性跑通设计的中间藏几个顺序依赖和半角全角问题太正常了。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
R语言钻石价格分析:ggplot2数据清洗与多元线性回归实战 简介:《钻石价格分析-基于R语言》是一份面向R语言初学者与数据分析入门者的实战型文档,围绕ggplot2内置diamonds数据集,完整呈现从数据清洗到回归建模的分析路径。内容涵盖缺失值与重复值检查、异常值箱线图识别与剔除、价格分布直方图与核密… · 2026/11/4 16:59:49
Qt 5.15.0在线安装卡29%:Fiddler镜像改写与分批补装 简介:《完美解决QT 5.15.0在线安装问题》是一份面向Qt开发者的实战排错文档,聚焦Qt 5.15.0之后官方改为在线安装所引发的下载缓慢、安装程序频繁崩溃、配置镜像代理后仍在中途失败等典型问题。文档从现象出发,梳理数据量大导致的内存耗尽与连… · 2026/11/4 16:58:48
推荐系统召回阶段损失函数设计与优化实践 1. 召回系统中的损失函数概述 在推荐系统的召回阶段,损失函数的选择直接影响着模型从海量候选集中筛选出相关物品的能力。不同于排序阶段更关注精准的CTR预估,召回模型的核心任务是快速缩小候选范围,因此其损失函数设计需要兼顾效率与效果。 … · 2026/11/4 16:58:48
OpCore-Simplify 完整指南:从一份硬件报告到可启动的 OpenCore EFI,5 个关键判断点讲清楚 OpCore-Simplify 完整指南:从一份硬件报告到可启动的 OpenCore EFI,5 个关键判断点讲清楚 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Sim… · 2026/11/4 19:09:32
LTX-2社区许可协议完全解读:商业使用与开源合规的终极指南 [特殊字符] LTX-2社区许可协议完全解读:商业使用与开源合规的终极指南 🚀 【免费下载链接】LTX-2 项目地址: https://ai.gitcode.com/hf_mirrors/Lightricks/LTX-2
LTX-2作为Lightricks公司推出的高效联合音视频基础模型,采用独特的LTX-2社区许可… · 2026/11/4 19:09:32
异构计算环境下的模型部署优化:Hermes Agent端到端量化方案深度解析 异构计算环境下的模型部署优化:Hermes Agent端到端量化方案深度解析
在AI应用开发中,模型部署的效率直接影响用户体验和资源消耗。Hermes Agent作为一款强大的AI代理框架,通过量化与剪枝技术可以显著提升部署性能,实现内存占用减少… · 2026/11/4 19:09:32
Zotero PDF 翻译插件:免费选中文本即译,支持 20+ 翻译服务 Zotero PDF 翻译插件:免费选中文本即译,支持 20 翻译服务 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.c… · 2026/11/4 19:09:32
SolidCraft 参数化 CAD 上手全解:改一个 24 mm,看整机箱如何自动重建 SolidCraft 参数化 CAD 上手全解:改一个 24 mm,看整机箱如何自动重建 【免费下载链接】solidcraft SolidCraft: an open-source parametric 3D CAD application built in pure Rust. Desktop, web, and automation through MCP. 项目地址: https://git… · 2026/11/4 19:09:32
3 分钟把 Win11 任务栏调回 Win10 样式:ExplorerPatcher 完整配置指南 3 分钟把 Win11 任务栏调回 Win10 样式:ExplorerPatcher 完整配置指南 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher
升级到 Wind… · 2026/11/4 19:08:31
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38