Plsql PL/SQL学校作业:创建一个程序来验证员工';s出生日期,此过程接受出生日期作为参数

Plsql PL/SQL学校作业:创建一个程序来验证员工';s出生日期,此过程接受出生日期作为参数,plsql,oracle11g,Plsql,Oracle11g,最初的问题是: 这次您创建了一个名为VAL_BDAY_PROC的过程,该过程将验证员工的出生日期。该过程接受出生日期作为参数。然后创建一个名为VALIDATE_BDAY_TRIG的触发器,该触发器调用VAL_BDAY_PROC。通过在EMPLOYEE表中插入一个生日无效的新行来测试触发器。 由于我只是PL/SQL的初学者,所以我尝试通过创建以下过程一步一步地完成这项工作: 尝试执行该过程后,我收到以下错误消息: 非常感谢您的意见,以完成此作业。(注意:我目前正在使用Oracle 11g

最初的问题是:


这次您创建了一个名为VAL_BDAY_PROC的过程,该过程将验证员工的出生日期。该过程接受出生日期作为参数。然后创建一个名为VALIDATE_BDAY_TRIG的触发器,该触发器调用VAL_BDAY_PROC。通过在EMPLOYEE表中插入一个生日无效的新行来测试触发器。 由于我只是PL/SQL的初学者,所以我尝试通过创建以下过程一步一步地完成这项工作:



尝试执行该过程后,我收到以下错误消息:



非常感谢您的意见,以完成此作业。(注意:我目前正在使用Oracle 11g 4.1.4版)


谢谢。

问题在于您将输入参数声明为日期数据类型

这与目的背道而驰:您希望传入一个字符串(VARCHAR2)并在过程中验证该字符串是否表示有效日期(以您正在寻找的特定格式)

So-将
employee_dob
参数的数据类型更改为VARCHAR2


添加了:。。。为了理解你为什么会犯这样的错误:你提交了“12/11/2001”作为输入,但程序预期会有一个日期。由于您没有使用格式模型“DD/MM/YYYY”将字符串包装到TO_DATE中,Oracle尝试使用会话的NLS_DATE_格式,在大多数情况下,默认情况下为“DD-MON-YYYY”(例如,月份显示为NOV)。由于11的格式不是“MON”(月份,不是星期一),因此转换失败,您收到了错误消息。请注意,这甚至发生在尝试执行过程之前,因为首先不可能向其传递有效参数。这就是为什么错误消息不是错误处理块中的消息,而是该错误的一般Oracle消息。

尝试将日期格式更改为“DD-MON-YYYY”

YOUR CODE SHOULD BE :
     chck := TO_DATE(employee_dob, 'DD-MON-YYYY');

FINALLY:
EXEC VAL_BDAY_PROC('12-MON-2001')
例外情况:
尝试使用
'SQLERRM'
获取准确的错误,以便您将来知道如何处理错误

try EXEC VAL_BDAY_PROC(截至日期('12/11/2001','dd/mm/yyyy');Oracle正在尝试将字符串隐式转换为日期,但格式错误。用指定的格式进行显式转换应该可以解决这个问题。'@ShaunPeterson-这几乎否定了整个验证概念,对吗?这不是正确的解决方案。问题在另一个地方,请参阅mathguy的答案。试着理解我的解决方案!!我自己提出了一些其他的解决办法。你的“解决方案”不起作用。运行(例如)
alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss'和你的“解决方案”将粉碎。你知道为什么吗?伙计。。。你对解决方案的看法很全面。这些家伙是pLSQL的初学者,所以处理异常是他未来最好做的事情。。。所以试着教初学者初级水平。尽管你精通任何事情。谢谢你@mathguy。除此之外,是否可以使用触发器函数调用上述过程?我已尝试创建以下触发器:为每行DECLARE v_dob VARCHAR2在插入到EMPLOYEE_T之前创建或替换触发器VALIDATE_BDAY_TRIG;开始插入员工(员工ID、员工姓名、员工地址、员工城市、员工州、员工IP、员工出生日期、员工雇用日期、员工主管)的值(000,‘TESS’、‘非洲’、‘肯尼亚’、‘编号’、‘11285’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、‘截止日期’、455789);v_dob:=VAL_BDAY_PROC(:new.employeebirthdate);结束;并由EXEC VALIDATE\u BDAY\u TRIG运行;但收到以下错误消息:错误(2,10):PLS-00215:字符串长度约束必须在范围(1..32767)错误(7,1):PL/SQL:语句忽略错误(7,10):PLS-00222:此中不存在名为“VAL_BDAY_PROC”的函数scope@Raymond-你不能用EXEC命令执行触发器,你是从哪里想到的?我希望不是从你的老师或教科书@Raymond-实际上,作业非常明确:通过在表中插入新行来测试触发器,而不是使用EXEC包装器运行它。
Error starting at line : 296 in command -
EXEC VAL_BDAY_PROC('12/11/2001')
Error report -
ORA-01843: not a valid month
ORA-06512: at line 1
01843. 00000 -  "not a valid month"
YOUR CODE SHOULD BE :
     chck := TO_DATE(employee_dob, 'DD-MON-YYYY');

FINALLY:
EXEC VAL_BDAY_PROC('12-MON-2001')