Oracle - 'ORA-01489 - Result of string concatenation is too long' 尝试通过 SQLPLUS 假脱机数据时出错

Oracle - 'ORA-01489 - Result of string concatenation is too long' Error When Trying to spool data via SQLPLUS

我已经使用下面的假脱机命令通过 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 模块轻松地迭代它们

正如@thatjeffsmith 所说:不要使用 SQL*Plus。而是使用 Python cx_Oracle interface. But if you insist on a CSV datafile, try SQL*Plus's native CSV feature, see Fast Generation of CSV and JSON from Oracle Database.

来自博客post:

$ 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“静默”选项可能会在某些平台上隐藏密码提示,使 SQL*Plus 看起来挂起。输入密码就万事大吉了

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