我创建了一个返回用户电子邮件是否存在的函数
FUNCTION USER_EXISTS(email IN VARCHAR2)
RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
/*userExists*/
BEGIN
OPEN rc FOR
SELECT count(*) as does_user_exist
FROM users
WHERE Email
LIKE '%' || email || '%';
RETURN rc;
END USER_EXISTS;
我注意到的问题是,当我调用这个函数时,我得到的结果是72
用户存在这个电子邮件地址
SELECT USER_PACKAGE.USER_EXISTS('%zl%') FROM DUAL
但是当我调用SELECT
语句时
SELECT COUNT(*) FROM USERS WHERE Email LIKE '%zl%'
我得到结果
这里有什么问题?我哪里做错了?
原因是该函数是错误的,因为它是一个 sys_refcursor 对象,适用于整个表。
该函数中不需要 sys_refcursor 对象,只需正常计数即可。
例子
SQL> create table tb_users ( id number generated by default on null as identity ( start with 1 increment by 1 ) , email varchar2(100) ) ;
SQL> insert into tb_users ( email ) values ( '[email protected]' ) ;
SQL> insert into tb_users ( email ) values ( '[email protected]' ) ;
SQL> commit ;
Table created.
1 row created.
1 row created.
Commit complete.
SQL> select count(*) from tb_users where email like '%z1%' ;
COUNT(*)
----------
1
SQL> create or replace FUNCTION USER_EXISTS(email IN VARCHAR2)
RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
/*userExists*/
BEGIN
OPEN rc FOR
SELECT count(*) as does_user_exist
FROM tb_users
WHERE Email
LIKE '%' || email || '%';
RETURN rc;
END USER_EXISTS;
/
Function created.
SQL> select user_exists('%z1%') from dual ;
USER_EXISTS('%Z1%')
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
DOES_USER_EXIST
---------------
2
rc 为表中的每个记录计数返回 1。因此,您的表中可能有 72 条记录,这就是 72 的原因。
更新
这样的功能在您的场景中会更好地工作
SQL> create or replace FUNCTION USER_EXISTS(pemail IN VARCHAR2) RETURN number
is
rc number;
BEGIN
SELECT count(*) into rc FROM tb_users
WHERE Email
LIKE '%' || pemail || '%';
RETURN rc;
9 END USER_EXISTS;
10 /
Function created.
SQL> select USER_EXISTS(pemail => 'z1') from dual ;
USER_EXISTS(PEMAIL=>'Z1')
-------------------------
1
SQL>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句