执行rdsadmin.rds_file_util.read_text_file时遇ORA-00910错误的原因是什么?
解决Oracle 19c调用
rdsadmin.rds_file_util.read_text_file时的ORA-00910错误 问题场景
在Oracle Database 19c环境中,调用rdsadmin.rds_file_util.read_text_file读取文件时触发错误:
ORA-00910: specified length too long for its datatype
当前环境参数max_string_size取值为"STANDARD",涉及的数据类型为VARCHAR2。
错误原因
当max_string_size设置为STANDARD时,Oracle中VARCHAR2类型的最大长度限制为4000字节。而rdsadmin.rds_file_util.read_text_file函数在该模式下返回的文本字段为VARCHAR2类型,若待读取的文件内容总长度超过4000字节,就会触发这个长度超限的错误。
解决办法
方法1:修改max_string_size为EXTENDED
该模式下VARCHAR2最大长度可扩展至32767字节,足以容纳更大的文件内容。操作步骤如下:
- 关闭所有非系统会话
- 执行参数修改命令:
ALTER SYSTEM SET max_string_size=EXTENDED; - 运行Oracle提供的扩展脚本:
@?/rdbms/admin/utl32k.sql - 重启数据库使参数生效
方法2:分块读取大文件(不修改参数)
若无法调整max_string_size参数,可通过UTL_FILE包自行实现分块读取逻辑,每次读取不超过4000字节的内容,避免长度超限。示例代码:
DECLARE v_file UTL_FILE.FILE_TYPE; v_buffer VARCHAR2(4000); BEGIN v_file := UTL_FILE.FOPEN('YOUR_DIRECTORY', 'TARGET_FILE.TXT', 'R'); LOOP UTL_FILE.GET_LINE(v_file, v_buffer, 4000); -- 按需处理读取到的内容,例如输出或写入表 DBMS_OUTPUT.PUT_LINE(v_buffer); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_file); WHEN OTHERS THEN UTL_FILE.FCLOSE(v_file); RAISE; END; /
内容的提问来源于stack exchange,提问作者Brian Fitzgerald
相关产品推荐
相关产品推荐

