ORA-01722
From Oracle FAQ
<!---->
ORA-01722: invalid number
What causes this error?
An ORA-01722 error occurs when an attempt is made to convert a character string into a number,
and the string cannot be converted into a valid number. Valid numbers
contain the digits '0' thru '9', with possibly one decimal point, a
sign (+ or -) at the beginning or end of the string, or an 'E' or 'e'
(if it is a floating point number in scientific notation). All other
characters are forbidden.
There are numerous situations where this conversion may occur.
A numeric column may be the object of an INSERT or an UPDATE statement.
Or, a numeric column may appear as part of a WHERE clause. It is even
possible for this error to appear when there are no numeric columns
appearing explicitly in the statement!
Examples
Here are some examples:
SQL> select to_number('3434,3333.000') from dual;
ERROR:
ORA-01722: invalid number
no rows selected
The above statement throws the error message, because it has found a
character, in this case, a comma and the default format for TO_NUMBER
does not contain a comma.
The same error can occur when you use arithmetic functions on strings:
SQL> select 'abc' - 124 from dual;
ERROR:
ORA-01722: invalid number
no rows selected
The error can occur when you add dates with string values:
SQL> select '01-JUN-01' - 'abc' from dual;
ERROR:
ORA-01722: invalid number
no rows selected
How to fix it
The fix depends upon the exact expression which caused the problem.
The following guide lists the possible SQL expressions which can give
this error, with their most likely cause. When addressing this error,
keep in mind that it can indicate a simple keystroke problem with the
query, or a deeper problem with the query logic, or even the presence
of bad data in the database itself.
When doing an INSERT INTO ... VALUES (...)
One of the data items you are trying to insert is an invalid number. Locate and correct it.
If all of the numbers appear to be valid, then you probably have
your columns out of order, and an item in the VALUES clause is being
inserted into a NUMBER column instead of the expected VARCHAR2 column.
This can happen when a table has columns added or removed.
You are doing an INSERT or UPDATE, with a sub query supplying
the values.
Obviously, the preceding considerations apply here as well. What makes
this more complicated is that the offending character string is hidden
as a row in a table. The fix is to identify the row (or rows) which has
the non-numeric string, and either change the data (if it is in error)
or add something to the sub query to avoid selecting it. The problem is
in identifying the exact row.
Assuming that the errant datum is an alphabetic character, one can use the following query:
SELECT ... WHERE UPPER(col) != LOWER(col)
where col is the column with the bad data.
When doing a SELECT, rather than an INSERT or UPDATE
In this case, there is probably an implicit conversion happening
between some predicate in the WHERE clause. Check for a numeric column
being compared to a character column.
If you are using the to_number function, make sure the format mask fits all possible character strings in the table.
If you know that a column contains both valid numbers and
character strings, make sure that all rows which do not contain valid
numbers are being excluded in the WHERE clause.
Other Rare Situations
To expand on the previous comment, if you have a column in a table
which contains both valid numbers and character strings, it is just
barely possible to get an ORA-01722 even if no character strings are
being returned by your query. Example: two tables must be joined. In
table A, the column is VARCHAR2, and in table B it is NUMBER. Table A
also has non-numeric data in that column in some rows, and has a type
column to make it obvious which rows are which. It is possible for the
optimizer to choose an access plan in which the join is attempted
before the filtering, which will cause the ORA-01772. The fix is to add
a hint which changes the plan enough to bypass the rows causing the
error.
Doing an explicit conversion can sometimes make things worse.
For example, '+17', '-17', & ' 17' all convert successfully
implicitly. The last one will raise the error if the 'S99' mask is used
in the to_number function.
A field containing only spaces will raise this error. One fix is to replace the spaces with nulls or zeroes.
If you are querying a view rather than a table, any of the above
could apply, and be hidden from sight. The fix is to add a predicate to
the WHERE clause which excludes the troublesome rows.
相关推荐
微信小程序支付JSAPI交易类型 已通过测试 返回例子如下: <xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code>
[CDATA[ ]]> 用于包含 Mybatis 的标签(如 `<if>`、`<where>`、`<choose>` 等),否则这些标签将不会被解析。 实例如下:<select id="allUserInfo" parameterType="java.util.HashMap" resultMap="userInfo1"> <!...
[CDATA[ 文本内容 ]]>`,其中"文本内容"部分不能包含字符串"]]>",以防止提前结束CDATA段。同时,CDATA段不能嵌套,也就是说,一个CDATA段内部不能再有另一个CDATA段。 要将Java对象转换成XML并包含CDATA,我们可以...
- 注释以`<!--`开始,以`-->`结束,用于添加非显示的信息,方便代码阅读。 **2.6 处理指令** - 处理指令以`<?`开始,以`?>`结束,主要用于指示XML处理器执行特定任务,例如调用XSLT转换。 **2.7 CDATA段** - ...
-- 在这里定义装饰器 --> </decorators> ``` ##### 4. 可选配置 - 创建可选配置文件`[web-app]/WEB-INF/sitemesh.xml`。 - 文件内容示例: ```xml <sitemesh> <property name="decorators-file" value="/WEB-...
[CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></...
[CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml...
ATTLIST 电话 类别 CDATA "移动电话"> ]> <联系人列表> <说明>&content;</说明> <联系人> <姓名>刘保文</姓名> <ID>201003101115</ID> <公司>腾飞汇通有限公司</公司> <电话 类别="移动电话">18993380967</...
自己将数据导入到xml中的,希望有需要的朋友可以自己下载,格式为<!DOCTYPE PCAroot[ <!ELEMENT PCAroot (Province*)> <!ELEMENT Province (City*)> <!ELEMENT City (Area*)> <!ELEMENT Area (#PCDATA)> <!...
<preconditions><![CDATA[1.使用udp_bi用户在PLSQL正常登陆UAT数据库<br> (UAT数据库IP: 10.0.13.178)<br> 2.数据库脚本已下载至本地环境]]></preconditions><importance><![CDATA[2]]></importance><steps> <step>
[CDATA[//><!-- var scrollPic_02 = new ScrollPic(); scrollPic_02.scrollContId = "ISL_Cont_1"; //内容容器ID scrollPic_02.arrLeftId = "LeftArr";//左箭头ID scrollPic_02.arrRightId = "RightArr"; //...
-- 内部DTD定义 --> ]> <document> <!-- 文档内容 --> </document> ``` - 外部DTD:引用外部的.DTD文件,分为私有和公开两种。引用私有DTD的例子: ```xml <!DOCTYPE document SYSTEM "myDTD.dtd"> <document> <!-...
Map<String, Object> parameters = new HashMap<>(); parameters.put("REPORT_DATA_SOURCE", dataSource); // 数据源 JasperPrint jasperPrint = JasperFillManager.fillReport(compiledReportStream, parameters);...
<body>Don't forget me this weekend</body> </note> ``` 在上面的示例中,我们定义了一个名为 `note` 的根元素,该元素包含四个子元素:`to`、`from`、`heading` 和 `body`。每个子元素的声明都使用 `ELEMENT` ...
[CDATA[This is some arbitrary text <within> a CDATA!]]> ``` 元素可以有属性,属性用来提供额外的信息。例如: ```xml <article title="A Tutorial on XML 1.0"> ``` 这里的 `title` 就是元素 `article` 的一个...
-- 通过Bindable注释绑定变量 --> <fx:Script> <![CDATA[ [Bindable] [Embed("../png/internet.png")] // 自定义图标路径 private var myFolderClosedIcon:Class; [Bindable] [Embed("../png/phone.png")] ...
[CDATA[留言内容]]></content> </message> </messages> </gbook> ``` 4. **DTD定义**: - 用于定义XML文档的结构和约束条件。 - 例如,`<gbook>` 元素包含了 `<info>` 和 `<messages>` 两个子元素。 ```xml...
[^<>]*["'\s][^<>]*>]]></value> </property> <property name="replaceRegexUrl"> <!-- 替换可能包含URL的字符串 --> <value><![CDATA[<[^!<>]*\shref\s*=\s*["']?reptile-replace-string["'\s][^<>]*>]...