PL/SQL: IF 或 CASE 语句检查一行中的两个变量和 return 第三个变量?

PL/SQL: IF or CASE statement to check two variables in a single row and return a third variable?

我需要PL/SQL代码来扫描一个table(与Apex中的第5页相关),看看一行是否有两个变量(一个特定的ID和一个1-3之间的特定数字)存在,并且 return 从该行到 Oracle Apex 项的第三个变量(这是第 10 页上的动态操作)如果存在。我可以用 SELECT 语句来做到这一点,它可以正常工作:

select VARIABLE_3 into :P10_ITEM from TABLE where (ID = :P10_ID and NUM = '1');

但我不能单独使用该语句,因为如果该行不存在,它会抛出有关丢失数据的错误。所以我需要这个作为 IF 或 CASE。但是当我尝试将其写为 IF 或 CASE 时,它 return 什么都没有。

    if (:P10_ID = :P5_ID and :P5_NUM = '1') then
       select VARIABLE_3 
       into :P10_ITEM 
       from TABLE 
       where (ID = :P10_ID and NUM = '1');
    end if;

示例数据如下(所有列均为 NUMBER 类型):

ID ... NUM ...  VARIABLE_3
-------------------------
10 ...  1  ...  23
10 ...  2  ...  24
11 ...  1  ...  25
11 ...  2  ...  26
11 ...  3  ...  27
12 ...  1  ...  28

它验证正常并且没有抛出任何错误,但它也没有给出任何结果。如果我添加一个 else :P10_ITEM := '0'; 那么它将 return 0,所以 submit/return 很好,我知道动态动作是 运行。有什么建议吗?

关于您发布的第一个 SELECT 声明以及您对此的评论:

But I can't use that statement alone because if the row doesn't exist, it'll throw an error about missing data.

有一个简单的方法 - 聚合函数。

例如,斯科特的 dept table:

SQL> select * From dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

这是您当前的查询,结果为 no_data_found:

SQL> select dname from dept where deptno = 12 and loc = 'DALLAS';

no rows selected

或者,在 PL/SQL(这是 Apex 使用的):

SQL> declare
  2    l_dname dept.dname%type;
  3  begin
  4    select dname
  5      into l_dname
  6      from dept
  7      where deptno = 12
  8        and loc = 'DALLAS';
  9  end;
 10  /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4


SQL>

但是,如果你MAX它(列),那么结果就是NULL,没有错误了:

SQL> select max(dname) from dept where deptno = 12 and loc = 'DALLAS';

MAX(DNAME)
--------------

    
SQL> declare
  2    l_dname dept.dname%type;
  3  begin
  4    select max(dname)
  5      into l_dname
  6      from dept
  7      where deptno = 12
  8        and loc = 'DALLAS';
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL>

看到了吗?现在只需检查变量的值并做任何你想做的事。


你的情况:

SELECT MAX(variable_3)
  INTO :P10_ITEM
  FROM some_table
 WHERE (    id = :P10_ID
        AND num = '1');
        
IF :P10_ITEM IS NOT NULL THEN 
   ... do something
ELSE
   ... do something else
END IF;