Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date PLSQL需要REFCURSOR日期+时间_Date_Time_Plsql_Cursor - Fatal编程技术网

Date PLSQL需要REFCURSOR日期+时间

Date PLSQL需要REFCURSOR日期+时间,date,time,plsql,cursor,Date,Time,Plsql,Cursor,我在使用这段代码时遇到了一个问题,o_BestEltidden游标的输出是:01-06-15 a日期,但我更喜欢这样的输出:16:00所以只有时间或01-06-15 16:00:00日期+时间。可能吗 SET SERVEROUTPUT ON; CREATE OR REPLACE TYPE t_openingstijd IS TABLE OF DATE; CREATE OR REPLACE PROCEDURE zoekMogelijkeBesteltijden(p_winkelId IN INT

我在使用这段代码时遇到了一个问题,o_BestEltidden游标的输出是:01-06-15 a日期,但我更喜欢这样的输出:16:00所以只有时间或01-06-15 16:00:00日期+时间。可能吗

SET SERVEROUTPUT ON;
CREATE OR REPLACE TYPE t_openingstijd IS TABLE OF DATE;

CREATE OR REPLACE PROCEDURE zoekMogelijkeBesteltijden(p_winkelId IN INTEGER, p_datum IN DATE, p_periode IN INTEGER DEFAULT 21, p_bezorgen IN BOOLEAN,
                                                  o_open OUT BOOLEAN, o_besteltijden OUT SYS_REFCURSOR)
AS
v_foundWinkel NUMBER := 0;
v_winkel Winkel%ROWTYPE;

TYPE arrayVarchar IS VARRAY(7) OF VARCHAR2(2);
v_dagen arrayVarchar := arrayVarchar('ma', 'di', 'wo', 'do', 'vr', 'za', 'zo');

CURSOR v_openingstijden(p_id IN NUMBER, p_dag IN VARCHAR2) IS
    SELECT * FROM Openingstijd
    WHERE winkel_id = p_id
    AND dag = p_dag;

v_besteltijden t_openingstijd := t_openingstijd();

v_eindUur NUMBER := 0;
v_eindMinuten NUMBER := 0;

v_beginUur NUMBER := 0;
v_beginMinuten NUMBER := 0;

-- Exceptions
v_winkelNotFound EXCEPTION;
BEGIN
-- Kijken of winkel wel bestaat.
SELECT COUNT(1) INTO v_foundWinkel
FROM Winkel
WHERE id = p_winkelId;

IF(v_foundWinkel = 0) THEN
    RAISE v_winkelNotFound;
END IF;

-- Alle data krijgen van de winkel. Exclusief de openingstijden, producten en coupons.
SELECT * INTO v_winkel
FROM Winkel
WHERE id = p_winkelId;

FOR i_tijd IN v_openingstijden(p_winkelId, 
                               v_dagen(TO_NUMBER(TO_CHAR(p_datum, 'D')))) LOOP        

    -- Instellen van huidige tijd om mee door te lopen.
    v_eindUur := TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'HH24'));

    IF(p_bezorgen = true) THEN
        IF(TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'MI')) < 30) THEN
            IF(TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'MI')) < 15) THEN
                v_eindMinuten := 30;
            ELSE
                v_eindMinuten := 45;
            END IF;

            v_eindUur := v_eindUur - 1;
        ELSE
            IF(TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'MI')) < 45) THEN
                v_eindMinuten := 0;
            ELSE
                v_eindMinuten := 15;
            END IF;
        END IF;
    ELSE
        IF(TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'MI')) < 15) THEN
            v_eindMinuten := 45;
            v_eindUur := v_eindUur - 1;
        ELSE
            IF(TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'MI')) < 30) THEN
                v_eindMinuten := 0;
            ELSIF(TO_NUMBER(TO_CHAR(i_tijd.gesloten, 'MI')) < 45) THEN
                v_eindMinuten := 15;
            ELSE
                v_eindMinuten := 30;
            END IF;
        END IF;    
    END IF;

    -- Begin tijd berekenen
    v_beginUur := TO_NUMBER(TO_CHAR(i_tijd.open, 'HH24'));

    IF(TO_NUMBER(TO_CHAR(i_tijd.open, 'MI')) < 15) THEN
        v_beginMinuten := 0;
    ELSIF(TO_NUMBER(TO_CHAR(i_tijd.open, 'MI')) < 30) THEN
        v_beginMinuten := 15;
    ELSIF(TO_NUMBER(TO_CHAR(i_tijd.open, 'MI')) < 45) THEN
        v_beginMinuten := 30;
    ELSE
        v_beginMinuten := 45;
    END IF;

    -- Eerste uur vol maken.
    IF(v_beginMinuten != 0) THEN
        FOR i IN 1 .. ((60 - v_beginMinuten) / 15) LOOP
            v_besteltijden.extend;
            v_besteltijden(v_besteltijden.count) := TO_DATE( v_beginUur || ':' || v_beginMinuten * i, 'HH24:MI');
        END LOOP;

        v_beginUur := v_beginUur + 1;
        v_beginMinuten := 0;
    END IF;

    -- Tot het laatste uur volmaken.
    IF(v_beginUur != v_eindUur) THEN
        FOR x IN 1 .. (v_eindUur - v_beginUur) LOOP
            FOR i IN 1 .. 4 LOOP
                v_besteltijden.extend;

                IF(i = 1) THEN
                    v_besteltijden(v_besteltijden.count) := TO_DATE( v_beginUur || ':00', 'HH24:MI');
                ELSE
                    v_besteltijden(v_besteltijden.count) := TO_DATE( v_beginUur || ':' || 15 * (i - 1), 'HH24:MI');
                END IF;
            END LOOP;

            v_beginUur := v_beginUur + 1;
        END LOOP;
    END IF;

    -- Laatste uur ook maar eens volmaken.
    IF(v_beginUur = v_eindUur AND v_eindMinuten >= v_beginMinuten) THEN
        FOR i IN 1 .. (v_eindMinuten / 15) + 1 LOOP
            v_besteltijden.extend;

            IF(i = 1) THEN
                v_besteltijden(v_besteltijden.count) := TO_DATE( v_beginUur || ':00', 'HH24:MI');
            ELSE
                v_besteltijden(v_besteltijden.count) := TO_DATE( v_beginUur || ':' || 15 * (i - 1), 'HH24:MI');
            END IF;
        END LOOP;
    END IF;

