简介《Oracle 11g从入门到精通第二版》实例源程序包面向Oracle初学者与需要系统提升数据库技能的开发、运维人员覆盖19个章节的配套代码帮助读者通过动手实践理解数据存储、查询优化、事务处理及备份恢复等核心机制。资源共495个文件以txt脚本与说明文本236份、class编译产物123份及java源码44份为主另含XML配置、文档表格及示例图片等辅助材料整体仅1.21MB轻量易下载章节目录清晰便于按需翻阅。从基础的表、索引创建到视图、存储过程、触发器、游标再到用户权限、角色、备份恢复以及SQL调优、分区、并行执行等进阶主题均有对应实例可供直接运行和改造。目前已有404人学习下载适合自学、教学演示或作为项目开发时的语法参考能显著缩短从理论到实操的转化路径。1. oracle11g从入门到精通第二版拿到实例源程序后先从哪一步开始很多初学者在安装完Oracle 11g之后面对这本入门书附带的实例源程序压缩包第一反应是双击解压然后瞬间被几百个.sql文件淹没。真正的问题不是这些代码写得不好而是你不知道先跑哪一个、用什么身份连、在哪个目录下执行。我见过不少A同学书都读到第十章了sqlplus还没成功敲进去过一条自己的建表语句。这个标题背后的实际价值是把一套有组织、有依赖顺序的PL/SQL和SQL案例变成你本机能反复练习的数据库沙盘。它适合刚装好11g却卡在监听和权限环节的读者也适合想用书中实例做回归训练的从业者。文章会沿着「环境准备—脚本分类—运行方法—报错排查—参数调整—长期复用」这条线把这份实例源程序真正用起来。2. 搭好实例运行环境Oracle 11g监听、实例启动与内置示例账户的准备工作2.1 解压源程序包并按章节建立本地目录拿到实例源程序后不要急着在图形界面里挨个双击执行脚本。先看压缩包内部的目录结构。常见做法是按章节划分文件夹例如chapter02、chapter03这样组织而每一章里又分别存放建表、插入数据、PL/SQL对象等脚本。解压时我会刻意保留这套层级因为后面用符号执行脚本时脚本内部很多地方会引用相对路径或同目录下的其他文件打散目录会让依赖关系直接断掉。# 在服务器或本机的练习目录下解压保留原目录结构 mkdir -p /u01/scripts/oracle11g_demo cd /u01/scripts/oracle11g_demo unzip /tmp/oracle11g从入门到精通第二版-实例源程序.rar -d . # 查看顶层结构确认章节目录齐全 ls -l参数说明-d参数指定解压目标目录Keep好原来的章节目录结构。如果解压后脚本里出现./data/xxx.sql这类写法路径是相对于当前工作目录的所以解压后我一般先cd到对应章节目录再执行避免找不到文件的报错。这一步虽然简单却是后面所有操作不出幺蛾子的基础。解压完成后把整个目录转移到统一位置例如Linux下的/u01/scripts或Windows下的D:\oracle_demo。不要放在中文或带空格的路径里如果一定要放注意sqlplus对路径的解析逻辑与操作系统不完全一致后续直接踩坑。2.2 配置环境变量和监听lsnrctl与tnsnames.ora的关键检查很多初学者误以为装完数据库就能直接连实际上一大半的问题都出在监听没起来或服务名写错。Oracle 11g里监听是独立的进程负责接收客户端连接请求并转发给实例。检查环境时我习惯先补充环境变量再确认监听状态。# 以oracle用户登录后设置必要的环境变量 cat ~/.bash_profile EOF export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SIDORCL export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib export NLS_LANGAMERICAN_AMERICA.ZHS16GBK EOF source ~/.bash_profile # 启动并查看监听状态 lsnrctl start lsnrctl status说明ORACLE_HOME指向11g的安装根目录ORACLE_SID必须与实例名一致默认为ORCL。NLS_LANG决定了客户端与服务器交互时使用的字符集这项设置和环境配置里的字符集不匹配时会出现中文乱码后面避坑章节还会提到。# 用tnsping验证服务名能不能被解析 tnsping ORCL # 查看监听配置文件 cat $ORACLE_HOME/network/admin/listener.ora cat $ORACLE_HOME/network/admin/tnsnames.oralistener.ora中通常配置了监听端口1521和监听的服务名tnsnames.ora里定义的是客户端视角的连接描述。如果tnsping ORCL提示无法解析一般是tnsnames.ora里没有ORCL这个条目或者主机名配置成了本机不存在的标识。我一般把HOST改为127.0.0.1避免机器名解析不到。2.3 解锁scott/hr并验证能连上书里的实例大量使用scott.emp、scott.dept这类经典表结构还有少数章节会用到hr方案下的employees表。这两个账户在11g安装后默认锁定需要手动解锁并设置密码。# 用sqlplus以sysdba身份登录 sqlplus / as sysdba -- 解锁scott并设置密码 ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK; -- 解锁hr并设置密码 ALTER USER hr IDENTIFIED BY hr ACCOUNT UNLOCK; -- 授权连接和资源权限如果不给权限后面执行脚本会报权限不足 GRANT CONNECT, RESOURCE TO scott; GRANT CONNECT, RESOURCE TO hr; -- 查询确认 SELECT username, account_status FROM dba_users WHERE username IN (SCOTT, HR);说明scott与hr是Oracle内置示例schemaCONNECT角色只包含登录权限RESOURCE角色提供了创建表、序列、存储过程等对象的基本权限。如果不做授权执行到DDL语句时会报ORA-01031: insufficient privileges。验证连接时我习惯用完整连接串而不是本地操作这样能确认监听和网络层也通了。conn scott/tiger127.0.0.1:1521/ORCL SELECT * FROM emp;这里能查到emp表数据说明环境已经通了。接下来才进入实例源程序的正题。3. 把实例源程序跑起来三类SQL脚本的识别与运行顺序3.1 先分清DDL、DML与PL/SQL对象脚本实例源程序里的.sql文件表面上长得差不多本质上分三类。第一类是DDL负责建表、建索引、建约束第二类是DML负责往表里插数据、改数据第三类是PL/SQL对象定义包含存储过程、函数、包、触发器等。这三类脚本的依赖关系非常明确必须先有表才能插数据必须有了表和函数才能编译存储过程。很多初学者一股脑全选执行结果一半失败一半成功最后哪张表有数据都不知道。我的做法是先看一眼脚本里的前几行。# 查看脚本开头判断类型 head -n 20 /u01/scripts/oracle11g_demo/chapter02/create_table_emp.sql head -n 20 /u01/scripts/oracle11g_demo/chapter02/insert_data_emp.sql head -n 30 /u01/scripts/oracle11g_demo/chapter12/pkg_employee.sql第一段通常会出现CREATE TABLE第二段通常是INSERT INTO第三段会出现CREATE OR REPLACE PACKAGE或CREATE OR REPLACE PROCEDURE。按这个特征把文件分类到三个目录后续执行时就不会乱。3.2 用SQL*Plus执行建表和插入脚本把脚本分类后先执行DDL再执行DML。我习惯把每个文件的执行结果输出到日志文件里方便回看哪些语句失败了。cd /u01/scripts/oracle11g_demo/chapter02 sqlplus scott/tiger127.0.0.1:1521/ORCL EOF SET ECHO ON SET FEEDBACK ON SPOOL /tmp/run_ch02.log create_table_emp.sql create_table_dept.sql insert_data_emp.sql insert_data_dept.sql COMMIT; SPOOL OFF EOF说明符号后面跟的是脚本文件名sqlplus会按顺序执行其中的每条语句。ECHO ON会在屏幕上回显脚本内容SPOOL把全过程写入日志文件。COMMIT在脚本里可能已经写了但我会再多执行一次确保数据落盘。执行后检查日志里有没有ORA-开头的行这是最直接的验收方式。grep -i ORA- /tmp/run_ch02.log如果没有任何ORA错误接着验证表和数据量SELECT COUNT(*) FROM emp; SELECT COUNT(*) FROM dept;此时计数与书中所附结果一致说明DDL与DML层已通过。需要注意有些章节的脚本假定emp表不存在如果之前建过同名的表会报ORA-00955: name is already used by an existing object。我的习惯是每次练习前用DROP TABLE ... CASCADE CONSTRAINTS清理一遍再执行建表脚本。3.3 存储过程、包和触发器的编译与执行要点PL/SQL部分要换个思路。这类脚本不一定要马上执行成功可以先编译后查看状态。存储过程间存在依赖关系比如过程A调用函数B那么B必须先编译成功。如果顺序乱了会得到一堆ORA-04063的错误提示对象无效。sqlplus scott/tiger127.0.0.1:1521/ORCL EOF SET ECHO ON SPOOL /tmp/run_ch12_pkg.log chapter12_pkg_spec.sql chapter12_pkg_body.sql SPOOL OFF EOF执行后必须查询数据库里的对象状态SELECT object_name, object_type, status FROM user_objects WHERE object_name IN (EMP_MGMT) AND object_type IN (PACKAGE, PACKAGE BODY, PROCEDURE);如果status为VALID说明编译通过。如果状态是INVALID常见原因是引用了还不存在的表或者另一个被调用的函数还没有编译。此时按依赖顺序重新执行相关定义即可。触发器脚本要谨慎。触发器一旦创建后续对表的DML操作都会触发它如果触发器里有逻辑问题会拖慢所有操作。我一般在练习库里把它们单独建在一个schema下先手动执行一遍触发器体里的逻辑确认无误再挂到表上。这样避免了触发器在插入数据时意外执行出错导致整批数据回滚的翻车现场。4. 避坑Oracle 11g实例脚本运行中的高频报错与排查4.1 ORA-01034实例未启动现象sqlplus登录时报ORA-01034: ORACLE not available连用system账户都进不去。原因这个最常见于安装完数据库后重启机器实例没有随开机自动启动。Linux环境里dbstart脚本未生效Windows服务被停掉或者手动执行过shutdown abort后没有startup。解决以sysdba身份启动实例一句话就回来sqlplus / as sysdba startup启动后立刻验证实例状态SELECT instance_name, status FROM v$instance;OPEN状态说明实例已就绪。如果startup时报ORA-01157则数据文件可能缺失此时要查看alert_ORCL.log日志定位具体文件。4.2 ORA-12541监听没有捕获到连接请求现象客户端用scott/tiger127.0.0.1:1521/ORCL连接时报ORA-12541: TNS:no listener。原因监听进程没启动或者监听端口被改了或者tnsnames.ora里写的端口与listener.ora不一致。这个属于最常见的网络层坑。解决先查看监听状态再确认端口。lsnrctl status如果看出监听已停止直接起lsnrctl start如果监听明明是READY状态但客户端仍报错重点查tnsnames.ora里的PORT是不是写成了别的数字。我之前遇到过本机安装了多个Oracle版本端口被另一个实例占用的场景排查了很久才发现是我把1522写成了1521。4.3 ORA-00942表或视图不存在现象执行SELECT * FROM emp时报ORA-00942: table or view does not exist但书里明明有这个表。原因当前登录的用户不对。emp表在scott用户下你用system登录当然看不到。如果是在别人的库上练习还可能表被建到了别的表空间或别的schema里。解决确认当前用户并查询对象归属SHOW user; SELECT owner, table_name FROM all_tables WHERE table_name EMP;如果要长期使用scott下的表可以用ALTER SESSION SET CURRENT_SCHEMAscott;切到对应schema不需要反复用scott.emp这种全限定名。如果表确实不存在回头把建表脚本按第3章的顺序重新执行一遍。4.4 中文乱码与环境变量NLS_LANG现象插入中文数据后查出来是???或者查询结果里中文显示成乱码。原因NLS_LANG设置与数据库字符集不一致。多数实例源程序里设计了中文场景客户端字符集若是AL32UTF8而服务器端是ZHS16GBK数据写入时转换就出问题。解决跟随数据库实际字符集设置NLS_LANG。SELECT value FROM nls_database_parameters WHERE parameter NLS_CHARACTERSET;如果查询结果ZHS16GBK则在环境变量里统一写export NLS_LANGAMERICAN_AMERICA.ZHS16GBKWindows下则在注册表里改ORACLE_HOME下的NLS_LANG键值改完重启sqlplus。这里最关键的是服务器端与客户端保持一致而不是凭感觉选UTF8。4.5 脚本里的老语法与新版本行为差异现象执行书里的脚本偶尔报出ORA-00937或ORA-00979之类的语法错误但语句本身在书上看起来没问题。原因部分实例源程序编写时的Oracle版本较早一些写法在11g下依然可用但个别行为有差异。比如GROUP BY的列必须与SELECT列严格对应如果脚本里写得宽泛旧版本容忍11g就报错。解决把报错信息拆开看重点看SQL*Loader。如果是CONNECT BY相关的递归查询在11g语法下要确认START WITH和CONNECT BY的顺序写对了。另外一个很隐蔽的问题是脚本用了保留字做列名例如COMMENT、LEVEL在11g环境下必须加双引号。碰到这种情况把列名改名或加上双引号就能解决。5. 调好参数再练手SGA、PGA与会话数在练习机上的落地配置5.1 查看现状与修改参数的两种方式实例源程序里包含大量循环插入、批量更新、PL/SQL游标操作。练习机内存不足时跑大脚本会出现ORA-04030: out of process memory或者ORA-04031: unable to allocate shared memory。这时候不是脚本的问题而是练习机上的SGA或PGA给得太小。先看当前参数SHOW PARAMETER sga_target; SHOW PARAMETER pga_aggregate_target; SHOW PARAMETER processes; SHOW PARAMETER sessions;修改参数有两条路。一是ALTER SYSTEM SET立刻生效但重启丢失二是改spfile永久生效。我一般在确认值合适后直接写成SCOPEBOTHALTER SYSTEM SET sga_target800M SCOPEBOTH; ALTER SYSTEM SET pga_aggregate_target200M SCOPEBOTH; ALTER SYSTEM SET processes300 SCOPEBOTH; ALTER SYSTEM SET sessions400 SCOPEBOTH;说明sga_target是共享内存区总大小pga_aggregate_target是每个进程排序和哈希操作可用的私有内存总量。练习机上改这两个参数后执行大批量数据插入和复杂查询的效果提升很明显。5.2 练习场景的推荐参数表参数名推荐练习值参数含义设置建议sga_target600M ~ 1000M系统全局区总大小物理内存8G以下取600M16G取1Gsga_max_size与sga_target一致SGA上限重启前生效先改max_size再改targetpga_aggregate_target150M ~ 300M进程私有内存总和排序多的场景调高processes200 ~ 300允许的最大进程数练习脚本并发低200够用sessions是processes的1.1倍15最大会话数随processes联动调整open_cursors300 ~ 600单个会话最多打开的游标数跑PL/SQL包时最常触发300上限注意sga_max_size不能低于sga_target而且SCOPEBOTH时只能用于可动态调整的参数sga_max_size需要重启初始化实例生效我最常犯的错误是先改target不改max_size结果内存分配总是顶在天花板。5.3 调整后的验证方法参数改完后查看内存分配与命中率确认没有因调整带来副作用。SELECT component, current_size, min_size FROM v$sga_dynamic_components; SELECT name, value FROM v$sysstat WHERE name LIKE %parse count%;如果current_size与调整值一致操作生效。接着跑一遍源程序里的典型脚本重点观察执行时间是否缩短、日志中是否出现ORA-04031。诊断内存类问题最直接的是查看alert_ORCL.log其中会记录每次内存分配失败时的调用栈和参数上下文。还有一个细节练习机如果只有2G内存把sga_target调到1G以上会导致操作系统内存吃紧进而频繁swap。这种情况下我更推荐调低到500M让PGA留出空间。盲目追高参数是新手最容易犯的错参数值应该和物理内存一起考虑而不是越大越好。6. 把书里的实例变成随身练习场三个能长期复用的进阶技巧6.1 用日志文件记录每次脚本执行结果反复执行脚本时不可能每次都盯着屏幕看输出。我一般会把SPOOL固化到每个练习脚本的开头结尾这样每次执行后留下一个带时间戳的日志日后出问题可以直接翻记录。-- 在你自己包装的执行脚本里这样写 SET ECHO OFF SET FEEDBACK ON SPOOL /u01/scripts/logs/run_$(date %Y%m%d_%H%M%S).log chapter02_ddl.sql chapter02_dml.sql SPOOL OFF这样每个批次的执行结果独立成文件复盘时按时间排序即可。我平时排查慢查询也靠这套记录哪个脚本在哪一刻耗时最长一目了然。6.2 把练习库包裹成可重复初始化的一键脚本书里的练习环境必须能一键重建否则第二次练习时手工清理太浪费时间。我会把整个流程组织成一个入口脚本每次练习前执行一次库就回到初始状态。sqlplus system/oracle127.0.0.1:1521/ORCL EOF SPOOL /u01/scripts/logs/rebuild.log reset_schema.sql SPOOL OFF EOFreset_schema.sql里只做两件事DROP掉所有练习相关对象再重新执行实例源程序里的DDL与DML。这个思路比逐条删除表高效得多也避免你因为残留数据导致练习结果和书里对不上。6.3 用数据泵做练习环境的备份与还原数据泵expdp/impdp是练习到一定阶段后最值得掌握的备份方式。源程序练完后把整个scott和hr schema导出之后就算改坏了也能快速还原。expdp system/oracle127.0.0.1:1521/ORCL schemasscott,hr directoryDATA_PUMP_DIR dumpfilebook_demo.dmp logfileexpdp_book_demo.log需要还原时impdp system/oracle127.0.0.1:1521/ORCL schemasscott,hr directoryDATA_PUMP_DIR dumpfilebook_demo.dmp logfileimpdp_book_demo.logdirectory参数指向数据库中的目录对象默认DATA_PUMP_DIR对应服务器上的$ORACLE_HOME/rdbms/log/。如果不知道目录对象对应哪个操作系统路径可以先查dba_directories。数据泵比传统的exp/imp好用的地方在于它支持并行和压缩练习数据量不大通常几秒钟就完成导出。我每周都会导一次练习环境出现任何问题花不到一分钟就能回到可用状态。这些年我带过不少跟着书练Oracle的初学者发现真正拉开差距的从来不是记住了多少语法而是有没有一套稳定的练习闭环解压源程序、跑通依赖顺序、排掉环境问题、把参数调到匹配自己的机器然后用备份保证可以随便折腾。做错一次就重建一次反复折腾几轮后书里的实例就成了自己的肌肉记忆。希望这篇笔记能帮你少走几段弯路也希望你练完这些实例后能自己动手把书里的demo改造成真正属于自己的脚本库。本文还有配套的精品资源点击获取