Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle10g 将数据从varchar2复制到同一表中的数字_Oracle10g - Fatal编程技术网

Oracle10g 将数据从varchar2复制到同一表中的数字

Oracle10g 将数据从varchar2复制到同一表中的数字,oracle10g,Oracle10g,我有两列,我需要将数据从column VISITSAUTHORIZED复制到NEWVISITS,当我使用下面的命令复制数据时,我收到一条错误消息“invalid number”。有人能纠正吗 VISITSAUTHORIZED VARCHAR2(10) NEWVISITS NUMBER(8) SQL> update patientinsurance set NEWVISITS=VISITSAUTHORIZED ; ERROR at line 1: ORA-0172

我有两列,我需要将数据从column VISITSAUTHORIZED复制到NEWVISITS,当我使用下面的命令复制数据时,我收到一条错误消息“invalid number”。有人能纠正吗

 VISITSAUTHORIZED  VARCHAR2(10)
 NEWVISITS         NUMBER(8)
 SQL> update patientinsurance set NEWVISITS=VISITSAUTHORIZED ;
 ERROR at line 1:
 ORA-01722: invalid number

这取决于旧列中的数据类型。如果所有内容的格式一致,则您可以执行以下操作:

update patientinsurance
set newvisits = to_number(visitsauthorized, '<format model>')
这是在猜测您有一个名为
ID
的唯一标识符字段,但很明显,您可以根据表的情况更改该字段

另一种方法是转换有效的数字并跳过其余数字,这可以通过错误记录表来完成:

exec dbms_errlog.create_error_log(dml_table_name => 'PATIENTINSURANCE');

merge into patientinsurance target
using (select id, visitsauthorized from patientinsurance) source
on (target.id = source.id)
when matched then
  update set target.newvisits = source.visitsauthorized
log errors into err$_patientinsurance reject limit unlimited;
然后,您可以查询错误表以查看失败的内容:

select id, visitsauthorized, ora_err_number$
from err$_patientinsurance;
或者查看主表中的哪些记录有
newvisions
仍然
null
。不过,分析数据可能是第一步


如果要去掉所有非数字字符并将剩余的字符视为数字,则可以将合并更改为:

...
update set target.newvisits = regexp_replace(source.visitsauthorized,
  '[^[:digit:]]', null)
但是,您可能不需要合并,只需执行以下操作:

update patientinsurance set newvisits = regexp_replace(visitsauthorized,
  '[^[:digit:]]', null);
这也将去掉任何组或十进制分隔符,这可能不是问题,尤其是在插入数字(8)列时。但是如果您愿意,您可以通过将模式更改为
'[^[:digit:][,]'
。。。尽管这可能会给你带来其他潜在的问题


如果正则表达式太慢,也可以使用
translate
执行此操作。

这意味着
visitAuthorized
表中的值不是有效的数字。可能是使用组分隔符或(不正确的)小数分隔符输入的,但可以是任何内容。您能否添加一个值示例,看看这是否可以通过数字格式掩码解决?更新patientinsurance set newvisits=to_number(VisitAuthorized,'VARCHAR2(10)')如果我这样使用,我会在第1行收到类似这样的错误:ORA-01481:无效的数字格式model@Kiran不,不,,这不是一个好主意;首先看数据。如果您有类似于say
'1234'
的数据,则模型可能类似于
'999999'
。完全取决于表中的内容。当我使用合并过程时,我只能复制数字,但我需要访问授权包含的所有信息,如(TE44700,KET99500)到新访问(TE44700,KET99500)但我只复制了700500个值,其余的值都得到了错误日志,所以我需要做什么next@Kiran-不能将字符放入数字列中。对于那些-
44
99
或其他什么,你希望在
新访问中得到什么?实际上,我正在从授权访问备份到新访问,如果我们丢失了混合字符和数字的值,那么如何获取所有值。
update patientinsurance set newvisits = regexp_replace(visitsauthorized,
  '[^[:digit:]]', null);