简介:这份《PL/SQL Developer 11 中文手册》面向 Oracle 数据库开发人员、DBA 及 PL/SQL 初学者,用于解决工具上手慢、功能不熟悉、调试与优化缺少系统参考的问题。手册以中文完整讲解 PL/SQL Developer 11 的安装部署、连接 Oracle 数据库、编写与编译程序、测试脚本、运行时错误跟踪、包状态与 Java 会话状态查看、结果集与 DBMS_OUTPUT 输出、调试与回归测试,以及解释计划、自动统计、PL/SQL 概览图、SQL 跟踪等优化手段,目录结构按功能模块层层展开,便于按需查阅。资源包共 1 个 PDF 文件,约 5.5MB,内容为纯文档型资料,适合作为日常开发与学习的案头参考。目前已有 1870 人学习下载,可帮助读者快速建立对工具整体功能体系的认知,掌握从建连、编码到调试优化的完整工作流。
1. 别急着翻手册:PL/SQL Developer 11 真正该先搞懂的三件事
很多人拿到一份 PL/SQL Developer 11 中文手册,第一反应是从第一页开始啃。我见过太多人翻到第三章就放弃了——因为手册是按功能模块罗列的,不是按你实际干活的顺序写的。你真正需要先搞清楚的只有三件事:连接配置怎么不踩坑、对象浏览器怎么用才高效、SQL 窗口和命令窗口到底什么时候用哪个。这三件事决定了你后面 80% 的操作体验。
PL/SQL Developer 11 是一个面向 Oracle 数据库的集成开发环境,核心用户是写存储过程、做数据查询和调试 PL/SQL 代码的开发者。它不像通用 SQL 客户端那样什么库都连,它就是为 Oracle 生态深度定制的。这意味着它的对象浏览器、调试器、模板系统都围绕 Oracle 的数据字典视图来设计。如果你日常要和包、函数、触发器、序列打交道,这个工具能省掉大量手写 DDL 的时间。但前提是,你得先把连接和基础操作理顺,否则后面全是玄学问题。
2. 连接配置与首选项:从装完到跑通第一条查询
2.1 连接 Oracle 的两种模式与 Instant Client 配置
PL/SQL Developer 本身不带 Oracle 客户端,它依赖 Instant Client 或者完整版 Oracle Client 来建立连接。这是新手翻车最多的地方——装完工具发现连不上,报 ORA-12154 或者 “Initialization error”。
常见做法是下载对应版本的 Instant Client(Basic 包即可),解压到一个没有中文和空格的路径,然后在 PL/SQL Developer 的首选项里指定 OCI 库路径。
具体步骤:
# 假设 Instant Client 解压在 D:\instantclient_19_8 # 目录结构应该是这样: # D:\instantclient_19_8\oci.dll # D:\instantclient_19_8\oraociei19.dll # D:\instantclient_19_8\tnsnames.ora (可选,如果用 TNS 连接)然后在 PL/SQL Developer 中打开Tools → Preferences → Connection,在Oracle Home和OCI Library两栏分别填入:
Oracle Home: D:\instantclient_19_8 OCI Library: D:\instantclient_19_8\oci.dll这里有个血泪经验:如果你的机器上装了多个 Oracle 产品,环境变量PATH里可能有多个 oci.dll 版本冲突。最稳妥的做法是把 Instant Client 路径放在PATH最前面,或者干脆在首选项里写绝对路径,不依赖环境变量。
配置完成后重启 PL/SQL Developer,登录窗口的 Database 下拉框应该能列出你 tnsnames.ora 里配置的服务名。如果没有 tnsnames.ora,也可以直接在 Database 栏输入host:port/service_name格式,比如192.168.1.100:1521/ORCLPDB。
参数说明:host是数据库服务器地址,port默认 1521,service_name是数据库服务名而非 SID。如果你用的是 SID 连接,格式要写成host:port:SID,注意分隔符是冒号不是斜杠。这两种格式搞混是常见翻车点。
2.2 首选项里必须改的五个配置项
装好能连上只是第一步。PL/SQL Developer 11 的默认配置有些地方不太符合国内开发者的习惯,我一般会先改这几个:
第一,自动替换(AutoReplace)。在Preferences → User Interface → Editor → AutoReplace里,可以配置快捷输入。比如输入s*自动展开为SELECT * FROM,输入w展开为WHERE。这个功能用好了能省大量敲键盘的时间。配置文件默认在安装目录的AutoReplace.txt,你可以直接编辑这个文本文件批量添加。
第二,SQL 窗口的回滚段设置。在Preferences → Window Types → SQL Window里,把Max. rows to fetch从默认的 100 改成 500 或 1000。默认 100 条在大表查询时翻页翻到手酸。
第三,自动提交开关。Preferences → Window Types → SQL Window → Autocommit建议关掉。开着的话每条 DML 自动提交,出了错没有后悔药。手动提交虽然多按一次 F10,但安全得多。
第四,代码模板(Code Templates)。在Preferences → User Interface → Code Templates里可以定义存储过程、函数的骨架。比如定义一个proc模板,输入后自动生成CREATE OR REPLACE PROCEDURE ... IS BEGIN ... END;的结构。
第五,字体和配色。默认的 Courier New 小字体看久了眼睛疼。换成 Consolas 或 JetBrains Mono,字号调到 11 或 12。配色方案在Preferences → User Interface → Editor → Syntax Highlighting里改,深色主题对长时间写代码更友好。
2.3 用测试窗口验证连接与权限
配置完之后别急着开 SQL 窗口写业务查询,先开一个Test Window(菜单File → New → Test Window),跑一段最简单的匿名块:
-- 在 Test Window 中执行 DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM user_tables; DBMS_OUTPUT.PUT_LINE('当前用户表数量: ' || v_count); END; /执行前记得开启DBMS_OUTPUT输出:在 Test Window 里点齿轮图标或按Ctrl+E启用输出。如果能看到表数量打印出来,说明连接、权限、输出缓冲区都正常。
这段代码的逻辑很直白:查当前用户下的表数量,通过DBMS_OUTPUT.PUT_LINE打印。参数说明:user_tables是 Oracle 的数据字典视图,只返回当前 schema 下的表;如果你想看所有能访问的表,换成all_tables。DBMS_OUTPUT默认缓冲区大小可能不够,如果输出内容多,先在 Test Window 里执行SET SERVEROUTPUT ON SIZE UNLIMITED。
如果这一步报ORA-00942: table or view does not exist,说明当前登录用户权限有问题,需要让 DBA 授权SELECT权限。如果报ORA-06550,多半是语法问题,检查分号和斜杠有没有写对。
3. 对象浏览器与 SQL 窗口:日常操作效率翻倍的用法
3.1 对象浏览器(Object Browser)的过滤与批量操作
对象浏览器是 PL/SQL Developer 里使用频率最高的面板。左侧树形结构按 schema 分组,展开后能看到 Tables、Views、Procedures、Functions、Packages、Triggers、Sequences 等分类。
新手常见的问题是:数据库里对象太多,找个表要翻半天。解决办法是用过滤器。在对象浏览器顶部的 Filter 输入框里输入关键词,比如EMP,树形结构会实时过滤只显示匹配的对象。支持通配符%和_,比如EMP%匹配所有以 EMP 开头的表。
更高效的用法是右键菜单里的批量操作。选中多个表之后右键,可以批量生成 DDL 脚本、批量导出数据、批量编译无效对象。我经常用的一个场景是:项目迁移时需要导出某个 schema 下所有表的建表语句。操作路径是选中所有表 → 右键 →Export DDL→ 选择输出文件路径 → 勾选Include Storage和Include Tablespace→ 执行。生成的 SQL 文件可以直接在目标库执行。
还有一个容易被忽略的功能是对象浏览器底部的Object Description面板。选中一个表之后,这个面板会显示列名、数据类型、是否为空、默认值、注释等信息。比手动写DESC table_name方便得多,而且能直接看到列注释。
3.2 SQL 窗口与命令窗口的选择逻辑
PL/SQL Developer 里有两种执行 SQL 的窗口:SQL Window 和 Command Window。很多人搞不清楚什么时候用哪个。
SQL Window 是图形化窗口,适合写查询、看结果集、编辑数据。你写一条 SELECT,按 F8 执行,结果以表格形式展示,可以直接在结果集上修改数据然后提交。适合日常查询和数据订正。
Command Window 是命令行风格,适合执行 DDL、跑脚本、做数据库管理操作。它支持 SQL*Plus 的大部分命令,比如@script.sql、SPOOL、SET等。适合批量执行脚本和自动化任务。
选择逻辑很简单:要看数据、改数据,用 SQL Window;要建表、改表结构、跑大批量脚本,用 Command Window。
在 SQL Window 里有一个实用技巧:按Ctrl+Enter只执行光标所在的那条 SQL,而不是执行整个窗口的所有语句。当你在一个窗口里写了好几条 SQL 时,这个快捷键能避免误执行。
-- SQL Window 中,光标放在这条语句上按 Ctrl+Enter 只执行这一条 SELECT employee_id, first_name, last_name, salary FROM employees WHERE department_id = 50 ORDER BY salary DESC; -- 下面这条不会被误执行 SELECT COUNT(*) FROM departments;参数说明:Ctrl+Enter执行当前语句,F8执行全部语句。如果你在调试时只想看某一条的结果,用Ctrl+Enter更安全。另外,SQL Window 的结果集默认只取前 100 行(前面首选项里改过的话按改后的值),如果数据量大,记得在查询里加WHERE条件或者ROWNUM限制。
3.3 用模板和代码片段加速存储过程开发
写存储过程时,大量重复的骨架代码可以用 Code Templates 来生成。配置路径在Preferences → User Interface → Code Templates。
我一般会定义这几个模板:
-- 模板名: proc CREATE OR REPLACE PROCEDURE &name IS -- 声明变量 BEGIN -- 业务逻辑 NULL; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END &name; / -- 模板名: func CREATE OR REPLACE FUNCTION &name RETURN &type IS -- 声明变量 BEGIN -- 业务逻辑 RETURN NULL; EXCEPTION WHEN OTHERS THEN RAISE; END &name; /在编辑器里输入模板名然后按Ctrl+Space或配置的触发键,模板会自动展开,&name和&type会提示你输入实际值。这个功能在写大量结构相似的包体时特别省时间。
参数说明:&name是 PL/SQL Developer 模板的变量占位符,展开时会弹出输入框让你填。&type同理。如果你想让某个占位符有默认值,可以写成&name=default_value的形式。
另外,SQL Window 里右键菜单的Insert Template也能插入预定义模板,但不如快捷键直接。
4. 调试器与性能分析:把存储过程的问题钉死
4.1 用调试器单步跟踪存储过程
PL/SQL Developer 的调试器是它区别于普通 SQL 客户端的核心功能之一。要调试一个存储过程,操作路径是:在对象浏览器里找到目标过程 → 右键 →Test,会打开一个 Test Window,自动生成调用该过程的匿名块。
在 Test Window 里,你可以给参数赋值,然后按F9开始调试。调试过程中可以:
F7单步进入(Step Into)F8单步跳过(Step Over)Ctrl+F7跳出当前过程(Step Out)F9继续运行到下一个断点Ctrl+F9运行到光标处
断点的设置方式是在代码行号左侧的灰色区域点击,会出现一个红色圆点。右键断点可以设置条件,比如employee_id = 100时才中断。
调试时底部的DBMS Output面板会显示DBMS_OUTPUT.PUT_LINE的输出,Call Stack面板显示当前调用栈,Variables面板显示当前作用域内所有变量的值。这三个面板配合使用,基本能定位大部分逻辑问题。
一个常见坑是:调试需要DEBUG CONNECT SESSION和DEBUG ANY PROCEDURE权限。如果按 F9 没反应或者报权限错误,让 DBA 授权:
GRANT DEBUG CONNECT SESSION TO your_user; GRANT DEBUG ANY PROCEDURE TO your_user;4.2 用 Explain Plan 和 AutoTrace 看执行计划
写了一条慢查询,想知道 Oracle 到底怎么执行的,用 Explain Plan 窗口。操作方式:在 SQL Window 里写好查询,按F5打开 Explain Plan 窗口,会以树形结构展示执行计划。
关键看几个东西:TABLE ACCESS FULL表示全表扫描,大表上出现这个基本就是性能问题;INDEX RANGE SCAN表示索引范围扫描,通常是好的;NESTED LOOPS和HASH JOIN的选择取决于数据量和连接条件。
更详细的信息用 AutoTrace。在 SQL Window 里按F6开启 AutoTrace,然后执行查询,结果集下方会多出一个AutoTrace标签页,显示执行计划、统计信息(逻辑读、物理读、排序次数等)。
-- 在 SQL Window 中按 F6 开启 AutoTrace 后执行 SELECT e.employee_id, e.last_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE e.salary > 10000;执行后看 AutoTrace 输出里的consistent gets(逻辑读)和physical reads(物理读)。逻辑读高说明扫描了大量数据块,可能需要加索引或改写查询。物理读高说明数据不在内存中,第一次执行正常,多次执行还高就要检查共享池配置。
参数说明:consistent gets是逻辑读次数,越小越好;physical reads是物理读次数,第一次执行后应该显著下降;sorts (memory)和sorts (disk)如果 disk 排序次数多,说明 PGA 内存不够,需要调大PGA_AGGREGATE_TARGET。
4.3 用 Profiler 定位存储过程内部耗时
如果一个存储过程整体跑得慢,但不知道慢在哪一行,用 PL/SQL Profiler。操作路径:在 Test Window 里打开目标过程,菜单Tools → Profiler或者直接点工具栏的 Profiler 按钮。
开启 Profiler 后执行过程,执行完毕后会生成一个报告,列出每一行代码的执行次数和耗时。重点关注Run Time最高的那几行。
使用 Profiler 需要先创建 Profiler 表:
-- 用 sys 用户执行 @?/rdbms/admin/proftab.sql -- 然后授权给目标用户 GRANT SELECT ON sys.plsql_profiler_data TO your_user; GRANT SELECT ON sys.plsql_profiler_runs TO your_user; GRANT SELECT ON sys.plsql_profiler_units TO your_user;参数说明:proftab.sql是 Oracle 自带的脚本,路径中的?代表 Oracle Home。执行后会创建三张表用于存储 Profiler 数据。授权之后,目标用户才能在 PL/SQL Developer 里使用 Profiler 功能。
Profiler 报告里Run Time的单位是秒,Occurrences是执行次数。如果某行代码执行了 10000 次但每次只花 0.001 秒,累计起来也是 10 秒,这种循环内的低效操作是优化的重点。
5. 避坑与排查:那些手册不会告诉你的翻车现场
5.1 中文乱码:现象、原因与解决
现象:查询结果里的中文显示为问号或乱码,或者插入中文数据后变成乱码。
原因:客户端字符集和数据库字符集不一致。常见情况是数据库是AL32UTF8,但客户端NLS_LANG设置成了SIMPLIFIED CHINESE_CHINA.ZHS16GBK。
解决:在 Windows 环境变量里设置NLS_LANG = SIMPLIFIED CHINESE_CHINA.AL32UTF8,或者在 PL/SQL Developer 的登录后执行:
-- 查看当前会话字符集 SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_CHARACTERSET'; -- 如果和数据库不一致,在首选项的 After Connect 脚本里加: ALTER SESSION SET NLS_LANGUAGE = 'SIMPLIFIED CHINESE'; ALTER SESSION SET NLS_TERRITORY = 'CHINA';更彻底的做法是设置系统环境变量NLS_LANG,然后重启 PL/SQL Developer。注意:NLS_LANG的格式是语言_地域.字符集,字符集部分要和数据库字符集匹配。
5.2 编译报错但看不到具体错误信息
现象:编译存储过程时提示Warning: compiled with errors,但错误列表是空的或者只显示一行模糊信息。
原因:PL/SQL Developer 默认只显示前几条错误,或者错误信息被截断了。
解决:在对象浏览器里找到编译失败的对象,右键 →View Errors,或者直接查数据字典:
SELECT line, position, text FROM user_errors WHERE name = 'YOUR_PROCEDURE_NAME' ORDER BY sequence;参数说明:user_errors视图存储当前用户下所有编译错误,line是行号,position是列号,text是错误描述。如果user_errors里也没有,检查是不是编译时权限不足导致对象根本没创建成功。
5.3 SQL Window 执行大批量更新时卡死
现象:在 SQL Window 里执行一条更新几十万行的 UPDATE,界面卡住不动,进度条一直转。
原因:SQL Window 默认会把结果集缓存在客户端,大批量 DML 会产生大量回滚数据和网络传输。另外,如果 Autocommit 开着,每行提交一次,性能极差。
解决:大批量 DML 改用 Command Window 执行,并且关掉 Autocommit。在 Command Window 里可以加SET ARRAYSIZE和SET COPYCOMMIT来控制批量提交频率:
-- Command Window 中执行 SET ARRAYSIZE 500 SET COPYCOMMIT 1000 UPDATE large_table SET status = 'PROCESSED' WHERE status = 'PENDING'; COMMIT;参数说明:ARRAYSIZE是每次网络往返取的行数,调大可以减少网络交互;COPYCOMMIT是每多少行提交一次,避免大事务撑爆回滚段。这两个参数在 Command Window 里生效,SQL Window 里不适用。
5.4 调试时断点不生效
现象:在存储过程里设了断点,按 F9 调试时直接跑完,断点根本没停。
原因:最常见的原因是编译时没有带DEBUG选项。PL/SQL Developer 默认编译存储过程时可能不带调试信息。
解决:在对象浏览器里右键目标过程 →Recompile→ 勾选Debug选项。或者手动执行:
ALTER PROCEDURE your_procedure COMPILE DEBUG;另外检查当前用户是否有DEBUG CONNECT SESSION权限。如果是在远程数据库上调试,还需要确认数据库的shared_server没有开启(共享服务器模式下调试可能有问题)。
5.5 导出数据时日期格式丢失
现象:用 PL/SQL Developer 的导出功能把表数据导成 SQL 脚本,导入到另一个库后发现日期字段变成了DD-MON-YY格式,或者直接报错。
原因:导出时没有指定日期格式,使用了会话默认的NLS_DATE_FORMAT,不同库的默认格式可能不一样。
解决:导出前先设置会话的日期格式:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';然后在导出工具里勾选Include Date Format或者在导出选项里指定日期掩码。导出的 SQL 脚本里会带上TO_DATE函数,确保导入时格式正确。
6. 进阶技巧:让 PL/SQL Developer 11 真正顺手
6.1 自定义快捷键与宏录制
PL/SQL Developer 支持自定义快捷键。在Preferences → User Interface → Key Configuration里,可以给常用操作绑定快捷键。我一般会把Session → Execute绑到F5(默认是 F8),把Edit → Comment绑到Ctrl+/,把Edit → Uncomment绑到Ctrl+Shift+/。
宏录制功能在Tools → Macro → Record,可以录制一系列操作然后回放。比如你经常需要执行“导出表 DDL → 保存到指定目录 → 打开文件”这一套流程,录一次宏,以后一键完成。宏文件保存在 PL/SQL Developer 安装目录的Macros文件夹下,可以备份和分享给同事。
6.2 用 After Connect 脚本自动初始化会话
在Preferences → Connection → After Connect里可以指定一个 SQL 脚本,每次连接数据库后自动执行。我一般会放这些内容:
-- After Connect 脚本 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'; ALTER SESSION SET OPTIMIZER_MODE = ALL_ROWS; -- 开启 DBMS_OUTPUT BEGIN DBMS_OUTPUT.ENABLE(1000000); END; /参数说明:NLS_DATE_FORMAT设置日期显示格式,避免每次查询都要写TO_CHAR;OPTIMIZER_MODE设为ALL_ROWS表示以整体吞吐量为优化目标,适合报表类查询;DBMS_OUTPUT.ENABLE开启输出缓冲区,大小 1000000 字节。
这个脚本在每个新连接建立后自动执行,省去了每次手动设置的麻烦。注意脚本里不要放COMMIT或 DDL 语句,否则可能影响连接池行为。
6.3 用会话监控查看当前活动会话
PL/SQL Developer 11 有一个Session Monitor功能,在Tools → Session Monitor打开。它可以实时查看当前数据库上的活动会话、执行的 SQL、等待事件等信息。
我一般用这个功能来排查“数据库突然变慢”的问题。打开 Session Monitor,按CPU Time或Wait Time排序,找到消耗资源最多的会话,点进去看它正在执行的 SQL。如果是自己的会话,直接复制 SQL 到 SQL Window 里分析执行计划;如果是别人的会话,可以看等待事件判断是锁等待还是 I/O 瓶颈。
一个实用技巧:在 Session Monitor 里可以右键某个会话 →Kill Session,但慎用,生产环境杀会话可能导致事务回滚和业务中断。我一般只在自己测试库上用这个功能。
6.4 用差异对比功能管理存储过程版本
PL/SQL Developer 自带一个Compare功能,可以对比两个存储过程的差异。操作路径:在对象浏览器里选中两个对象(按住 Ctrl 多选),右键 →Compare。
这个功能在排查“为什么测试库和开发库的存储过程行为不一致”时特别有用。对比结果会以颜色标注差异行,绿色表示新增,红色表示删除,黄色表示修改。
我一般会在每次发布前,把开发库和生产库的同名存储过程对比一遍,确认没有遗漏的修改。对比报告可以导出为 HTML 文件,作为发布记录存档。
6.5 一个我用了五年的习惯
每次打开 PL/SQL Developer,第一件事不是写代码,而是先开一个 Command Window,执行一条SELECT * FROM v$version;确认数据库版本,再执行SELECT USER FROM dual;确认当前用户。这两个信息看起来简单,但能避免很多“为什么这条语法报错”的问题——因为不同 Oracle 版本支持的语法不一样,不同用户的权限也不一样。
这个习惯帮我省了很多次“明明在测试库能跑,到生产库就报错”的尴尬。希望帮到你。
本文还有配套的精品资源,点击获取