我实现了一个成员方法来返回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/
答案 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;