You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_HOMEPATH)的优先级可能会导致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

火山引擎 最新活动