我在查询下运行并收到此错误:
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;
答案 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>)
所以你只需要在开始时定义正在检查的值。