END LOOP;

-- Data terug in output cursor.
OPEN o_besteltijden FOR
    SELECT * FROM TABLE(CAST(v_besteltijden AS t_openingstijd));


-- Is de winkel momenteel open?
FOR i_openingstijd IN v_openingstijden(p_winkelId, 
                               v_dagen(TO_NUMBER(TO_CHAR(SYSDATE, 'D')))) LOOP  
    IF(o_open = true) THEN
        IF(TO_NUMBER(TO_CHAR(SYSDATE, 'HH24MI')) >= TO_NUMBER(TO_CHAR(i_openingstijd.open, 'HH24MI'))
          AND TO_NUMBER(TO_CHAR(SYSDATE, 'HH24MI')) <= TO_NUMBER(TO_CHAR(i_openingstijd.gesloten, 'HH24MI'))) THEN
            o_open := true;
        ELSE
            o_open := false;
        END IF;
    END IF;
END LOOP;

EXCEPTION
WHEN v_winkelNotFound THEN
    dbms_output.put_line('Winkel niet gevonden.');
END;
/

这里的问题似乎如下:

您正在将o_besteltijden设置为从CASTv_besteltijden中选择的值,该值为t_openingstijd,其中v_besteltijden的计算日期为自

t_openingstijd是日期类型的表创建或替换类型t_openingstijd是日期类型的表;。所以你的答案将是日期格式

相反,如果需要时间戳类型,则必须对这些变量进行更改,并在其中存储时间戳,以通过格式化获得所需的日期+时间或时间输出