ORA-17008连接已关闭:SQL Developer执行PL/SQL报错但SQL Plus正常
ORA-17008 Closed Connection 错误排查(SQL Developer vs SQL Plus)
我之前也碰到过一模一样的情况——SQL Plus跑啥都正常,换到SQL Developer里不管写啥PL/SQL都报ORA-17008,折腾了好一阵才解决。结合你的描述,问题肯定不在你的PL/SQL代码本身(你贴的这段代码逻辑完全没问题,我帮你格式化放在下面了),大概率是SQL Developer的配置或客户端环境的问题,给你梳理几个最可能的排查方向:
1. 检查SQL Developer的连接配置细节
- 驱动类型不匹配:SQL Developer默认用Thin驱动,有时候和某些Oracle服务器版本搭配会出现连接稳定性问题。你可以试试切换到OCI Thick Driver:打开连接属性的「高级」选项卡,勾选「使用OCI Thick Driver」,前提是本地安装了对应版本的Oracle客户端,并且在SQL Developer里指定了客户端的路径。
- 连接参数错误:虽然SQL Plus能连,但还是要确认下SQL Developer里的连接参数——比如SID和服务名有没有搞混?有些服务器只支持服务名连接,如果你填了SID就会出问题;或者「主机名」「端口」有没有填错?
- 自动提交设置:试试打开SQL Developer的自动提交(工具栏上的提交按钮旁边的下拉菜单,勾选「自动提交」),有时候未提交的事务会导致连接异常。
2. 版本兼容性问题
如果你的SQL Developer版本和Oracle服务器版本差距太大,很容易出现兼容性bug:
- 比如用SQL Developer 23.x连接Oracle 11g服务器,或者用老旧的SQL Developer 18.x连接Oracle 21c,都可能触发这类连接问题。建议你下载和服务器版本匹配的SQL Developer版本(比如服务器是19c,就用SQL Developer 19.x或21.x版本)。
3. 本地客户端环境冲突
如果你的电脑上装了多个Oracle客户端(比如同时有Instant Client和完整客户端),环境变量(ORACLE_HOME、PATH)的优先级可能会导致SQL Developer调用了有问题的客户端:
- 试试把SQL Developer自带的Instant Client路径(一般在
sqldeveloper\jdk\jre\bin或者sqldeveloper\instantclient目录)放到系统PATH环境变量的最前面,或者卸载掉多余的Oracle客户端,只保留一个和服务器匹配的版本。
4. 重置SQL Developer的配置缓存
有时候SQL Developer的配置文件或缓存损坏会导致各种奇怪的连接问题:
- 关闭SQL Developer,找到用户目录下的
.sqldeveloper文件夹(Windows一般在C:\Users\你的用户名\.sqldeveloper,Mac在~/Library/Application Support/SQLDeveloper),把它重命名为.sqldeveloper_old,然后重新打开SQL Developer,重新创建连接试试。
顺便说下,你贴的PL/SQL代码本身是完全合法的,格式化后如下:
<<outer>> DECLARE xy varchar2(20); begin <<inner>> declare ww varchar2(20):='welcome'; begin select ename into xy from emp where empno=7369; dbms_output.put_line(ww); dbms_output.put_line(xy); end; end;
在正常连接环境下,这段代码会输出welcome和员工7369的姓名。
内容的提问来源于stack exchange,提问作者Mido Saeed




