使用 AND 运算符的 Oracle 更新问题
Posted
技术标签:
【中文标题】使用 AND 运算符的 Oracle 更新问题【英文标题】:Oracle update issue with AND operator 【发布时间】:2020-01-30 09:43:03 【问题描述】:我在 oracle 中有一个临时表,所有列都设置为 varchar2 以接受来自 excel 导入功能的文本数据。将数据批量复制到临时表后,我会验证数据并标记未通过验证的记录的错误。
我的一个验证语句抛出“无效号码”错误。当左侧失败时,有什么方法可以阻止 oracle 评估 AND 条件的右侧?
我的更新语句如下 & AMT 列包含文本非数字数据。
UPDATE StagingTable
SET ErrorTXT = Error_txt || 'Invalid Amount, '
WHERE f_isnumber (INV_AMT) > 0
AND TO_NUMBER (INV_AMT) > 9999999999.99;
INV_AMT 列作为垃圾非数字数据。我期望条件的左侧评估为假,对于非数字数据,应该停止评估右侧,因此不应该抛出无效数字错误。 有什么我可以使用的提示吗?
【问题讨论】:
要么执行两次 UPDATE,要么在 WHERE 子句中使用 case 表达式。 可能重复:***.com/questions/4486949/safe-to-number 【参考方案1】:如果您使用的是 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;
干杯!!
【讨论】:
这看起来是个不错的选择。我的 oracle 版本显示 12.2。但是上面的语句在 DEFAULT 上显示了语法问题。 [错误] ORA-43907 (195: 47): PL/SQL: ORA-43907: 此参数必须是文字或绑定变量。这是我看到的错误。不过,我可以在 select 语句中使用它。 向我显示您遇到此错误的确切代码。我认为您必须在默认子句中使用了不同的值或函数 我能够运行该语句。我猜它只在编译包期间抛出该错误。【参考方案2】:您也可以使用case
表达式。假设函数 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;
【讨论】:
以上是关于使用 AND 运算符的 Oracle 更新问题的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - 当我使用 EXISTS 时,关系运算符无效
使用 KafkaConnect JdbcDriver 和 Oracle 11g(Strimzi 运算符)时出现无用的 ORA 错误