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 版本可能需要也可能不需要连接字符串的引号。
我已经使用下面的假脱机命令通过 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 版本可能需要也可能不需要连接字符串的引号。