我有一个名为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。
答案 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;