【问题标题】:Oracle - Number to varcharOracle - 数字到 varchar
【发布时间】:2009-10-19 13:07:15
【问题描述】:

我有一个包含 Number 类型列的表

create table tmp (
    /*other fields*/
    some_field Number
)

在 PL SQL 脚本中,我想将该字段转换为 varchar。但是,我不知道它的长度,所以我得到了一个例外

异常消息是 ORA-06502: PL/SQL:数字或值错误: 字符串缓冲区太小

v_some_field varchar(21);
/*...*/
v_some_field := TO_CHAR(some_field,'999999999999999999999');

我应该如何声明 v_some_field 缓冲区?将其设置为 varchar(32767) 似乎很粗鲁,有没有其他选择?

【问题讨论】:

    标签: oracle plsql to-char


    【解决方案1】:

    您收到错误不是因为数字太大,而是因为您的 to_char 的结果是 22 个字符长(符号为 21x"9"+一个字符):

    SQL> DECLARE
      2     some_field   NUMBER := 123;
      3     v_some_field VARCHAR(21);
      4  BEGIN
      5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
      6  END;
      7  /
    
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 6
    
    SQL> DECLARE
      2     some_field   NUMBER := 123;
      3     v_some_field VARCHAR(22);
      4  BEGIN
      5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
      6  END;
      7  /
    
    PL/SQL procedure successfully completed
    

    【讨论】:

      【解决方案2】:

      您可以通过用整数和小数转换负值来确定转换后的 varchar2 的最大长度:

      set serveroutput on
      declare
         n number;
      begin
         n := -4/3;
         dbms_output.put_line(length(to_char(n)));
      end;
      /
      

      对我来说输出是 41。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 2011-04-10
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多