我有以下查询,我想在存储过程中使用,并返回值为0或1或2的状态。
CREATE OR REPLACE PROCEDURE TEST_CHECK
(NAME IN VARCHAR2, IN_ID IN NUMBER,
IN_STATUS OUT NUMBER)
AS
CURSOR CHK_STATUS IS
select STATUS
from TEST_LOG
where NAME = 'TT'
and ID = 19
and CHK_DATE >= to_date( TRUNC ( SYSDATE - 1 , 'MM' ) , 'YYYYMMDD' )
and CHK_DATE < to_date ( TRUNC ( SYSDATE), 'YYYYMMDD' );
BEGIN
FOR CHK_STAT IN CHK_STATUS
LOOP
IF CHK_STAT.STATUS = 0
THEN
IN_STATUS := 0;
ELSE
IF CHK_STAT.STATUS = 1
THEN
IN_STATUS := 1;
ELSE
IN_STATUS := 2;
END IF;
END IF;
END LOOP;
END TEST_CHECK;
但我想使用逻辑,如果此查询中的任何状态返回2,那么它应返回2.如果所有状态返回0,则仅返回0.如果所有状态返回1,则仅返回1。如果状态在0和1之间返回,则返回1.如果状态在1和2之间返回,则返回2.
所以我没有返回太多的值,而是想将结果限制为只有一个值状态,我希望将其作为OUT参数传递给另一个函数。我已经写了上面的程序,但它没有给出预期的输出。我不确定是否需要使用光标或只是编写查询而不会工作。
答案 0 :(得分:1)
听起来你只想把最大的状态作为整数返回,所以这样的东西应该有用:
RusotoFuture
答案 1 :(得分:1)
返回值时只需使用CEIL
函数,即代替此语句:
IF (CHK_STAT.STATUS =0)
THEN
IN_STATUS := 0;
else if (CHK_STAT.STATUS =1)
THEN
IN_STATUS := 1;
else
IN_STATUS := 2;
END IF;
只需使用
IN_STATUS := CEIL(CHK_STAT.STATUS);
CEIL
表示ceiling
顾名思义,舍入到连续的更大整数,
i.e. ceil(0)->0, ceil(0.5)->1, ceil(1)->1, ceil(1.3)->2, ceil(2)->2
答案 2 :(得分:1)
我认为你也可以使用下面的代码,
FOR CHK_STAT IN CHK_STATUS
LOOP
IF CHK_STAT.STATUS > IN_STATUS OR IN_STATUS IS NULL THEN
IN_STATUS := CEIL(CHK_STAT.STATUS);
END IF;
END LOOP;