如何验证作为参数 PL/SQL 给出的 YYYYMMDD 日期

Posted

技术标签:

【中文标题】如何验证作为参数 PL/SQL 给出的 YYYYMMDD 日期【英文标题】:How to validate YYYYMMDD date given as parameter PL/SQL 【发布时间】:2015-09-06 05:33:17 【问题描述】:

我有一个名为 ADD_COMPLEX_SALE 的 SP。它有 4 个参数:custid、prod id、qty 和 date(varchar2)。

我需要验证日期并检查其格式是否正确。它以 YYYYMMDD 的形式发送到过程。

这是我目前所拥有的:

IF (LENGTH(pdate) != 8) THEN
    raise_application_error (-20093,' Date not valid');
ELSIF (LENGTH(pdate) = 8)THEN
    vDATE := CONVERT(VARCHAR(10), pdate(), 111) AS [YYYY/MM/DD];
  END IF;

IF (pdate != 'YYYY/MM/DD') THEN
    raise_application_error (-20093,' Date not valid');
  END IF; 

基本上,这个想法也将其转换为“真实”日期格式,以便我可以确定它的格式正确。除了我得到这个错误。 仍然是非常新的 pl/sql,因此我们将不胜感激。

错误(42,49):PLS-00103:在预期以下情况之一时遇到符号“AS”:。 ( * % & = - + ; at in is mod rest not rem or != or ~= >= and or like2 like4 likec between || multiset member submultiset

更新:

将代码更改为以下内容:

 vDATE := TO_DATE(pdate, 'yyyymmdd');
 IF (pdate != vDATE) THEN
   raise_application_error (-20093,' Date not valid');
 END IF;
 IF (LENGTH(vDATE) != 8) THEN
    raise_application_error (-20093,' Date not valid');
 END IF;

现在出现这个错误:

ORA-20000:发生另一个错误 ORA-01861:文字与格式字符串不匹配

编辑:上次更新错误是由于参数为 varchar2 而我忘记在转换完成后插入 vDATE 而不是 pdate。

【问题讨论】:

您不应将日期存储或传递为varchar。将参数声明为 date 是一种更简洁的方法 【参考方案1】:

convert(varchar(10), pdate(), 111) 似乎是在尝试使用 SQL Server convert 函数。这在 Oracle 中是行不通的。

我会做类似的事情

DECLARE
  l_dt date;
BEGIN
  l_dt := to_date( pdate, 'yyyymmdd' );
EXCEPTION
  WHEN others
  THEN
    raise_application_error( -20001, pdate || ' is not a date in the format YYYYMMDD' );
END;

当然,如果您想进行多项检查,以便在长度不正确时抛出不同的异常,或者添加一些检查以确保日期合理(即必须在过去 100 年内或不超过100 年后等)您可以在 to_date 转换后执行此操作。

【讨论】:

当我需要尽早提出异常时,如何将其合并到 IF 语句中? 现在获取以下错误代码:添加复杂销售 - 客户 ID:10 产品 ID:2001 日期:20140301 数量:60 ORA-20000:发生另一个错误 ORA-01861:文字没有匹配格式字符串 @RietteJooste - 应该有一个when others。我正在考虑将字符串转换为数字而不是日期。【参考方案2】:
CREATE PROCEDURE DATECHECK(pdate VARCHAR2) AS
err_date EXCEPTION;
vdate DATE;
BEGIN

BEGIN
      vdate := to_date(pdate,'yyyymmdd');
      EXCEPTION
        WHEN OTHERS THEN
          RAISE err_date;
    END;

EXCEPTION
  WHEN err_date THEN
    raise_application_error(-20090, 'DATE ERROR');
END;

【讨论】:

我认为只有一个异常处理程序就足够了。

以上是关于如何验证作为参数 PL/SQL 给出的 YYYYMMDD 日期的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?

如何在 PL/SQL CURSOR 中将参数作为输入?

如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?

Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?

在 PL/SQL 存储过程中将表作为参数传递

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数