我想将数据从oracle数据库导出到csv,我在varchar列上放了一个数字过滤器。它发生ORA:01722错误。请建议
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想将数据从oracle数据库导出到csv,我在varchar列上放了一个数字过滤器。它发生ORA:01722错误。请建议相关的知识,希望对你有一定的参考价值。
Select count(*) from table where loc between 300 to 400.
loc
是varchar专栏。- 它没有选择所有数据
- 检查计数,给出ORA:01722错误
- 导出错误的结果。
从评论编辑:
loc包含小于300,大于400的值,以及像'GT','3KT1'这样的字母数字
loc
是varchar专栏。 [来自评论] Loc列的char类型值也像GJ,3KT1
LOC
包含不可转换为数字的值。这很重要,因为您的WHERE子句谓词被定义为数字,因此Oracle将隐式to_number(loc)
应用于查询。这就是为什么使用正确的数据类型是最佳做法:它现在对您没有帮助,但请学习本课程,并使用NUMBER列来表示数字数据。
与此同时,您有几种方法可以处理您的shonky数据模型。
如果您有幸使用Oracle 12c R2,则可以使用新的VALIDATE_CONVERSION()
函数来排除不能转换为数字的loc
值。 Find out more
如果您使用的是早期版本的Oracle,则可以构建自己的函数:
create or replace function is_number
(p_str in varchar2) return number
is
n number;
rv number;
begin
begin
n := to_number(p_str);
rv := 1;
exception
when invalid_number then
rv := 0;
end;
return rv;
end;
最弱的选择是将谓词转换为字符串。 where loc between '300' to '400'
将包括'3000'
,'4'
以及您可能不想要的各种其他值。
这是a LiveSQL demo (free Oracle Technet account required, alas)。
您当前的查询正在尝试将varchar与数字进行比较。因此它尝试将varchar转换为动态数字。这称为隐式转换。
您应该将varchar与varchar进行比较。
使用单引号,以便与varchars进行比较,而不是数字
Select count(*) from table where loc between '300' to '400'
然后去阅读有关隐式转换的内容
根据您的问题的更新,此列是合法的varchar,不应转换为数字数据类型。
但是,您确实需要确定是否在同一列中错误地存储了不同类型的数据
以上是关于我想将数据从oracle数据库导出到csv,我在varchar列上放了一个数字过滤器。它发生ORA:01722错误。请建议的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle APEX 中设置 SPOOL 脚本以将视图数据导出为 CSV?
如何将数据从单个 csv/excel 文件传输到多个 oracle 表