按日期查找以日期作为参数的行时遇到问题
Having trouble when looking for a row by date having date as a parameter
我正在尝试执行具有以下结构的过程:
PROCEDURE GENERATE_TICKETS_TODAY (generating_date DATE)
IS
CURSOR observs_today
IS
SELECT *
FROM observations
WHERE (EXTRACT(YEAR FROM OBSERVATIONS.odatetime)) = (EXTRACT(YEAR FROM generating_date))
AND (EXTRACT(MONTH FROM OBSERVATIONS.odatetime)) = (EXTRACT(MONTH FROM generating_date))
AND (EXTRACT(DAY FROM OBSERVATIONS.odatetime)) = (EXTRACT(DAY FROM generating_date));
obs_analysed observs_today%ROWTYPE;
previous_obs_car observations%rowtype;
previous_obs_radar observations%rowtype;
owner_ticket VARCHAR2(9);
BEGIN
OPEN observs_today;
LOOP
FETCH observs_today INTO obs_analysed;
EXIT WHEN observs_today%NOTFOUND;
SELECT OWNER into owner_ticket
FROM VEHICLES WHERE nPlate=obs_analysed.nPlate;
previous_obs_car := prev_obs_car(obs_analysed.nPlate, obs_analysed.odatetime);
previous_obs_radar := prev_obs_radar(obs_analysed.odatetime, obs_analysed.road, obs_analysed.km_point, obs_analysed.direction);
--si hay infraccion de velocidad puntual: obs1_veh, obs1_date, tik_type, NULL, NULL, sent_date, NULL, NULL, amount, debtor, state
IF ticket_fee_maxspeed(obs_analysed.nPlate, obs_analysed.odatetime) > 0 THEN
INSERT
INTO TICKETS
VALUES (obs_analysed.nPlate, obs_analysed.odatetime, 'S', NULL, NULL, generating_date, NULL, NULL, ticket_fee_maxspeed(obs_analysed.nPlate, obs_analysed.odatetime), owner_ticket, DEFAULT);
END IF;
--si hay infraccion de velocidad DE TRAMO: obs1_veh, obs1_date, tik_type, obs2_veh, obs2_date, sent_date, NULL, NULL, amount, debtor, state
IF ticket_fee_sectspeed(obs_analysed.nPlate, previous_obs_car.odatetime, obs_analysed.odatetime) > 0 THEN
INSERT INTO TICKETS
VALUES (obs_analysed.nPlate, previous_obs_car.odatetime ,'T', obs_analysed.nPlate, obs_analysed.odatetime, generating_date, NULL, NULL, ticket_fee_sectspeed(obs_analysed.nPlate, previous_obs_car.odatetime, obs_analysed.odatetime),owner_ticket, DEFAULT);
END IF;
--si hay infraccion de DISTANCIA: obs1_veh, obs1_date, tik_type, obs2_veh, obs2_date, sent_date, NULL, NULL, amount, debtor, state
IF ticket_fee_distance(obs_analysed.road, obs_analysed.km_point, obs_analysed.direction, obs_analysed.odatetime) > 0 THEN
INSERT INTO TICKETS
VALUES (previous_obs_radar.nPlate, previous_obs_radar.odatetime, 'D', obs_analysed.nPlate, obs_analysed.odatetime, generating_date, NULL, NULL, ticket_fee_distance(obs_analysed.road, obs_analysed.km_point, obs_analysed.direction, obs_analysed.odatetime), owner_ticket, DEFAULT);
END IF;
END LOOP;
CLOSE observs_today;
END;
当我尝试通过这样的未命名块执行时:
DECLARE
x date;
BEGIN
x := TO_DATE('20/05/2009', 'DD/MM/YYYY');
DGT.GENERATE_TICKETS_TODAY(x);
END;
我收到以下执行错误:
我认为这与过程如何获取参数日期并使用它执行 SELECT 查询有关,以便检索具有该日期的所有时间戳。所以,我很想知道如何执行此操作以使其有效。
我基本上需要参考 table OBSERVATIONS 并将所有具有 timestamp 和日期 生成日期的行保存在 CURSOR 中(程序的参数)。请问你能帮帮我吗??谢谢 :)
ORA-01847
错误表示数据转换失败:在您的代码中某处您正在将字符串转换为日期,但日期无效;例如,这会引发错误:to_date('31-FEB-2018')
。
我们可以从您的代码中看到没有调用 to_date()
因此您似乎在某处进行了隐式日期转换。这是一种不好的做法,因为当字符串化日期不是默认格式时,它会使我们面临这些类型的转换错误。
除此之外,我们无能为力:您有 table 结构,您有输入数据,我们没有。这样您就有了调试代码所需的信息。
我也会重复我之前的建议(你拒绝了)。编写一小段代码并使其正常工作。显然,您需要所有代码来提供完整的功能集,但通过逐步构建小的代码单元并将它们链接在一起来构建复杂功能确实要容易得多(而且,违反直觉,更快)。一次编写数百行代码的表观速度在调试整体式应用程序所花费的时间中消失了。
所以:专注于一位说光标。确保有效。然后添加一个插入语句。开始工作。再加一个。重复直到完成。
我正在尝试执行具有以下结构的过程:
PROCEDURE GENERATE_TICKETS_TODAY (generating_date DATE)
IS
CURSOR observs_today
IS
SELECT *
FROM observations
WHERE (EXTRACT(YEAR FROM OBSERVATIONS.odatetime)) = (EXTRACT(YEAR FROM generating_date))
AND (EXTRACT(MONTH FROM OBSERVATIONS.odatetime)) = (EXTRACT(MONTH FROM generating_date))
AND (EXTRACT(DAY FROM OBSERVATIONS.odatetime)) = (EXTRACT(DAY FROM generating_date));
obs_analysed observs_today%ROWTYPE;
previous_obs_car observations%rowtype;
previous_obs_radar observations%rowtype;
owner_ticket VARCHAR2(9);
BEGIN
OPEN observs_today;
LOOP
FETCH observs_today INTO obs_analysed;
EXIT WHEN observs_today%NOTFOUND;
SELECT OWNER into owner_ticket
FROM VEHICLES WHERE nPlate=obs_analysed.nPlate;
previous_obs_car := prev_obs_car(obs_analysed.nPlate, obs_analysed.odatetime);
previous_obs_radar := prev_obs_radar(obs_analysed.odatetime, obs_analysed.road, obs_analysed.km_point, obs_analysed.direction);
--si hay infraccion de velocidad puntual: obs1_veh, obs1_date, tik_type, NULL, NULL, sent_date, NULL, NULL, amount, debtor, state
IF ticket_fee_maxspeed(obs_analysed.nPlate, obs_analysed.odatetime) > 0 THEN
INSERT
INTO TICKETS
VALUES (obs_analysed.nPlate, obs_analysed.odatetime, 'S', NULL, NULL, generating_date, NULL, NULL, ticket_fee_maxspeed(obs_analysed.nPlate, obs_analysed.odatetime), owner_ticket, DEFAULT);
END IF;
--si hay infraccion de velocidad DE TRAMO: obs1_veh, obs1_date, tik_type, obs2_veh, obs2_date, sent_date, NULL, NULL, amount, debtor, state
IF ticket_fee_sectspeed(obs_analysed.nPlate, previous_obs_car.odatetime, obs_analysed.odatetime) > 0 THEN
INSERT INTO TICKETS
VALUES (obs_analysed.nPlate, previous_obs_car.odatetime ,'T', obs_analysed.nPlate, obs_analysed.odatetime, generating_date, NULL, NULL, ticket_fee_sectspeed(obs_analysed.nPlate, previous_obs_car.odatetime, obs_analysed.odatetime),owner_ticket, DEFAULT);
END IF;
--si hay infraccion de DISTANCIA: obs1_veh, obs1_date, tik_type, obs2_veh, obs2_date, sent_date, NULL, NULL, amount, debtor, state
IF ticket_fee_distance(obs_analysed.road, obs_analysed.km_point, obs_analysed.direction, obs_analysed.odatetime) > 0 THEN
INSERT INTO TICKETS
VALUES (previous_obs_radar.nPlate, previous_obs_radar.odatetime, 'D', obs_analysed.nPlate, obs_analysed.odatetime, generating_date, NULL, NULL, ticket_fee_distance(obs_analysed.road, obs_analysed.km_point, obs_analysed.direction, obs_analysed.odatetime), owner_ticket, DEFAULT);
END IF;
END LOOP;
CLOSE observs_today;
END;
当我尝试通过这样的未命名块执行时:
DECLARE
x date;
BEGIN
x := TO_DATE('20/05/2009', 'DD/MM/YYYY');
DGT.GENERATE_TICKETS_TODAY(x);
END;
我收到以下执行错误:
我认为这与过程如何获取参数日期并使用它执行 SELECT 查询有关,以便检索具有该日期的所有时间戳。所以,我很想知道如何执行此操作以使其有效。
我基本上需要参考 table OBSERVATIONS 并将所有具有 timestamp 和日期 生成日期的行保存在 CURSOR 中(程序的参数)。请问你能帮帮我吗??谢谢 :)
ORA-01847
错误表示数据转换失败:在您的代码中某处您正在将字符串转换为日期,但日期无效;例如,这会引发错误:to_date('31-FEB-2018')
。
我们可以从您的代码中看到没有调用 to_date()
因此您似乎在某处进行了隐式日期转换。这是一种不好的做法,因为当字符串化日期不是默认格式时,它会使我们面临这些类型的转换错误。
除此之外,我们无能为力:您有 table 结构,您有输入数据,我们没有。这样您就有了调试代码所需的信息。
我也会重复我之前的建议(你拒绝了)。编写一小段代码并使其正常工作。显然,您需要所有代码来提供完整的功能集,但通过逐步构建小的代码单元并将它们链接在一起来构建复杂功能确实要容易得多(而且,违反直觉,更快)。一次编写数百行代码的表观速度在调试整体式应用程序所花费的时间中消失了。
所以:专注于一位说光标。确保有效。然后添加一个插入语句。开始工作。再加一个。重复直到完成。