首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在按日期查找行时遇到困难,将日期作为参数

在按日期查找行时遇到困难,将日期作为参数
EN

Stack Overflow用户
提问于 2018-04-14 17:35:08
回答 1查看 54关注 0票数 0

我正在尝试执行一个具有以下结构的过程:

代码语言:javascript
复制
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;

当我通过未命名的块尝试执行时,如下所示:

代码语言:javascript
复制
DECLARE
   x date;
BEGIN
   x := TO_DATE('20/05/2009', 'DD/MM/YYYY');
    DGT.GENERATE_TICKETS_TODAY(x);
END; 

我得到以下执行错误:

我认为这与过程如何获取参数日期和如何执行SELECT查询有关,以便检索所有具有该日期的时间戳。所以,我很想知道该怎么做才能让它发挥作用。

基本上,我需要查阅表的观察结果,并将具有时间戳和日期生成日期(过程的参数)的所有行保存在光标中。你能帮帮我吗??谢谢您:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-15 10:14:50

ORA-01847错误表示数据转换失败:在代码中的某个地方,您正在将字符串转换为日期,但日期无效;例如,这将抛出该错误:to_date('31-FEB-2018')

我们可以看到您的代码中没有对to_date()的调用,因此似乎在某个地方有一个隐式日期转换。这正是错误的做法,因为当字符串化日期不是默认格式时,它会将我们暴露在这类转换错误中。

除此之外,我们在这里无能为力:您有表结构,您有输入数据,我们没有,所以您有调试代码所需的信息。

我也会重复我以前的建议(你拒绝了)。编写一小部分代码并使其正常工作。显然,您需要所有的代码来交付完整的特性,但是通过增量构建小代码单元并将它们连接在一起,构建复杂的功能实际上要容易得多(而且反直觉地说,更快)。在调试monolith的过程中,数百行代码的明显编写速度一下子就消失了。

所以:集中在一点上,比如光标。一定要做到这一点。然后添加一个insert语句。让它起作用。再加一个。重复直到完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49834294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档