避免返回多个输出,与Oracle中成员方法的记录计数相同

时间:2017-10-20 07:08:44

标签: oracle object methods oracle11g oracle12c

我实现了一个成员方法来返回db中的记录数。

CREATE or replace TYPE BODY student_t AS    
MEMBER FUNCTION getRecordCount RETURN NUMBER IS
recordCount NUMBER;
BEGIN
    select count(*) into recordCount
    from student s;
    return recordCount;
END;END;/   

但它会多次生成正确的输出,这与记录总数相似。那么如何修改上面的成员函数来显示结果 只有一次?

我按如下方式执行;

select s.getRecordCount() from student s/

3 个答案:

答案 0 :(得分:0)

我认为你想要制作的是:

CREATE or REPLACE FUNCTION getRecordCount RETURN NUMBER IS
    recordCount NUMBER;
BEGIN
    select count(1) into recordCount from student s;
   return recordCount;
END;
/

SQL> select getRecordCount from dual;

那是不是?

答案 1 :(得分:0)

您的执行应包含DISTINCT子句:

SELECT  DISTINCT S.GETRECORDCOUNT() FROM STUDENT S;

这是因为当您创建对象类型的表时,对于表中的每一行,都会调用成员函数,因此您将获得多个实例(因为表中有多行)。

参见演示:

CREATE OR REPLACE TYPE student_t AS OBJECT
(
    col1 varchar2(100),
     MEMBER FUNCTION getRecordCount
      RETURN NUMBER
);
/

CREATE OR REPLACE TYPE BODY student_t
AS
   MEMBER FUNCTION getRecordCount
      RETURN NUMBER
   IS
      recordCount   NUMBER;
   BEGIN
      SELECT  COUNT (*)
        INTO recordCount
        FROM student s ;        

      RETURN recordCount;
   END;
END;
/

--table created of Object type
CREATE TABLE STUDENT OF STUDENT_T

编辑:    填充表:

SQL> Select * from STUDENT;

COL1
--------------------------------------------------------------------------------
XXX
YY
XXX

执行:

SQL> SELECT  DISTINCT S.GETRECORDCOUNT() FROM STUDENT S;

S.GETRECORDCOUNT()
------------------
                 3

答案 2 :(得分:0)

你错误地滥用了对象的概念。

您创建一个对象来代表学生。因此,获取数据的成员函数应该为您提供有关学生的信息。

但是你要求对象提供有关大学的信息,或者其他任何信息,即它包含的学生数量。

学生没有可以检索的计数。大学等。所以你需要另一个对象。然后,您可以选择每所大学(或班级或学校,无论您的目标是什么)的学生计数:

select u.get_student_count() from university u;