当前位置: 首页 > 知识库问答 >
问题:

oracle绑定变量存储日期,返回的标识符必须声明为错误

龙华翰
2023-03-14

我试着按照步骤在Toad中运行以下代码
1。初始化变量2并为其分配日期。打印出来确认3。然后使用变量检查日期范围的my when子句<你知道我做错了什么吗?

variable this_day varchar2(30);
exec :this_day := "01/01/2018";
--print to_date(:this_day, 'dd/mm/yyyy'); taking this out. print doesn't work with to_date()
select  to_date(:this_day, 'dd/mm/yyyy') from dual ; 

--检查我的time子句

--检查:this_day之间(2018年4月1日至2018年12月1日)

select sysdate,
 case  
    when to_date(:this_day, 'dd/mm/yyyy')  between to_date('01/04/' || EXTRACT(year FROM sysdate), 'DD/MM/YYYY') and to_date('31/12/' || EXTRACT(year FROM sysdate), 'DD/MM/YYYY') then to_char('01/01/'|| EXTRACT(year FROM sysdate))
when to_date(:this_day, 'dd/mm/yyyy') between to_date('01/01' || EXTRACT(year FROM sysdate), 'DD/MM/YYYY') and to_date('01/04/' || EXTRACT(year FROM sysdate), 'DD/MM/YYYY') then to_char('01/01/'|| EXTRACT(year FROM sysdate)-1)
 end  as reporting_date_from 
 from dual ;   

ORA-06550:第1行,第21列:PLS-00201:标识符“01-JAN-2018”必须声明ORA-06550:第1行,第7列:PL/SQL:忽略语句

更新:何时子句ORA-01722中的错误:无效数字

共有1个答案

夏侯衡
2023-03-14

您收到的无效数字错误是由于查询的以下部分引起的:

to_char('01/01/'|| EXTRACT(year FROM sysdate)-1)

先进行连接,然后进行减法运算,因为“2018年1月0日”不是数字,所以会出现错误。

您必须使用括号来确保先从日期中减去,然后进行连接,即。

to_char('01/01/'|| (EXTRACT(year FROM sysdate)-1))

然而,通过使用with子句来创建一些测试数据,可以更好地完成整个方法,例如:

WITH dates AS (SELECT to_date('01/04/2018', 'dd/mm/yyyy') this_day FROM dual UNION ALL
               SELECT to_date('31/03/2018', 'dd/mm/yyyy') this_day FROM dual UNION ALL
               SELECT to_date('02/04/2018', 'dd/mm/yyyy') this_day FROM dual UNION ALL
               SELECT to_date('16/06/2018', 'dd/mm/yyyy') this_day FROM dual UNION ALL
               SELECT to_date('03/04/2017', 'dd/mm/yyyy') this_day FROM dual UNION ALL
               SELECT to_date('31/03/2017', 'dd/mm/yyyy') this_day FROM dual UNION ALL
               SELECT to_date('30/12/2016', 'dd/mm/yyyy') this_day FROM dual)
select this_day,
       sysdate,
       case
         when this_day between to_date('01/04/' || extract(year from sysdate), 'dd/mm/yyyy') and
              to_date('31/12/' || extract(year from sysdate), 'dd/mm/yyyy') then
          to_char('01/01/' || extract(year from sysdate))
         when this_day between to_date('01/01' || extract(year from sysdate), 'dd/mm/yyyy') and
              to_date('01/04/' || extract(year from sysdate), 'dd/mm/yyyy') then
          to_char('01/01/' || (extract(year from sysdate) - 1))
       end as reporting_date_from,
       case WHEN trunc(this_day, 'yyyy') = trunc(sysdate, 'yyyy') THEN trunc(add_months(this_day, -3), 'yyyy') END as reporting_date_from2,
       trunc(add_months(this_day, -3), 'yyyy') reporting_date_from3,
       add_months(trunc(add_months(this_day, -3), 'yyyy'), 3) reporting_date_from4
from   dates;

THIS_DAY    SYSDATE     REPORTING_DATE_FROM                            REPORTING_DATE_FROM2 REPORTING_DATE_FROM3 REPORTING_DATE_FROM4
----------- ----------- ---------------------------------------------- -------------------- -------------------- --------------------
01/04/2018  12/04/2018  01/01/2018                                     01/01/2018           01/01/2018           01/04/2018
31/03/2018  12/04/2018  01/01/2017                                     01/01/2017           01/01/2017           01/04/2017
02/04/2018  12/04/2018  01/01/2018                                     01/01/2018           01/01/2018           01/04/2018
16/06/2018  12/04/2018  01/01/2018                                     01/01/2018           01/01/2018           01/04/2018
03/04/2017  12/04/2018                                                                      01/01/2017           01/04/2017
31/03/2017  12/04/2018                                                                      01/01/2016           01/04/2016
30/12/2016  12/04/2018                                                                      01/01/2016           01/04/2016

这样做意味着您可以一次性测试一系列日期,而不必不断更新要测试的值。如果需要,可以添加更多行以获取更多测试用例。

我还介绍了一些计算报告日期的其他方法;最后一个是我认为报告日期应该是什么(即,如果日期在4月1日之后,那么报告日期是该年的4月1日,否则是前一年的4月1日)。和他们一起玩吧,看看他们是否做了你想做的事。

 类似资料:
  • 所以我一直有这个错误,我不知道发生了什么。我在谷歌上搜索了一下,读了一些关于这个错误的问题,但什么都没用。我只想运行它,这样我就可以完成我的项目。 错误:开始低库存;结束;*第1行错误:ORA-06550:第1行,第9列:PLS-00201:标识符“LOWINVENTORY”必须声明ORA-06550:第1行,第7列:PL/SQL:忽略语句 编辑: 表创建:

  • 这是我成功的存储过程 这是首先生成表的调用 最初,我试图用一些预定义的参数调用存储过程。 这导致错误“PLS-00201:标识符'B100'必须声明” 我是PL/SQL的新手,很难解决这个问题。我尝试添加DECLARE语句 这仍然会导致错误“PLS-00201:必须声明标识符‘B100’”,但它表示“PL/SQL:忽略语句”,然后表示“PLS-00201:必须声明标识符‘Steve’” 进一步挖掘

  • 错误消息: [Microsoft][ODBC驱动程序for Oracle][Oracle]ORA-06550:第1行,第7列:PLS-00201:标识符STORED_PROCEDURE必须声明ORA-06550:第1行,第7列:PL/SQL:语句被忽略

  • 我正在使用SODA for Java存储和检索Oracle12c DB中的文档。我正在效仿这个例子。 这一例外背后的原因将是什么?

  • 作为标题,我正在Oracle上编写一些存储过程,首先我检查了版本 有结果 ... 并尝试NVL2与常规SQL查询 结果似乎是对的 ... 所以我确认11g确实支持NLV2功能,我现在可以开始编写我的存储过程,如下所示: Oracle告诉我它编译有错误,即 PLS-00201:必须声明标识符“NVL2” 为什么函数在常规查询中工作,但在存储过程中变得未声明?