检查表中的所有值并返回一个值oracle

时间:2018-01-15 16:29:33

标签: sql oracle if-statement stored-procedures plsql

我有以下查询,我想在存储过程中使用,并返回值为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参数传递给另一个函数。我已经写了上面的程序,但它没有给出预期的输出。我不确定是否需要使用光标或只是编写查询而不会工作。

3 个答案:

答案 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;