我在这个 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 函数中做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

我在 Java 中做错了啥二十一点文件计数器?

我在我的代码中做错了啥?

Batch-API:我在这段代码中做错了啥?

我在proguard规则中做错了啥?

我在 Laravel 8 Cors 中做错了啥配置?

我在我的 Angular HTML 模板中做错了啥? [复制]