我创建了一个函数,该函数返回用户电子邮件是否存在
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%'
我得到结果
这里的帽子错了吗?我在哪里弄错了?
答案 0 :(得分:0)
原因是该函数有误,因为它是用于整个表的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 ( 'example1@z1.goo.com' ) ;
SQL> insert into tb_users ( email ) values ( 'example1@z2.goo.com' ) ;
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>