ORA-01847错误排查及TO_CHAR函数中SSSS.FF格式含义咨询
问题1:代码存在的问题
- 类型不匹配错误:
EXECUTION_TIME被定义为TIMESTAMP类型,但第14行将TO_CHAR()返回的字符串直接赋值给它,类型不兼容,Oracle无法完成合法的隐式转换,触发错误。 - INTERVAL类型误用格式模型:
TIME_END - TIME_START得到的是INTERVAL DAY TO SECOND类型,而TO_CHAR()中的SSSS是仅适用于DATE类型的格式(表示当日0点到当前时间的累计秒数),不能用于INTERVAL类型,这是触发ORA-01847(日部分无效)错误的直接原因。 - 其他逻辑/语法问题:
- 第9行将
SYSDATE(DATE类型)赋值给PROCEDURE_NAME(VARCHAR2类型),虽然Oracle会做隐式转换,但逻辑上完全没必要,还覆盖了初始设置的存储过程名称。 - 第20行试图将
TIMESTAMP类型的EXECUTION_TIME与字符串' HRS'拼接,同样存在类型不匹配,后续执行也会报错。
- 第9行将
问题2:'SSSS.FF'的定义
SSSS:Oracle针对DATE类型的格式模型,代表从午夜0点开始累计的秒数,取值范围为0到86399(一天总秒数为86400)。FF:针对TIMESTAMP或INTERVAL类型的格式模型,代表小数秒,可指定保留位数(比如FF3表示保留3位小数秒,默认最多支持9位)。- 注意:这两个格式不能组合用于
INTERVAL类型,这也是代码报错的核心原因之一。
内容的提问来源于stack exchange,提问作者Sadman ZIhan
相关产品推荐
相关产品推荐

