【问题标题】:Oracle - 'ORA-01489 - Result of string concatenation is too long' Error When Trying to spool data via SQLPLUSOracle - 'ORA-01489 - 字符串连接的结果太长' 尝试通过 SQLPLUS 假脱机数据时出错
【发布时间】:2020-10-24 01:04:23
【问题描述】:

我使用下面的 spool 命令通过 CMD 使用 sqlplus 获取数据

set pagesize 0
set term off
set feed off
set colsep ,


spool 'C:\Provident_Workspace\output.csv'

SELECT EO.SLELABEL||','||dbms_lob.substr(EL.LOGTEXT,4000,1)||',' ||utl_raw.cast_to_varchar2(dbms_lob.substr(SR.SODATA,4000,1))
FROM SORECORD SR, SOAPPKEY SK, EPTORDER EO, EPTLOG EL 
WHERE SK.APPKEYNAME = 'MSISDN' 
AND SK.appkeyvalue = '07996703863' 
AND SK.SOID = SR.SOID 
AND SR.SOTYPE = 'NAC' 
AND trunc(SR.Receipttimestamp) = date '2020-01-07' AND SR.SOID = EO.SOID 
AND EO.EPTNUMBER = EL.EPTNUMBER AND EL.SOID LIKE TO_CHAR((Select SUBSTR(TO_CHAR(SR.SOID), 1, LENGTH(SR.SOID)-1) FROM SORECORD SR, SOAPPKEY SK WHERE SK.APPKEYNAME = 'MSISDN' AND SK.appkeyvalue = '07996703863' AND SK.SOID = SR.SOID AND SR.SOTYPE = 'NAC' AND trunc(SR.Receipttimestamp) = date '2020-01-07')) || '%' AND EL.SOID > TO_NUMBER((Select SUBSTR(TO_CHAR(SR.SOID),1, LENGTH(SR.SOID)-1) FROM SORECORD SR, SOAPPKEY SK WHERE SK.APPKEYNAME = 'MSISDN' AND SK.appkeyvalue = '07996703863' AND SK.SOID = SR.SOID AND SR.SOTYPE = 'NAC' AND trunc(SR.Receipttimestamp) = date '2020-01-07') || '0');

spool off

通过 cmd 在 SQLPLUS 上运行此命令时,出现 ORA-01489 错误。现在我知道为什么会这样了,EL.LOGTEXT 是 CLOB 数据类型,SR.SODATA 是 BLOB 数据类型。两者都包含大量的多行数据,并且它们的连接可能会超过 4000 字节。

有什么方法可以让这个查询工作而不会丢失任何数据?

我需要 CSV 文件中的表格格式的这 3 列,以便我可以使用 Python 的内置 csv 模块轻松迭代它们。

【问题讨论】:

  • 为什么不让您的 python 应用程序连接到数据库并直接处理数据?
  • @thatjeffsmith 对我正在工作的 VM 有一些限制,因此 SQL*PLUS 是提供给我们的唯一选项。无论如何,克里斯托弗的回答对我有用。谢谢大家!

标签: python oracle csv oracle-sqldeveloper sqlplus


【解决方案1】:

正如@thatjeffsmith 所说:不要使用 SQL*Plus。而是使用 Python cx_Oracle 接口。但如果您坚持使用 CSV 数据文件,请尝试 SQL*Plus 的原生 CSV 功能,请参阅Fast Generation of CSV and JSON from Oracle Database

来自博文:

$ sqlplus -s -m 'csv on' cj@'"localhost/pdb1"' @t.sql
  "DEPARTMENT_ID","DEPARTMENT_NAME"
  10,"Administration"
  20,"Marketing"
  30,"Purchasing"
  40,"Human Resources"
  50,"Shipping"
  60,"IT"
  70,"Public Relations"
  80,"Sales"
  90,"Executive"
  100,"Finance"

-s“silent”选项可能会在某些平台上隐藏密码提示,使 SQL*Plus 看起来挂起。输入密码,一切都会好的。

您的操作系统或您的 SQL*Plus 版本可能需要也可能不需要连接字符串的引号。

【讨论】:

  • 感谢这个 CSV 标记为我完成了这项工作!
猜你喜欢
  • 2017-02-06
  • 2015-06-28
  • 2011-08-13
  • 2016-05-28
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2012-05-12
相关资源
最近更新 更多