【问题标题】:SQL Developer 'run script' failing but 'run statement' worksSQL Developer“运行脚本”失败但“运行语句”有效
【发布时间】:2014-06-19 01:37:08
【问题描述】:

我对两个链接的表有一个简单的左连接查询以获取描述:

SELECT WORK.ACTION_ID, WORK.ACTION_STAT, WORK.DESCRIPTION_ID,
  WORK.CLIENT_SERVER_IND, WORK.UPDATE_TSTAMP, WORK.UPDATE_USER_ID,
  WORK.OTHER_ACTION_DATA, D.DESCRIPTION_ID, D.LANGUAGE, D.DESCRIPTION_TEXT,
  D.UPDATE_TSTAMP DSCRP_UPD_TSTAMP
FROM xxxx.R_ACTION WORK
INNER JOIN xxxx.R_DESC_TEXT D ON WORK.DESCRIPTION_ID = D.DESCRIPTION_ID
WHERE D.LANGUAGE = 'ENGLISH'
AND D.DESCRIPTION_STAT = 'P';

我在 SQL Developer 中有查询,如果我选择“运行语句”,它会在不到一秒的时间内正常工作,我可以检索所有 283 条记录。

如果我选择“运行脚本”,我可以看到大约 33 行的输出,然后它就会挂起,最终我会收到“套接字读取超时”消息。

我在不同的架构中有同一个表,但其中的数据略有不同,在那个表中,运行语句和运行脚本工作正常。

为什么它适用于“运行语句”但在此架构中对“运行脚本”失败?

【问题讨论】:

  • 您说这是一个“左 [外部] 联接”查询,但您显示的是内部联接。不确定这是否重要,但可能有助于澄清这一点。由于该语句有效,因此它看起来像是 SQL Developer 问题,或者可能是网络问题,但您也可以查看警报日志。您使用的是什么版本的 SQL Developer? “查询输出”窗格中一次显示多少个结果 - 少于 33 个?您能否添加表定义 - 想知道是否有任何列是 CLOB。套接字错误让我认为由于数据中的某些内容,网络正在关闭您的链接。
  • 此外,“运行脚本”似乎暗示了一系列语句,可能带有 BEGIN/END,而不仅仅是一个选择。
  • 我认为亚历克斯正在做某事,如果不是 clob,那么您要提取的数据中可能会有一些二进制字符。当您作为脚本运行时,输出被转储到脚本输出窗口(基本上是一个文本文件),而运行语句填充一个表(查询结果选项卡)。
  • 哪个 Oracle DB 版本 (11.2.0.3)?哪个 SQL Developer 版本 (4.0.80)?在 SQL*Plus 中查询是否完成且没有错误?
  • 涉及的数据类型有哪些?那里有任何“宽”列吗? Alex 关于 CLOB 的问题也是我要去的地方。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

我也加入了CLOB 的潮流。认为您的 DESCRIPTION_TEXT 有 90% 的可能性是 CLOB 字段。

作为测试,尝试将此查询作为“运行脚本”,它会忽略实际的 DESCRIPTION_TEXT 并输出“bogus”:

SELECT WORK.ACTION_ID, WORK.ACTION_STAT, WORK.DESCRIPTION_ID,
  WORK.CLIENT_SERVER_IND, WORK.UPDATE_TSTAMP, WORK.UPDATE_USER_ID,
  WORK.OTHER_ACTION_DATA, D.DESCRIPTION_ID, D.LANGUAGE, 'bogus' DESCRIPTION_TEXT,
  D.UPDATE_TSTAMP DSCRP_UPD_TSTAMP
FROM xxxx.R_ACTION WORK
INNER JOIN xxxx.R_DESC_TEXT D ON WORK.DESCRIPTION_ID = D.DESCRIPTION_ID
WHERE D.LANGUAGE = 'ENGLISH'
AND D.DESCRIPTION_STAT = 'P';

如果可行,请尝试使用此查询,该查询利用DBMS_LOB.SUBSTR() 通过将输出截断为前 4000 个字符来帮助将 CLOB 转换为 VARCHAR。

SELECT WORK.ACTION_ID, WORK.ACTION_STAT, WORK.DESCRIPTION_ID,
  WORK.CLIENT_SERVER_IND, WORK.UPDATE_TSTAMP, WORK.UPDATE_USER_ID,
  WORK.OTHER_ACTION_DATA, D.DESCRIPTION_ID, D.LANGUAGE,
  dbms_lob.substr(D.DESCRIPTION_TEXT, 4000) DESCRIPTION_TEXT,
  D.UPDATE_TSTAMP DSCRP_UPD_TSTAMP
FROM xxxx.R_ACTION WORK
INNER JOIN xxxx.R_DESC_TEXT D ON WORK.DESCRIPTION_ID = D.DESCRIPTION_ID
WHERE D.LANGUAGE = 'ENGLISH'
AND D.DESCRIPTION_STAT = 'P';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2012-10-19
    • 2017-12-07
    相关资源
    最近更新 更多