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

时间:2015-09-06 05:33:17

标签: sql oracle validation date plsql

我有一个名为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 mod mod not rem<>或!=或〜=> =< =<>和/或类似like2 like4 likec之间的|| multiset成员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。

2 个答案:

答案 0 :(得分: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年)未来100年,等等。您可以在to_date转换后执行此操作。

答案 1 :(得分:1)

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;