【问题标题】:Issue selecting and storing hour and min into a variable from cursors问题从游标中选择小时和分钟并将其存储到变量中
【发布时间】:2021-05-24 15:50:38
【问题描述】:

我遇到了这个嵌套游标的问题。我应该从两个游标内的时间戳中获取小时和分钟,然后将它们相加并将它们存储到一个变量中,以便我可以在相同的代码中使用它。我使用如下提取函数:

DECLARE
    
    CURSOR cur1 IS
        (SELECT *
        FROM ((Patient P JOIN Presence Pr ON P.idP=Pr.id_PRP)
               JOIN Loc L ON L.idL=Pr.id_PRL) LEFT JOIN Contact C ON
               P.idP=C.id_PR1);
             
    
    CURSOR cur2 IS
            ((SELECT *
             FROM (((Patient P JOIN Visit V ON P.idP=V.id_PV)
                    JOIN Presence Pr ON P.idP=Pr.id_PRP))
             WHERE :NEW.id_VSW = V.idV));
             
    np cur2%ROWTYPE;
    
    st_c1 number;
    et_c1 number;
    st_np number;
    et_np number;
    
BEGIN
    FOR curV IN cur1 
    LOOP
    
        OPEN cur2;
        
        FETCH cur2 INTO np;
       
        SELECT (EXTRACT(HOUR FROM curV.time_Start)+EXTRACT(MINUTE FROM curV.time_Start)) INTO st_c1 FROM DUAL;
        SELECT (EXTRACT(HOUR FROM curV.time_End)+EXTRACT(MINUTE FROM curV.time_End)) INTO et_c1 FROM DUAL;
        SELECT (EXTRACT(HOUR FROM np.time_Start)+EXTRACT(MINUTE FROM np.time_Start)) INTO st_np FROM DUAL;
        SELECT (EXTRACT(HOUR FROM np.time_End)+EXTRACT(MINUTE FROM np.time_End)) INTO et_np FROM DUAL;
        
        IF (((st_cl <= et_np AND st_cl >= st_np) OR (st_np <= et_cl AND st_np >= st_c1))
            ...
        END IF;
        CLOSE cur2;
        END LOOP;
END;
/

time_Start 和 time_End 属性是这样的:

INSERT INTO Table VALUES(TO_TIMESTAMP('2021-02-22 13:00','YYYY-MM-DD HH24:MI'));

它给了我这个错误:

36/3      PL/SQL: Statement ignored
36/40     PLS-00201: identifier 'ST_CL' must be declared

有什么问题?谢谢。

【问题讨论】:

  • 你喜欢括号吗?你的大部分都可以跳过。您的逻辑将不起作用,最好使用st_c1 := 60*EXTRACT(HOUR FROM curV.time_Start) + EXTRACT(MINUTE FROM curV.time_Start);
  • 请描述您尝试解决的问题,而不是您尝试使用的代码。你为什么要添加小时和小步舞曲,结果没有任何结果。毕竟 05:50 AM (55) 将大于 10:40 AM (50) 但小于 10:50 AM (60)。当开始到结束时间超过午夜时会发生什么,即从下午 23:00 开始,到第二天凌晨 01:00 结束。

标签: sql oracle plsql oracle11g cursor


【解决方案1】:

不是ST_CL,而是ST_C1(第一名)——至少,你是这么声明的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多