Oracle存储过程返回结果添加前导零且不拉伸列宽问题咨询
Oracle存储过程返回数值前导零显示问题解决方案
方案1:调整SQL Developer客户端配置(推荐)
该方案无需修改原有业务代码,返回字段仍为数值类型,列宽和直接执行原生查询完全一致,符合展示要求:
- 操作路径:顶部菜单栏
工具→首选项→数据库→NLS - 在
数值格式输入框填入格式模板FM999990.99,保存后重新调用存储过程即可 - 临时生效可在调用存储过程前执行会话级配置:
ALTER SESSION SET NLS_NUMERIC_FORMAT = 'FM999990.99';
方案2:修改存储过程格式化逻辑(不依赖客户端配置)
如果需要保证所有客户端访问都有统一展示效果,可修改存储过程中hours字段的计算逻辑,固定格式化后字符串的最大长度:
CREATE OR REPLACE PROCEDURE avg_load IS rc SYS_REFCURSOR; BEGIN OPEN rc FOR SELECT master_id, EXTRACT(month FROM TRUNC(job_start, 'MM')) month_num, CAST(RTRIM(TO_CHAR( (SUM(CAST(job_stop AS DATE) - CAST(job_start AS DATE)) * 60 * 24) / ((LAST_DAY(TRUNC(job_start, 'MM')) - TRUNC(job_start, 'MM')) + 1) / 60, 'FM90.99' ), '.') AS VARCHAR2(6)) hours FROM T_SCHEDULE GROUP BY TRUNC(job_start, 'MM'), master_id ORDER BY master_id ASC, month_num; dbms_sql.return_result(rc); END; /
通过CAST(xxx AS VARCHAR2(6))限定格式化后字符串的最大长度为6,可避免列宽被自动拉长,同时保留前导零。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

