资讯详情

资讯详情

Oracle PL/SQL Developer 连接配置、调试与排错指南

简介PLSQL Developer 是一款面向 Oracle 数据库开发与管理的集成开发环境适合 DBA、后端开发人员以及正在学习 PL/SQL 的读者使用可帮助完成数据库连接、对象维护、SQL 查询、脚本编写与代码调试等日常工作。资源以 rar 压缩包形式提供大小约 19.05MB文件总数与具体类型明细暂未提供下载后可按实际目录结构查看。该资源已有 195 人学习或下载具备一定参考热度。其价值在于围绕 Oracle 开发场景覆盖较完整既能连接本地或远程数据库也支持表、视图、存储过程、函数、触发器、索引等对象编辑并提供语法高亮、代码提示、断点调试、数据导入导出、版本控制集成以及 Explain Plan 等性能分析能力。中文界面降低了上手门槛便于在数据库开发、运维与协作场景中按需查阅、参考和使用。1. PL/SQL Developer 是一把什么样的扳手先看清它替你省哪几步手上有 Oracle 库要改一个三百行的存储过程用黑框框敲 SQL*Plus 是什么体验没有语法高亮报错只给一个行号改一版重编译一遍全靠记忆。这大概是最劝退的入门路径。PL/SQL Developer 干的就是这件事把 Oracle 开发里最琐碎的几段——连库、找对象、改代码、断点调试、看执行计划——收进同一个窗口。它不是什么新技术而是一把用了很多年的老扳手顺手的地方特别顺手坑也踩得特别集中。适合天天跟存储过程、包体、触发器打交道的人只偶尔查一次数据、跑个报表的用不着它。下面按「怎么连上 → 怎么用顺 → 怎么调试 → 哪里会翻车」走一遍。2. 连接配置装完连不上库的九步排位PL/SQL Developer 本身是个壳真正干活的是 Oracle 的 OCI 客户端。所以「装完打不开」这件事九成不是软件坏了是壳和客户端没对上。这一章把连接链路拆开讲从位数、驱动、命名三处入手最后落到登录之后你该立刻确认的会话环境。2.1 位数对齐工具、客户端、驱动三件事先记住一条铁律PL/SQL Developer 的位数决定客户端位数客户端的位数决定 OCI.dll 的位数三者必须一致。64 位系统装 32 位的 PL/SQL Developer就得配 32 位的 instantclient反之配 64 位。混搭最典型的症状是启动就弹「Initialization error: could not initialize oci.dll」或者干脆静默失败连首选项窗口都进不去。我一般先确认两件事任务管理器里看进程有没有带「32 位」标记以及安装目录下有没有oci.dll。如果工具是 32 位就把 32 位的 instantclient basic 包解压到一个没有中文、没有空格的路径——D:\instantclient_19这种别放C:\Program Files下面空格和括号在解析 OCI 路径时是经典翻车点。环境变量是最省事的做法先临时设一遍验证路径对不对# Windows cmd 里临时生效用来快速判断是不是路径问题 set ORACLE_HOMED:\instantclient_19 set TNS_ADMIND:\instantclient_19\network\admin set NLS_LANGSIMPLIFIED CHINESE_CHINA.AL32UTF8 set PATH%ORACLE_HOME%;%PATH%ORACLE_HOME指向客户端根目录TNS_ADMIN指向放tnsnames.ora的那个network\admin目录这两个可以不同路径但TNS_ADMIN必须精确到 admin 层指到上一级就读不到命名文件。NLS_LANG控制客户端字符集写错就是满屏问号后面单独讲。临时验证通过后用下面这条写进用户变量别改系统变量——同一台机器上跑多个版本的客户端时系统变量会互相打架# 写入当前用户环境变量只对本人生效避免影响其他工具 [Environment]::SetEnvironmentVariable(TNS_ADMIN,D:\instantclient_19\network\admin,User) [Environment]::SetEnvironmentVariable(NLS_LANG,SIMPLIFIED CHINESE_CHINA.AL32UTF8,User)如果不想动环境变量PL/SQL Developer 首选项里「Oracle 连接」页有个 OCI library 输入框直接把D:\instantclient_19\oci.dll全路径填进去也能工作。这个方式的好处是不污染环境坏处是换机器要重填一次所以我一般只在临时排查时用。还有一种情况机器上已经装了完整的 Oracle 服务端或其它客户端PATH 里存在多个oci.dll。这时工具会按 PATH 顺序取第一个取到哪个全看天意。判断方法是登录窗口的「About」或者首选项里看它实际加载的版本号再把 PATH 里无关的客户端目录挪到后面。2.2 TNS 命名与 EZCONNECT什么时候用哪种连接串有两条路本地命名和直连。本地命名靠tnsnames.ora适合固定环境、需要别名管理的场景EZCONNECT 靠「主机:端口/服务名」直接拼适合临时连一下别人给的库。tnsnames.ora的写法有讲究最常见的错误是把SID和SERVICE_NAME搞混# D:\instantclient_19\network\admin\tnsnames.ora ORCL_PROD (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 10.0.0.12)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )HOST写 IP 比写主机名稳省得排查 DNSPORT默认 1521改过端口的容器环境要跟着改。SERVER DEDICATED表示专用服务器模式共享服务器模式下连上来会报一些奇怪的游标问题一般开发环境都写 DEDICATED。关键在最后一行SERVICE_NAME是数据库向监听注册的服务名常见值是orcl、ORCLPDB1SID是实例名老库才需要写SID ORCL。两者写反的典型症状是报ORA-12505: TNS:listener does not currently know of SID given in connect descriptor——注意是 12505 不是 12514这两个错长得像含义完全不同。确认服务名最直接的办法是登录服务器上执行# 在数据库服务器上执行看监听到底注册了哪些服务 lsnrctl status输出里Service orcl has 1 instance(s)这一行就是你要填的值。EZCONNECT 不用命名文件直接在 PL/SQL Developer 登录窗口的 Database 框里敲10.0.0.12:1521/orcl斜杠后面是服务名不是 SID。想指定 SID 就得写完整描述符比较啰嗦一般不折腾。EZCONNECT 的好处是拿别人的连接信息马上能试坏处是每次都要敲全而且密码里的特殊字符容易在拼接时出问题。还有一种「数据库」框填法直接填 TNS 别名比如ORCL_PROD。这时候工具去读tnsnames.ora读不到就报ORA-12154: TNS:could not resolve the connect identifier specified。12154 是本地解析失败12514 是解析成功了但监听不认这个服务12541 是压根连不上监听端口。三个错按这个顺序排先查文件再查服务名最后查网络和防火墙。2.3 登录之后第一件事确认会话字符集连上库不等于能用。字符集对不上中文全变问号而且这种问题在开发阶段不明显等生产导数据时才爆属于典型的后悔药没处买。登录后第一件事开个 SQL 窗口跑-- 服务端字符集决定数据实际怎么存 SELECT parameter, value FROM nls_database_parameters WHERE parameter IN (NLS_CHARACTERSET,NLS_NCHAR_CHARACTERSET); -- 当前会话字符集决定客户端怎么解释 SELECT parameter, value FROM nls_session_parameters WHERE parameter LIKE NLS%CHARACTERSET;第一段查出来的是库的底层字符集AL32UTF8是 UTF-8ZHS16GBK是 GBK这个值改不了建库时定死。第二段查出来的是你这条会话的字符集由客户端NLS_LANG决定。对齐原则很简单客户端NLS_LANG的字符集部分要和库一致。库是AL32UTF8客户端就写SIMPLIFIED CHINESE_CHINA.AL32UTF8库是ZHS16GBK就写SIMPLIFIED CHINESE_CHINA.ZHS16GBK。写错了Oracle 会在客户端和服务端之间做一次「以为你在转码」的转换结果就是乱码或者问号。还有一种隐蔽情况NLS_LANG没设Windows 中文系统默认走ZHS16GBK连 UTF-8 库时中文能显示但长度算错一个汉字占三字节被当成两字节处理VARCHAR2(10)存三个汉字就报超长。这种问题光看数据看不出来得看LENGTHB和LENGTH的差值。3. 编辑器与对象浏览器把重复动作压到两次按键工具的价值不在功能多在于你一天要重复两百次的动作能不能少按几下。这一章讲三块怎么把常用 SQL 片段变成两个字母的缩写、怎么在几百个对象里三秒定位到目标、以及四种窗口各自该在什么场景下用。3.1 自动替换与模板把肌肉记忆外置PL/SQL Developer 的自动替换读的是安装目录下的AutoReplace.txt格式就是键值对输完左边再敲一个触发键默认空格或回车右边整段文本就出来了# AutoReplace.txt 片段等号左边是缩写右边是展开内容 sfSELECT * FROM wheWHERE obORDER BY selctSELECT COUNT(*) FROM dgDELETE FROM %WHERE% updUPDATE % SET WHERE规则上有几个细节值得记缩写本身不能含空格展开内容里可以有换行用\n表示%这种符号原样输出所以模板里留占位符完全没问题。我习惯把sf、whe这种两字母留给最高频的三字母留给带条件的模板避免误触发——比如你本来想敲order结果or被展开成ORDER BY那一下很烦。触发键在首选项的「编辑器 → 自动替换」里改可以设成空格也可以设成回车。设空格的好处是打字流不断坏处是变量名里含缩写会误伤我一般设空格但对缩写做前缀区分比如所有模板都加个x开头。除了自动替换还有「代码模板」功能用于插入整段带结构的代码比如一个完整的包体骨架、异常处理块、游标循环。模板可以带变量占位插入后光标依次跳转比手敲快得多。这块配置在首选项的「编辑器 → 模板」里可以按文件类型分别定义。提示AutoReplace.txt改完不需要重启工具但要重新进一次首选项页面才会重新加载。改之前先备份这个文件被误清空过的人不在少数。3.2 对象浏览器与依赖定位别在树里一层层点对象浏览器是左侧那棵树能按 owner 过滤、按类型分组、按名称模糊匹配。三个用得最多的动作在过滤框里敲对象名片段直接定位右键「View」看源码右键「Describe」看表结构。但树状浏览有个天花板——查依赖关系时点不动。比如你改了一个包想确认还有谁在调它树里是看不到的得直接查数据字典-- 查某个包依赖了哪些对象 SELECT referenced_owner, referenced_name, referenced_type FROM dba_dependencies WHERE owner APP AND name PKG_ORDER_SYNC ORDER BY referenced_type, referenced_name; -- 反过来查谁依赖了这个包 SELECT owner, name, type FROM dba_dependencies WHERE referenced_owner APP AND referenced_name PKG_ORDER_SYNC AND referenced_type PACKAGE;第一条查「我依赖谁」第二条查「谁依赖我」。改公共包之前跑第二条能提前知道影响面。dba_dependencies需要相应权限权限不够就换all_dependencies只查当前用户能看到的对象。对象名大小写在数据字典里统一是大写所以WHERE name pkg_order_sync查不到任何东西这个坑每年都要埋一批人。另外工具本身有个「Find Database Object」的全局搜索快捷键一般是 CtrlShiftF 一类的组合具体看你的键位设置支持按名字和按源码内容搜。按源码内容搜特别有用——接手一个老库想找哪段代码里硬编码了某个表名比逐个打开快十倍。3.3 四种窗口的分工别拿 SQL 窗口当万能钥匙很多人全程只用 SQL 窗口其实四个窗口各管一摊用对了能省掉大量手工拼参数的时间。窗口类型适用场景关键特性SQL 窗口写查询、改数据、执行匿名块结果集可编辑支持多语句顺序执行命令窗口跑脚本、执行 SQL*Plus 命令支持、spool、desc、set等命令测试窗口调存储过程、函数、包自动生成参数绑定界面可单步进入计划窗口看执行计划图形化展示可对比不同计划的代价SQL 窗口的「可编辑结果集」是把双刃剑。查出来的结果直接改单元格就能UPDATE快是真快风险也是真大——忘了加WHERE条件或者ROWID模式没开一次误改一片。我一般把生产环境的会话设成只读模式会话颜色标记后面讲从入口上堵住。命令窗口的价值在于它是「脚本执行器」。日常部署时那堆deploy.sql、rollback.sql还有导出日志用的spool都该在这个窗口跑而不是开 SQL 窗口一句句粘。它接受的是 SQL*Plus 语法所以网上找来的运维脚本基本能直接复用。测试窗口是调过程的主力。打开一个存储过程它会自动把 IN/OUT 参数列成表格填好点执行输出参数和DBMS_OUTPUT的内容都在下面显示。要单步调试就得配合下一章的断点。4. 调试与执行计划断点、AUTOTRACE 与锁等待写完能跑和跑得快是两件事。这一章先解决「代码为什么走进了不该走的分支」再解决「这条 SQL 为什么慢」最后解决「谁把表锁住了」。三个问题对应的工具分别是调试器、执行计划和会话视图。4.1 断点调试的前置授权没有这三条权限调不动PL/SQL Developer 的调试器底层调的是DBMS_DEBUG走的是调试连接需要显式授权。新手最常见的现象是断点打上了点调试工具停在「正在等待调试目标」然后一直等最后超时。授权语句-- 调试会话权限必须 GRANT DEBUG CONNECT SESSION TO app_dev; -- 跨 schema 调试时需要谨慎授予 GRANT DEBUG ANY PROCEDURE TO app_dev; -- 12c 及以上版本JDWP 调试需要额外授权 GRANT EXECUTE ON SYS.DBMS_DEBUG_JDWP TO app_dev;三条权限的作用范围不一样。第一条是基础允许你建立调试会话第二条允许你调试不属于自己的过程生产环境一般不给给也只给到具体 schema第三条是 12c 之后新增的走 JDWP 协议时没有它连不上。老版本可能没有DBMS_DEBUG_JDWP这个包报ORA-00942就是版本不对忽略即可。授权之后还要确认两件事一是登录用户对目标过程有EXECUTE权限二是过程的编译选项里没有把调试信息去掉。后者在编译时加PLSQL_OPTIMIZE_LEVEL和PLSQL_DEBUG参数控制如果过程是以PLSQL_DEBUG FALSE编译的断点会显示成灰色不可用。重新编译一次带调试信息的版本-- 重新编译并保留调试信息只影响当前会话的编译行为 ALTER SESSION SET PLSQL_DEBUG TRUE; ALTER PROCEDURE app.pkg_order_sync.sync_one COMPILE;PLSQL_DEBUG TRUE会让编译出来的代码带符号信息体积略大、执行稍慢所以只在调试期开调完把参数改回FALSE再编译一次别把这个状态带进生产。调试的具体操作路径在对象浏览器里双击过程打开源码在行号左侧灰条上点一下设断点变红点然后工具栏点「Test」进入测试窗口填参数点「Start Debugger」。这时会弹出一个调试会话可以单步F7 进入、F8 跳过、看调用栈、看变量值。想临时改变量值验证分支直接在变量窗口里改比改代码重编译快。提示调试期间被调用的过程是阻塞的如果你在调试一个被定时任务频繁调用的包先把任务停掉否则会出现多个会话抢同一个调试目标表现是断点乱跳或者干脆不触发。4.2 执行计划COST 之外还有三个观察点执行计划窗口Explain Plan快捷键一般是 F5是把 SQL 交给优化器估算出来的计划注意是估算不是真实执行。想拿真实计划得让 SQL 实际跑一遍再从游标缓存里取。先说估算计划怎么看。很多人只盯 COST其实 COST 是个相对值跨语句比较没意义同一语句不同版本之间才有参考价值。真正该看的是三个地方第一是行数估算偏差。计划里每一步都有Rows列这是优化器猜的返回行数。如果你知道某张表过滤后只有几十行计划里却写着几万行说明统计信息过期或者谓词没走索引。这种偏差是所有「计划看起来没问题但实际很慢」的根源。第二是访问路径。TABLE ACCESS FULL不一定是坏事小表全扫比走索引快但大表在过滤条件区分度高的情况下还全扫基本就是索引缺失或者索引失效。第三是连接方式。NESTED LOOPS适合驱动表小、被驱动表有索引的场景HASH JOIN适合两边都大MERGE JOIN少见但排序代价高。看计划的时候先看驱动表选对没有再看连接方式匹配不匹配数据量。真实执行计划这么取-- 先给 SQL 加个注释标签方便后面按标签捞游标 SELECT /* tag_order_sync */ COUNT(*) FROM orders o WHERE o.created_at DATE 2024-01-01; -- 按标签从游标缓存里取真实计划和实际行数 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR( sql_id NULL, cursor_child_no NULL, format ALLSTATS LAST ));ALLSTATS LAST这个 format 是关键它会把每一步的A-Rows实际返回行数和E-Rows估算行数并排打出来一眼就能看出哪一步估歪了。如果没有A-Rows那一列说明游标已经被挤出缓存或者当前用户没有V$SQL的访问权限。AUTOTRACE 是另一条路但它依赖PLUSTRACE角色且会产生额外开销-- 首次使用需要建 PLUSTRACE 角色和视图一般由 DBA 执行一次 ?/sqlplus/admin/plustrce.sql GRANT PLUSTRACE TO app_dev; -- 会话级开启 SET AUTOTRACE ON EXPLAIN STATISTICSON EXPLAIN只出计划ON STATISTICS出逻辑读、物理读等统计。开发环境用来快速比对两条 SQL 谁更省生产环境慎开统计信息本身的采集有成本。4.3 锁等待先找源头再动手「表被锁了」是开发最常遇到的求助但多数人第一反应是查V$LOCK然后KILL SESSION这属于治标。先定位阻塞源头再判断是不是真的该杀。-- 找出所有被阻塞的会话以及阻塞它的源头 SELECT s.sid, s.serial#, s.username, s.status, s.event, s.seconds_in_wait, s.blocking_session, s.blocking_session_status, s.sql_id FROM v$session s WHERE s.blocking_session IS NOT NULL ORDER BY s.seconds_in_wait DESC;blocking_session不为空的就是被挡住的会话seconds_in_wait是已经等了多久sql_id是它正在执行的语句。顺着blocking_session往上找最终会找到几个blocking_session为空的——那就是源头。拿到源头 SID 之后看它在干什么-- 看源头会话当前执行的 SQL 和等待事件 SELECT sid, serial#, username, status, event, sql_id, machine, program FROM v$session WHERE sid blocking_sid; -- 看它最近执行过的 SQL 全文 SELECT sql_id, sql_text FROM v$sql WHERE sql_id sql_id;判断逻辑如果源头在SQL*Net message from client等待说明它开着事务没提交人在那发呆如果它在db file sequential read大量读说明是个大查询在跑如果在enq: TX - row lock contention说明它自己也在等别人。杀会话之前先想一件事这个事务做了多少工作回滚要多久。一个跑了四十分钟的批量更新被强制杀掉回滚可能比原任务还长期间锁还在。真要杀用ALTER SYSTEM KILL SESSION sid,serial# IMMEDIATE并且做好回滚耗时的心理准备。5. 避坑排查五个把新手劝退的现场下面五条基本覆盖了 PL/SQL Developer 日常九成的问题。按「现象 → 原因 → 解决」写遇到对得上的照着做就行。5.1 中文全变问号或乱码现象查出来的中文字段显示成???或者一堆鍙峰晢这样的字符插进去的中文取出来也不对。原因客户端NLS_LANG的字符集部分和库不一致。问号通常意味着字符在转换过程中丢失了比如把 UTF-8 当 GBK 解释后无法映射乱码通常是一次错误的双向转换。解决先按 2.3 的两条 SQL 确认库字符集再把NLS_LANG设成一致的值。设完必须重开 PL/SQL Developer环境变量在进程启动时读取改完不重启不生效。如果设完还是乱码检查是不是系统里还有另一个NLS_LANG在覆盖用set NLS_LANG在 cmd 里看实际值。5.2 ORA-12154 与 ORA-12514 分不清现象登录报错有时 12154有时 12514有时 12505。原因三个错分属不同层。12154 是本地找不到命名条目问题在tnsnames.ora或TNS_ADMIN12514 是监听不知道这个服务名问题在SERVICE_NAME写错或服务没注册12505 是监听不知道这个 SIDSID和SERVICE_NAME写反了。解决12154 先echo %TNS_ADMIN%确认路径再看文件名是不是tnsnames.oraWindows 下容易被存成tnsnames.ora.txt后缀隐藏。12514 和 12505 去服务器上lsnrctl status看实际注册的服务名和实例名照着填。还有一种 12514 是数据库还没启动完等两分钟再试。5.3 调试卡在「正在等待调试目标」现象断点打上启动调试界面一直转圈或者提示等待最后超时。原因按出现频率排——调试权限没授4.1 那三条、过程编译时没带调试信息、被调试的对象正在被别的会话执行导致抢锁、防火墙挡了调试端口。解决按顺序排除。先跑SELECT * FROM session_privs WHERE privilege LIKE %DEBUG%看权限有没有再查SELECT name, type, plsql_debug FROM user_plsql_object_settings WHERE name PKG_ORDER_SYNC看调试标志位然后确认没有别的调试会话在跑最后检查客户端到数据库的端口是否只放了 1521调试走的是另外的通道有些环境只放行监听端口。5.4 导出表结构与数据不一致现象用工具导出建表语句导出来的 DDL 少了索引、注释、默认值或者CLOB字段导出来是空的。原因导出工具的几个勾选项没开全。「Include storage」不勾会丢表空间和存储参数「Include constraints/indexes」不勾会丢索引和约束CLOB、BLOB在大数据量导出时需要单独设Fetch size默认值太小会截断。解决导出前把选项页翻一遍至少勾上 constraints、indexes、comments、default values 四项。DDL 导出用于建文档的勾「Include storage」反而会让脚本带上原环境的表空间名跨环境执行时报错所以这一项要按用途决定——给 DBA 做迁移就勾做文档就不勾。5.5 高分辨率屏幕下界面模糊现象4K 屏上字发虚图标糊成一片。原因程序没有声明 DPI 感知Windows 按位图拉伸越拉越糊。解决右键快捷方式 → 属性 → 兼容性 → 更改高 DPI 设置 → 勾选「替代高 DPI 缩放行为」缩放执行选「应用程序」。这样交给程序自己缩放字会清晰一些但图标可能偏小。新版工具一般自带 DPI 感知老版本只能靠这个兼容性开关。另一个办法是把系统缩放从 200% 调到 150%牺牲一点空间换清晰度我用后者多一些因为前者的界面元素间距会乱。注意兼容性设置是按快捷方式记的从开始菜单启动和从桌面快捷方式启动可能是两套设置改完从同一个入口验证。6. 把工具变成工作台三个值得固化的习惯做到能连、能改、能调工具就算用起来了。但真正拉开效率差距的是几个「一次性配置、长期受益」的动作我挑三个最值的说。第一个是会话颜色标记。首选项里可以给不同的连接配不同颜色的边框我给生产库配红色、预发配黄色、本地配绿色。这个功能看着不起眼但它把「我现在连的是哪个库」这件事从脑子里的一行字变成了满屏的视觉信号。血泪经验是有一次排查问题顺手连了生产以为连的是测试一条没有WHERE的UPDATE敲下去回车前瞥见红边框手抖着按了取消。从那以后我换机器第一件事就是配颜色不配不敢开工具。第二个是用项目Project功能管理脚本文件。日常部署用的ddl/、dml/、rollback/三个目录可以在工具里建成一个项目一次加载左侧树直接切换文件不用开资源管理器到处翻。项目文件是个很小的配置可以随代码仓库一起提交换机器打开就有。第三个是导出 DDL 生成字段文档。选一批表右键「Compare」或者用「Export User Objects」导出建表语句再配上注释就是一份能直接给下游的字段说明。这一步不花时间但每次交接、每次对外接口评审都会用到。我一般把导出脚本固定成一个.sql改完表结构就跑一遍产出的文档直接进仓库。最后补一个边界这类客户端工具替代不了 SQL*Plus 和 RMAN做备份恢复、做批量运维脚本、在没有图形界面的服务器上还是得回到命令行。工具顺手的地方在于「看」和「改」不适合「跑通宵批处理」。分清这个边界就不会在半夜三点发现计划任务里的脚本依赖一个只有图形界面才有的功能。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →