为什么我从同一个查询中得到两个不同的结果

时间:2020-08-26 08:24:40

标签: oracle plsql

我创建了一个函数,该函数返回用户电子邮件是否存在

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

enter image description here

但是当我像这样叫SELECT陈述时

SELECT COUNT(*) FROM USERS WHERE Email LIKE '%zl%'

我得到结果

enter image description here

这里的帽子错了吗?我在哪里弄错了?

1 个答案:

答案 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>