在oracle apex中比较时间戳时,调用“

在oracle apex中比较时间戳时,调用“,oracle,plsql,oracle-apex,Oracle,Plsql,Oracle Apex,我试图将上述代码放在PL/SQL函数体中,该函数体在项字段的验证部分返回布尔值。这就是我犯的错误 DECLARE FUNCTION CHECKTIME (APP_TIME IN TIMESTAMP) RETURN BOOLEAN IS BEGIN DECLARE START_TIME TIMESTAMP; END_TIME TIMESTAMP; CURSOR ST IS SELECT APP_START_TIME FROM APPOINTMENT

我试图将上述代码放在PL/SQL函数体中,该函数体在项字段的验证部分返回布尔值。这就是我犯的错误

DECLARE FUNCTION CHECKTIME (APP_TIME IN TIMESTAMP) 
RETURN BOOLEAN IS
BEGIN
    DECLARE
    START_TIME TIMESTAMP;
    END_TIME TIMESTAMP;
    CURSOR ST IS
        SELECT APP_START_TIME FROM APPOINTMENTS WHERE DOC_ID = :P24_DOC_ID;
    CURSOR ET IS
        SELECT APP_END_TIME FROM APPOINTMENTS WHERE DOC_ID = :P24_DOC_ID;
    BEGIN
        OPEN ST;
        OPEN ET;
        LOOP
            FETCH ST INTO START_TIME;
            FETCH ET INTO END_TIME;
            EXIT WHEN ST%NOTFOUND;
            IF APP_TIME <= ST AND APP_TIME >= ET
            THEN RETURN FALSE;
            END IF;
        END LOOP;
        CLOSE ST;
        CLOSE ET;
        RETURN TRUE;
    END;
END;

BEGIN
    RETURN CHECKTIME(:P42_APP_START_TIME);
END;

错误的真正原因是什么?

ST和ET是游标,这意味着它们是数据结构。要进行比较,您需要参考投影的各个元素,即

ORA-06550: line 18, column 25: PLS-00306: wrong number or types of arguments in call to '<='

顺便说一下。比较没有明显顺序的单独游标似乎有些奇怪。要么比较同一记录中的值,在这种情况下只需要一个光标,要么DOC_ID有多行,在这种情况下,似乎需要某种形式的排序或连接

ST和ET是游标,这意味着它们是数据结构。要进行比较,您需要参考投影的各个元素,即

ORA-06550: line 18, column 25: PLS-00306: wrong number or types of arguments in call to '<='
IF APP_TIME <= ST.APP_START_TIME AND APP_TIME >= ET.APP_END_TIME
顺便说一下。比较没有明显顺序的单独游标似乎有些奇怪。要么比较同一记录中的值,在这种情况下只需要一个光标,要么DOC_ID有多行,在这种情况下,似乎需要某种形式的排序或连接

IF APP_TIME <= ST.APP_START_TIME AND APP_TIME >= ET.APP_END_TIME
似乎出现错误是因为我使用了两个不同的游标,它们可能返回不同的行数,因此我不能使用比较运算符。在我将其更改为单个光标后,错误消失了


似乎出现错误是因为我使用了两个不同的游标,它们可能返回不同的行数,因此我不能使用比较运算符。在我将其更改为单个光标后,错误消失。

我确实使用了您的方法。然而,它没有起作用。但您下面的建议确实帮助我将双游标更改为单游标。是的,我的意思是,我只是不知道你实际上可以在游标中获取2列。谢谢我确实用了你的方法。然而,它没有起作用。但您下面的建议确实帮助我将双游标更改为单游标。是的,我的意思是,我只是不知道你实际上可以在游标中获取2列。谢谢