【问题标题】:Check all the value in table and return one value oracle检查表中的所有值并返回一个值 oracle
【发布时间】:2018-01-15 16:29:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案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)-&gt;0, ceil(0.5)-&gt;1, ceil(1)-&gt;1, ceil(1.3)-&gt;2, ceil(2)-&gt;2

    【讨论】:

      【解决方案2】:

      听起来您只想将最大的状态作为整数返回,所以这样的东西应该可以工作:

      Select MAX(CEIL(STATUS)) FROM TEST_LOG where SYS_DB_NAME = 'TT' and ENTITY_ID = 19 AND CHK_DATE >= to_date( TRUNC ( SYSDATE - 1 , 'MM' ) , 'YYYYMMDD' ) AND CHK_DATE < to_date ( TRUNC ( SYSDATE), 'YYYYMMDD' );

      【讨论】:

        【解决方案3】:

        我想你也可以使用下面的代码,

        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;
        

        【讨论】:

        • 我不认为我需要在这里循环,这会降低我的表现权_
        • 啊,好的,但是我只是修改了你上面的部分代码,你仍然可以选择不使用我给的代码
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多