Date PLSQL需要REFCURSOR日期+时间
我在使用这段代码时遇到了一个问题,o_BestEltidden游标的输出是:01-06-15 a日期,但我更喜欢这样的输出:16:00所以只有时间或01-06-15 16:00:00日期+时间。可能吗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
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是日期类型的表;。所以你的答案将是日期格式 相反,如果需要时间戳类型,则必须对这些变量进行更改,并在其中存储时间戳,以通过格式化获得所需的日期+时间或时间输出