如何验证作为参数 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 变量值检查输入参数值是不是存在作为列表?
如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?