如何在PL / SQL

时间:2015-07-29 17:32:30

标签: sql oracle plsql number-formatting

民间,

我有一个现有的存储过程,我试图更新,即使它是一个整数或一个十进制数,也总是显示两位小数。

此存储过程构建一条消息,必须将v_credit_amt显示为两位十进制数,但分配给v_credit_amt的值可以是整数或单个小数或两位小数值 即175应显示为175.00,250.5应显示为250.50,395.95应显示为395.95。

这是相关的股票pl / sql

v_credit_amt        number(22,2);
select NVL(sit_credit_limit,0)
  into v_credit_amt
  from sites
 where sit_pkey = p_site_id;

我认为在select期间通过to_char进行格式化会解决这个问题,ala

select NVL(to_char(sit_credit_limit, 'fm99999.00'),0)
  into v_credit_amt
  from sites
 where sit_pkey = p_site_id;

--v_credit_amt := to_char(v_credit_amt, 'fm99999.00');
insert into SQL_TXT values (v_credit_amt);
commit;

从上面注释掉的行中可以看出,一旦定义了v_credit_amt变量,我也尝试了它

我也尝试过使用to_number函数

select NVL(to_number(sit_credit_limit, '99999.00'),0)
  into v_credit_amt
  from sites
 where sit_pkey = p_site_id;

但是,如果存储在sit_credit_limit列中的值是一个没有小数的整数,或者像250.5 v_credit_amt这样的数字在查询SQL_TXT表时显示的相同,我正在插入以进行调试。

SQL> select * from SQL_TXT;

COL1
--------------------------------------------------------------------------------
175
250.5

此特定事件简单地将多个消息部分连接成一个返回的长消息字符串,即

if p_message_id = '14' then
   v_message := 'Comtrol Check In Message Posted';
   v_string  := v_string || '008' || lpad(length(v_fname || ' ' || v_lname), 3, '0') || v_fname || ' ' || v_lname;
   v_string  := v_string || '059' || lpad(1, 3, '0') || '0';
   --v_string  := v_string || '089' || lpad(1, 3, v_credit_amt) || to_char(v_credit_amt);
   v_string  := v_string || '089' || lpad(length(to_char(v_credit_amt, 'fm9999999.00')), 3, '0') || to_char(v_credit_amt, 'fm9999999.00');
   v_string  := v_string || '106' || lpad(length(nvl(v_acct_number,'')), 3, '0') || v_acct_number;
   --v_string  := v_string || '106' || v_acct_number;
   v_string  := v_string || '164' || lpad(1, 3, '0') || '0';
   v_string  := v_string || '174' || lpad(length(v_rm_phone_num), 3, '0') || v_rm_phone_num;
   v_string  := v_string || '175' || lpad(length(v_rm_id), 3, '0') || v_rm_id;
   v_string  := v_string || '183' || lpad(1, 3, '0') || '0';
endif;

但是,在所有用例中,我无法获得最终字符串以正确地包含两位小数。

例如,如果db中的值为125,我会得到最终字符串

144450034629999008009Bob Smith05900100{89006125}1060073307542164001017400340917500 34091830010

然而它应该是

144450034629999008009Bob Smith05900100{89007125.00}1060073307542164001017400340917500 34091830010

很抱歉上面的格式,我看不到如何在没有代码块的情况下加粗部分,所以我突出显示了相对部分{}

如果我需要总是将数字显示为两位小数,即使给出了整数或1位小数,我还缺少什么?

1 个答案:

答案 0 :(得分:5)

实际上,您必须使用格式插入数据。 (假设目标列为VARCHAR)您获取并放入NUMBER变量的格式为NUMBER

数字没有格式可以保存。仅用于显示,格式化就会出现。

insert into SQL_TXT values (TO_CHAR(v_credit_amt,'FM99999.00'));
commit;

如果 INSERT-ed 列再次为NUMBER

你还想和

一起去
SELECT TO_CHAR(COL1,'FM99999.00') FROM SQL_TEXT;