Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
Sql Oracle更新问题与操作员和_Sql_Oracle_Sql Update - Fatal编程技术网

Sql Oracle更新问题与操作员和

Sql Oracle更新问题与操作员和,sql,oracle,sql-update,Sql,Oracle,Sql Update,我在oracle中有一个暂存表,所有列都设置为varchar2以接受来自excel导入功能的文本数据。一旦数据被大容量复制到staging表中,我将验证验证失败的记录的数据&标记错误 我的一条验证语句抛出了一个“无效数字”错误。当左侧出现故障时,是否有任何方法可以阻止oracle评估右侧和状态 我的update语句如下&AMT列包含文本非数字数据 UPDATE StagingTable SET ErrorTXT = Error_txt || 'Invalid Amount, ' WHERE f_

我在oracle中有一个暂存表,所有列都设置为varchar2以接受来自excel导入功能的文本数据。一旦数据被大容量复制到staging表中,我将验证验证失败的记录的数据&标记错误

我的一条验证语句抛出了一个“无效数字”错误。当左侧出现故障时,是否有任何方法可以阻止oracle评估右侧和状态

我的update语句如下&AMT列包含文本非数字数据

UPDATE StagingTable
SET ErrorTXT = Error_txt || 'Invalid Amount, '
WHERE f_isnumber (INV_AMT) > 0
AND TO_NUMBER (INV_AMT) > 9999999999.99;
库存金额列作为垃圾非数字数据。我希望条件的左侧计算为false,对于非数字数据,应该停止右侧的计算&因此不应该抛出无效数字错误。
有什么提示我可以使用吗?

如果您使用的是Oracle 12.2或更高版本,您可以在转换错误时使用
TO\u NUMBER
,如下所示,这样您就不需要
f\u isnumber
功能:

UPDATE StagingTable
SET ErrorTXT = Error_txt || 'Invalid Amount, '
WHERE TO_NUMBER(INV_AMT DEFAULT -1 ON CONVERSION ERROR)  > 9999999999.99;

干杯

如果您使用的是Oracle 12.2或更高版本,您可以使用
ON CONVERSION ERROR
TO_NUMBER
,如下所示,这样您就不需要
f_isnumber
功能:

UPDATE StagingTable
SET ErrorTXT = Error_txt || 'Invalid Amount, '
WHERE TO_NUMBER(INV_AMT DEFAULT -1 ON CONVERSION ERROR)  > 9999999999.99;

干杯

您还可以使用
大小写
表达式。假设函数
f_isnumber()
执行此测试:

WHERE (CASE WHEN f_isnumber(INV_AMT) > 0 THEN TO_NUMBER(INV_AMT)
       END) > 9999999999.99;
如果不是,则可以使用正则表达式:

WHERE (CASE WHEN REGEXP_LIKE(INV_AMT, '^-?[0-9]*([.][0-9])?[0-9]*') 
            THEN TO_NUMBER(INV_AMT)
       END) > 9999999999.99;

您还可以使用
大小写
表达式。假设函数
f_isnumber()
执行此测试:

WHERE (CASE WHEN f_isnumber(INV_AMT) > 0 THEN TO_NUMBER(INV_AMT)
       END) > 9999999999.99;
如果不是,则可以使用正则表达式:

WHERE (CASE WHEN REGEXP_LIKE(INV_AMT, '^-?[0-9]*([.][0-9])?[0-9]*') 
            THEN TO_NUMBER(INV_AMT)
       END) > 9999999999.99;

执行两次更新,或在WHERE子句中使用大小写表达式。可能的重复项:执行两次更新,或在WHERE子句中使用大小写表达式。可能的重复项:这看起来是一个不错的选项。我的oracle版本显示12.2。但是上面显示默认语法问题的语句。[Error]ORA-43907(195:47):PL/SQL:ORA-43907:此参数必须是文本或绑定变量。这就是我看到的错误。不过我可以在select语句中使用它。请向我显示您遇到此错误的确切代码。我想您在默认条款中一定使用了不同的值或函数,我可以运行该语句。我猜只有在编译包时才会抛出这个错误。这看起来是个不错的选择。我的oracle版本显示12.2。但是上面显示默认语法问题的语句。[Error]ORA-43907(195:47):PL/SQL:ORA-43907:此参数必须是文本或绑定变量。这就是我看到的错误。不过我可以在select语句中使用它。请向我显示您遇到此错误的确切代码。我想您在默认条款中一定使用了不同的值或函数,我可以运行该语句。我猜只有在编译包时才会抛出这个错误。