Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何验证作为参数PL/SQL给定的YYYYMMDD日期_Sql_Oracle_Validation_Date_Plsql - Fatal编程技术网

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

如何验证作为参数PL/SQL给定的YYYYMMDD日期,sql,oracle,validation,date,plsql,Sql,Oracle,Validation,Date,Plsql,我有一个SP,名为ADD_COMPLEX_SALE。它获取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 := CONV

我有一个SP,名为ADD_COMPLEX_SALE。它获取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 rements而不是rem或!=或~=>=
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年,等等)您可以在转换日期后执行此操作。

我需要提前提出异常,如何将其合并到IF语句中?现在获取以下错误代码:添加复杂销售-客户ID:10产品ID:2001日期:20140301数量:60 ORA-20000:发生另一个错误ORA-01861:文字与表单不匹配在string@RietteJooste-当其他人时,应该有一个
。我正在考虑将字符串转换为数字而不是日期。您不应该将日期存储或传递为
varchar
。将参数声明为
date
是一种更干净的方法。我认为只有一个异常处理程序就足够了。
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;
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;