Oracle 11g实例源程序实战:从环境搭建到SQL/PL/SQL调试 简介《Oracle 11g从入门到精通第二版》配套的实例源程序包面向Oracle初学者与数据库管理员帮助读者通过可运行示例系统掌握安装配置、SQL编写、索引设计、数据库对象、备份恢复与性能优化等核心内容。包内共495个文件以txt示例、java源码、class编译结果、xml配置文件为主并有bak备份脚本、doc文档、xls表格、pdm模型等辅助材料整体仅1.21MB便于按需取用。目前已有403人浏览学习。资源覆盖19个章节的实例尤其包含索引创建、表空间备份、备份与恢复、闪回表、回收站等关键操作的源文件读者可对照书本逐章实践快速理解每个知识点在真实数据库管理中的用法无论入门学习还是日常查阅都是实用的配套资料。2. 先把“实例源程序”用对地方——这本书配套代码的真实价值手头这份《Oracle 11g从入门到精通第二版》的实例源程序压缩包很多人下载后习惯性解压看到几十个文件夹就不知道下一步该干什么了。作为从Oracle 8i时代折腾到21c的老用户我可以负责任地说这本书的配套代码价值不在于“能跑”而在于它把SQL、PL/SQL、备份恢复、性能调优这些知识点全部变成了可以直接执行的脚本。你对着屏幕敲十遍CREATE TABLE不如把源码里的建表脚本看明白一遍再自己改一版。2.1 这份源码包里到底有什么以第二版常见目录结构为例解压后大致能看到按章节组织的子目录比如ch03_sql基础、ch07_plsql编程、ch12_备份恢复之类。每一章里又分成若干.sql文件命名规律通常是ex_3_1.sql、proc_demo.sql这种对应书中“动手实践”部分的示例。这些脚本里最有含金量的是两类一类是建表、造数、查询的SQL脚本书它们是整个数据库操作的基本功另一类是PL/SQL块、存储过程、触发器、游标、动态SQL、异常处理的脚本这类代码在真实开发里每天都在写。很多培训机构的Oracle课件其实就是拿这本书的例子改了改再搬过去用的。注意这里的.sql文件绝大多数是给SQL*Plus或PL/SQL Developer这类客户端执行用的不是放到Java、Python项目里直接引用的。先弄懂这个定位后面才不会绕弯路。2.2 正确的学习顺序不要跳着跑源码我见过太多新手拿到源码的第一步是打开PL/SQL Developer按F5执行然后被一堆“ORA-00942: table or view does not exist”劝退。原因很简单示例脚本之间有依赖关系。比如第7章的游标示例依赖第3章创建的emp、dept表第12章的备份恢复脚本需要你先有完整的用户权限和归档模式配置。所以正确打开方式是按章节顺序走先跑建表脚本再跑DML造数脚本之后再去执行PL/SQL存储过程、函数、触发器。如果某一段脚本报错先检查它引用的表或对象是否已经创建而不是怀疑代码本身有问题。书里源代码经过了十几年的读者检验“书没写错”的概率远大于“代码有问题”。3. 跑通源码之前的Oracle 11g环境准备源码有了环境起码要有Oracle 11g。这一步看着简单实际是整套源码学习里最大的拦路虎。我见过很多人的问题不在SQL而在安装和连接阶段就卡死了。3.1 安装包选择与初始密码策略先解决安装包问题。Oracle 11g的安装包分为两个ZIP文件外加一个cvu_prereq之类的预检目录很多网站只提供其中一个分卷下载下来解压报CRC错误。正确做法是下载后核对文件大小官网或正规镜像站点都会标注每个分卷的字节数。Windows下两个分卷解压到同一个目录双击setup.exe开始安装。安装时记住了数据库版本根据操作系统位选择对应的32位或64位包。许多老机器上装64位Oracle 11g失败不是包的问题而是操作系统版本太老或缺少组件。另外Oracle 11g的默认密码策略有生命周期限制初装时如果不想后续频繁改密码可以把密码设为Oracle_123这种复杂度够高、字母加下划线加数字的组合后面通过ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;把有效期去掉。3.2 安装时的两个常见模式差异网络热词里有个“oracle11g桌面类安装”指的是安装界面中“桌面类”和“服务器类”两种选择。桌面类适合个人学习和开发会自动创建数据库实例并配置监听服务器类则适合生产环境需要手动选择组件、配置ASM、指定数据文件位置。如果是自己学习我建议直接选“桌面类”把全局数据库名设为orclSID设为orcl字符集选AL32UTF8。这里有一个很多人忽略的细节SID在连接字符串里非常关键比如jdbc:oracle:thin:localhost:1521:orcl末尾的orcl就是SID。后面连接报ORA-12505十有八九是这里写错了或监听里没有这个SID。3.3 安装后的首要配置安装完成不代表就能跑源码至少还要确认三件事。第一监听器是否正常。在命令行输入lsnrctl status看到The command completed successfully并且显示服务orcl已注册说明1521端口正常监听。第二示例用户scott是否存在。11g默认安装不启用scott用户需要手动执行ALTER USER scott ACCOUNT UNLOCK IDENTIFIED BY tiger;来激活订单管理示例和游标示例都依赖这个用户。第三可视化开发工具。我平时用PL/SQL Developer比较多新版本比如Datagrip也能连只是连Oracle的驱动类型要选对。补充一句连接本地数据库先直连测试。用SQL*Plus执行sqlplus system/密码localhost:1521/orcl通了再连IDE工具。这一步通过说明数据库实例和监听都正常后面排查工具连接问题才不会一头雾水。4. 3个步骤把书籍示例跑到屏幕上环境就绪后真正动手跑源码时要注意“会话”和“执行方式”。下面按从简到繁的顺序挑三个典型场景演示。4.1 用SQL*Plus跑建表脚本假设解压目录是D:\oracle_book_code\ch03里面有个create_table.sql文件。打开命令行依次执行sqlplus scott/tigerlocalhost:1521/orcl D:\oracle_book_code\ch03\create_table.sqlSQL*Plus的命令会逐条执行文件里的SQL。如果脚本里有SET ECHO ON那你就能看到每条语句和结果如果只有SET ECHO OFF就只看到Table created.一类的反馈。跑完以后用DESC emp;确认表结构再执行几个SELECT验证数据。这里有个经验很多示例脚本是用Windows记事本保存的执行时如果中文乱码多半是文件编码不是AL32UTF8。解决办法是用PL/SQL Developer打开文件另存为UTF-8编码再执行。4.2 用PL/SQL Developer跑存储过程与匿名块书的第7、8、9章出现大量PL/SQL代码。在PL/SQL Developer里新建一个“Test Window”或“Command Window”把源码里的匿名块粘贴进去按下F8执行。如果是有名块CREATE OR REPLACE PROCEDURE这种先执行创建再右键“Test”或直接写一个调用块。典型存储过程代码CREATE OR REPLACE PROCEDURE raise_salary( p_empno NUMBER, p_rate NUMBER ) IS BEGIN UPDATE emp SET sal sal * (1 p_rate / 100) WHERE empno p_empno; COMMIT; END; /执行这段之前确保emp表已存在并且当前用户有UPDATE权限。如果用的是scott账户它在自己的schema下操作没有权限问题。调用测试EXEC raise_salary(7369, 10); SELECT ename, sal FROM emp WHERE empno 7369;4.3 一个综合示例游标加异常处理书里游标章节的示例比较有代表性直接照抄会遇到的坑是把FOR UPDATE和COMMIT用在一个游标里导致游标失效。参考源码会写成显式游标加异常块DECLARE CURSOR cur_emp IS SELECT empno, ename, sal FROM emp WHERE deptno 20 FOR UPDATE; v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN OPEN cur_emp; LOOP FETCH cur_emp INTO v_empno, v_ename, v_sal; EXIT WHEN cur_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(员工: || v_ename || , 薪资: || v_sal); END LOOP; CLOSE cur_emp; EXCEPTION WHEN OTHERS THEN IF cur_emp%ISOPEN THEN CLOSE cur_emp; END IF; RAISE; END; /在SQL*Plus里执行前先执行SET SERVEROUTPUT ON否则看不到DBMS_OUTPUT.PUT_LINE的输出结果。这个细节遗忘率很高我帮人排查过好几次“代码没问题但没输出”的情况基本都是没开serveroutput。5. 新老手都会撞上的连接错误排查跑源码本身不难难的是在跑之前把环境和连接搞定。网络热词里出现频率极高的ORA-12505恰好是绝大多数Oracle初学者在Datagrip、Navicat、PL/SQL Developer里遇到的第一个大型劝退现场。5.1 ORA-12505TNS listener does not currently know of SID这句报错的完整形式是ORA-12505: TNS:listener does not currently know of SID given in connect descriptor。字面意思是监听器不认识你连接描述符里写的SID。常见场景是安装时全局数据库名和SID不一致比如数据库名叫orcl.abc.comSID却是ORCL或者你把SID写成了服务名orclpdb这是多租户架构里PDB的叫法11g根本没有这个概念。排查步骤按顺序来用lsnrctl services查看监听器当前注册的实例名。用sqlplus system/密码localhost:1521/orcl验证本地连接是否成功。如果本地成功、Datagrip失败检查Datagrip的“SID”框是不是留空了或数据库类型选了服务名而不是SID。在Datagrip里连接Oracle数据库的配置项里有一个“SID”选项需要填入orcl而不是主机名。很多新版工具默认用服务名连接两者混淆之后即使监听正常也会报错。5.2 Datagrip等新工具连接Oracle 11g的注意点Datagrip自带的Oracle驱动通常较新连接11g时偶尔会出现“ORA-28040: No matching authentication protocol”错误原因是11g的数据库版本太老对高版本驱动的认证方式不支持。解决办法是下载ojdbc8.jar或ojdbc6.jar在Datagrip的“数据源”设置里替换掉默认驱动。替换驱动在Datagrip的操作路径是数据源设置 - 驱动程序 - Oracle - 加号 - 选择本地jar包 - 移除默认驱动。这一步处理完ORA-28040基本消失。另外连接URL也不要照抄网上的jdbc:oracle:thin://localhost:1521/orcl这个写法是服务名格式。11g纯SID连接用冒号版本jdbc:oracle:thin:localhost:1521:orcl。5.3 安装与卸载相关提醒网络热词里出现“oracle11g卸载教程”说明很多人都被卸载问题折磨过。Oracle 11g在Windows下卸载先停止所有Oracle服务用Universal Installer删数据库软件再手动删除注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE和相关服务项最后删除C:\app\用户名目录和ORACLE_HOME环境变量。顺序不能反先删文件和注册表再卸载软件会导致控制面板卸载程序找不到卸载入口。实操心得装Oracle最怕的不是装不上而是装一半失败后残留的安装状态。如果你用官方安装包反复失败先把“我的电脑-管理-服务和应用程序-服务”里所有名称带Oracle的服务全部停止再用“Windows Installer 清理实用工具”处理一次比一上来重装系统省事得多。6. 从“书里能跑”到“手上能用”——改造示例的实用思路把书里的示例代码跑通只是完成了复制粘贴的第一步。在工作里这些代码的直接可用性并不高原因倒不是书的问题而是书为了讲原理会故意简化很多东西比如省略异常处理、不考虑并发、不写注释等。想在项目中真正用起来至少要做三处改造。6.1 给示例脚本补上日志和异常处理书里的存储过程常常是“更新数据 - COMMIT”两步走。实际业务里你要在外层包一个异常处理把错误信息写到日志表再决定是回滚还是继续。比如CREATE OR REPLACE PROCEDURE raise_salary_safe( p_empno NUMBER, p_rate NUMBER ) IS BEGIN UPDATE emp SET sal sal * (1 p_rate / 100) WHERE empno p_empno; IF SQL%ROWCOUNT 0 THEN RAISE_APPLICATION_ERROR(-20001, 员工编号不存在); END IF; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE(SQLERRM); RAISE; END; /这个小改造加了“受影响行数为0就报错”的校验以及出错后的回滚逻辑已经是生产级别的思想了。6.2 养成SQL和PL/SQL分离的习惯书中示例的另一个特点是SQL语句和PL/SQL逻辑混在一起。实际开发中推荐把复杂SQL拆到视图里存储过程只负责业务流转。比如建一个视图v_emp_dept过程只去查询它。这样做的好处是后续调优SQL时不需要动过程代码只优化视图或加索引即可。另一个很现实的习惯是每个示例源文件头部都应该加上作者、创建日期、用途说明、修改记录的注释块。这本书的配套源码几乎没有这些注释这就是继承代码和使用自主代码的一个明显分水岭。6.3 跨数据库迁移的现实问题网络热词里提到“oracle11g数据库数据导入到sql server2016”遇到这种需求时不要把源码里的SQL当万能钥匙。Oracle的SYSDATE、NVL、||拼接字符串在SQL Server里分别是GETDATE()、ISNULL、操作符直接复制过去一定会报错。推荐的做法是用微软官方的SQL Server Migration Assistant for OracleSSMA可视化选择要迁移的表、视图、存储过程它能把大部分建表语句和基础T-SQL转换掉。至于PL/SQL过程SSMA能转换一部分复杂逻辑还是得人工重写。也就是说书中源码的“跨库价值”主要在看懂业务逻辑而不是直接搬运语法。7. 写在最后把这份《Oracle 11g从入门到精通第二版》的实例源程序真正用起来并不需要你背下几百个例子而是通过跑通它们把“SQL怎么写”“PL/SQL怎么调试”“Oracle实例怎么连”这些最基础的动作变成肌肉记忆。我在教新人时最后总喜欢说一句先不要把书合上把今天跑通过的脚本改一个参数再执行一遍看结果变没变变了就说明你真的上手了。这就是这门手艺最朴素的起点。本文还有配套的精品资源点击获取