获取错误ORA-01722:运行查询

时间:2018-03-08 10:40:06

标签: sql oracle

我在查询下运行并收到此错误:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.
select DECODE(upper(db_param_DATA_TYPE),'VARCHAR2',data_length,upper(db_param_DATA_TYPE),'DATE',data_length,
            upper(db_param_DATA_TYPE),'NUMBER',decode(
                nvl(
                    data_scale,
                    0
                ),
                0,
                nvl(
                    data_precision,
                    0
                ),
                data_precision
                 || '.'
                 || data_scale
            ))  
from db_param a 
   join all_tab_columns b on a.db_param_COL_NAME=b.column_name; 

2 个答案:

答案 0 :(得分:0)

您的查询尝试将数值(data_length)与生成'VARCHAR2'的字符串类型值ORA-01722进行比较。

我刚刚考虑过使用all_tab_columns词典视图作为数据源的以下查询:

select decode(upper(DATA_TYPE),
          'VARCHAR2',
          to_char(data_length),
   -- if "to_char(data_length)" replaced with "data_length", you get ORA-01722
          upper(DATA_TYPE),
          'DATE',
          data_length,
          upper(DATA_TYPE),
          'NUMBER',
          decode(nvl(data_scale, 0),
                 0,
                 nvl(data_precision, 0),
                 data_precision || '.' || data_scale))
  from all_tab_columns b
 where b.column_name = upper('&i_column_name'); -- a column in any table of the db. 

答案 1 :(得分:0)

问题在于您使用decode的方式 - 它不会以我认为您认为有效的方式发挥作用。

你说过:

DECODE(upper(db_param_data_type),
       'VARCHAR2',
       data_length,
       upper(db_param_data_type),
       'DATE',
       data_length,
       upper(db_param_data_type),
       'NUMBER',
       DECODE(NVL(data_scale, 0), 0, NVL(data_precision, 0), data_precision || '.' || data_scale))

但我认为你的意思是:

DECODE(upper(db_param_data_type),
       'VARCHAR2',
       data_length,
       'DATE',
       data_length,
       'NUMBER',
       DECODE(NVL(data_scale, 0), 0, NVL(data_precision, 0), data_precision || '.' || data_scale))

即。你不需要在解码过程中重复upper(db_param_data_type)

解码通过获取值然后比较它并输出各种响应来工作,如下所示:

decode (<value being checked>
        <if val1>
        <then output result1>
        <if val2>
        <then output result2>
        ...
        <else output result_else>)

所以你只需要在开始时定义正在检查的值。