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;
我需要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;