我在这个 PLSQL 函数中做错了啥?
Posted
技术标签:
【中文标题】我在这个 PLSQL 函数中做错了啥?【英文标题】:What am i doing wrong in this PLSQL function?我在这个 PLSQL 函数中做错了什么? 【发布时间】:2016-11-27 14:56:00 【问题描述】:我想检查作为输入提供的电子邮件地址是否有效。我创建了以下功能。该函数已成功创建,但是当我尝试运行该函数时,我无法获得所需的输出。
CREATE OR REPLACE FUNCTION email_validate(p_email IN varchar2)
return BOOLEAN
is
emailregexp constant varchar2(1000):= '^[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]1,10$';
BEGIN
IF regexp_like(p_email,emailregexp ,'i') THEN
RETURN true;
ELSE
RETURN false;
END IF;
END;
我尝试检查输出的方式是:
DECLARE
result BOOLEAN;
BEGIN
result:= email_validate('abcd@gmail.com');
dbms_output.put_line(result);
END;
【问题讨论】:
不确定 PLSQL 正则表达式,但您可能应该转义组内的最后一个-
字符
函数已成功创建,但我无法调用该函数,就像我想运行该函数并查看 True 或 False。
"dbms_output.put_line 未重载以接受布尔参数。" ***.com/a/13560073/21336
与您的问题没有直接关系,但您的正则表达式将拒绝有效的电子邮件地址。它会拒绝的最常见的格式是foo+bar@example.com
,但还有很多其他格式。验证电子邮件地址的最佳方法实际上是“甚至不用费心去尝试”,并且没有太多令人信服的论据反对这一点。但与此同时,请阅读***.com/questions/201323/…。
您可能在 cmets 中有足够的信息并已回答以解决您的问题。作为“元”观察,当您寻求帮助时,说“当我尝试运行该功能时我无法获得所需的结果”之类的话是完全没用的。举个例子:这是我要验证的地址,它应该是有效的,但我得到了这个结果。或者,这个地址应该被拒绝,但我看到的结果是“有效”。或类似的事情。 “我的车坏了,怎么了?”在车库里的机会很小。它在在线汽车帮助论坛中没有机会。
【参考方案1】:
您不能将布尔值作为参数传递给dbms_output.put_line
。当我运行你的代码时,我得到了这个错误:
ORA-06550:PLS-00306:调用“PUT_LINE”时参数的数量或类型错误
实用的解决方案是让您的函数返回一个 smallint
(0 或 1),这对于执行您的电子邮件地址验证同样有效。
然后您也可以更轻松地测试您的代码,如下所示:
select email_validate('abcd@gmail.com') from dual;
如果您想将结果显示为“假”或“真”:
select case when email_validate('abcd@gmail.com') > 0
then 'true'
else 'false'
end
from dual;
如果您留在 PL/SQL 中,您也可以使用 boolean
类型来执行此操作(然后跳过 > 0
)。但是 Oracle SQL 无法处理它。
【讨论】:
是的,我可以通过输出 1 或 0 来做到这一点。我问这个问题的原因是我们是否可以通过某种方式输出 True 或 False 来做到这一点? @indexOutOfBounds 如果您计划始终使用 pl/sql “不在 select 语句中”,它将起作用。要使用 dbms_output 对其进行测试,只需执行以下操作: DBMS_OUTPUT.PUT_LINE(CASE WHEN result THEN 'TRUE' ELSE 'FALSE' END)。 我刚试了一下,这个方法就可以了。谢谢你:)以上是关于我在这个 PLSQL 函数中做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章