当值不存在时无法'SELECT INTO'

Xst*_*ity 5 oracle plsql package select-into

SELECT Value1 INTO lValue
FROM   Table1
WHERE  Field1 = lTempValue;
Run Code Online (Sandbox Code Playgroud)

匹配为true时,此方法正常.但如果匹配不成立,我收到错误.

ORA-01403: no data found
Run Code Online (Sandbox Code Playgroud)

理想情况下,这对我来说很好,因为我要检查旁边的值是否高于0,如果是,请在插入查询中使用该值.我不想检查值,然后必须运行相同的查询来检索它本质上,如果可能的话,我想在一个查询中执行它,但我无法弄清楚如何完成.

如果有值,那么我希望该值进入lValue.如果没有值,那么我希望0进入lValue.有人有任何想法吗?我只是做了一个快速谷歌检查,但它干了.想看,我会在看的时候发布这个.谢谢您的帮助.

Jus*_*ave 15

通常,您只是捕获异常

BEGIN
  SELECT value1
    INTO lValue
    FROM table1
   WHERE field1 = lTempValue;
EXCEPTION
  WHEN no_data_found
  THEN
    lvalue := 0;
END;
Run Code Online (Sandbox Code Playgroud)

您可以通过使用NVL和聚合函数(MIN或者MAX)来编写更少的代码,但这往往有点不太明显(例如,请注意,这些答案必须修改几次).并且它要求跟随你的人暂停片刻以了解你在做什么(以及你是否正确地做到了).一个简单的嵌套PL/SQL块很常见且非常容易理解.

然而,更重要的是,它不会隐藏由于重复行而导致的错误.如果你碰巧得到两排table1,其中field1lTempValue,捕只是no_data_found例外允许意外too_many_rows的异常传播到调用者.由于您不希望有多行,这正是您想要的行为.使用聚合函数隐藏了以下事实:基础数据存在问题,导致您返回可能不正确的结果,并且无法检测到存在问题.一旦某些东西导致重复的行出现,我总是会发现错误 - 允许我在问题失控之前解决问题 - 而不是多年后发现我们已经有数百万个重复的行,代码偶尔会返回不正确的结果,并且在解决根本原因后我们会进行大量的数据清理工作.