视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PL/SQL的面向对象编程
2020-11-09 16:12:14 责编:小采
文档


一切都是对象,世间万事万物都是对象,我们可以利用PL/SQL来实现面向对象的功能,让程序能够具有更好的性能和可读性 无 CREATE OR REPLACE TYPE liao_opp_test AS OBJECT(-- Author : HAND-- Created : 2013/1/5 16:44:20-- Purpose : -- Attributes mail_ho

一切都是对象,世间万事万物都是对象,我们可以利用PL/SQL来实现面向对象的功能,让程序能够具有更好的性能和可读性

<无> $velocityCount-->
CREATE OR REPLACE TYPE liao_opp_test AS OBJECT
(
-- Author : HAND
-- Created : 2013/1/5 16:44:20
-- Purpose : 

-- Attributes
 mail_host VARCHAR2(20),
 mail_port INTEGER,

-- Member functions and procedures
 MEMBER PROCEDURE sent_mail,
 MEMBER FUNCTION get_address(i NUMBER) RETURN VARCHAR2
)

CREATE OR REPLACE TYPE BODY liao_opp_test IS

 -- Member procedures and functions
 MEMBER PROCEDURE sent_mail IS
 BEGIN
 dbms_output.put_line('send email success to ' || self.mail_host || ':' ||
 self.mail_port);
 END sent_mail;

 MEMBER FUNCTION get_address(i NUMBER) RETURN VARCHAR2 IS
 BEGIN
 RETURN i || '. ' || self.mail_host || ':' || self.mail_port;
 END get_address;
END;

DECLARE
 --init Object’s Attributes
 t liao_opp_test := liao_opp_test('192.168.1.1', 8080);
BEGIN
 t.sent_mail;

END;

create table cux_liao_opp_test of liao_opp_test;
insert into cux_liao_opp_test(mail_host,mail_port) values('192.168.1.1',8081);
insert into cux_liao_opp_test(mail_host,mail_port) values('192.168.1.2',8082);
insert into cux_liao_opp_test(mail_host,mail_port) values('192.168.1.3',8083);
insert into cux_liao_opp_test(mail_host,mail_port) values('192.168.1.4',8084);
insert into cux_liao_opp_test(mail_host,mail_port) values('192.168.1.5',8085);
insert into cux_liao_opp_test(mail_host,mail_port) values('192.168.1.6',8086);

SELECT lot.mail_host, lot.mail_port, lot.get_address(1)
 FROM cux_liao_opp_test lot

--上面的是不能派生子类的,下面的是可以派生子类的
CREATE OR REPLACE TYPE cux_person AS OBJECT
(
 p_name VARCHAR2(50),
 p_sex VARCHAR2(2),
 p_age INT,

 MEMBER FUNCTION get_person RETURN VARCHAR2
)
NOT FINAL;

CREATE OR REPLACE TYPE BODY cux_person IS
 MEMBER FUNCTION get_person RETURN VARCHAR2 IS
 BEGIN
 RETURN self.p_name || ',' || self.p_sex || ',' || self.p_age;
 END get_person;
END;

CREATE OR REPLACE TYPE cux_student UNDER cux_person
(

 stuid NUMBER,

 MEMBER FUNCTION get_student RETURN VARCHAR2
)
;
CREATE OR REPLACE TYPE BODY cux_student IS
 -- Member procedures and functions
 MEMBER FUNCTION get_student RETURN VARCHAR2 IS
 BEGIN
 RETURN self.stuid || '.' || self.get_person;
 END get_student;

END;
drop TYPE cux_student;
drop TYPE cux_person;

drop table cux_stuInfo;
create table cux_stuInfo of cux_student;

insert into cux_stuInfo(p_Name,p_Sex,p_Age,Stuid) values('阿呆','B',18,1);
insert into cux_stuInfo(p_Name,p_Sex,p_Age,Stuid) values('阿傻','G',19,2);
insert into cux_stuInfo(p_Name,p_Sex,p_Age,Stuid) values('阿笨','G',12,3);

select cs.p_name,cs.p_sex,cs.p_age,cs.get_person(),cs.get_student() from cux_stuInfo cs;
--ref(表别名)函数用来返回对象的OID,也就是对象标识符,对象表也有rowid
select ref(cs) from cux_stuInfo cs;

--创建学生分数表,注意外键
drop table cux_stuScore;
create table cux_stuScore (
 stu ref cux_student, --stu这一列的值必须出现在stuInfo表中,
 --且stu这一列存的对象的OID而不是对象本身,对这个列的操作都是基于OID来的 
 score int --分数
 ); 
insert into cux_stuScore(Stu,Score) select ref(s),round(dbms_random.value(20,40)) + 70 from cux_stuInfo s;

select * from cux_stuScore;

--deref(列名)函数可以把OID还原为对象,主键列显示有问题
select deref(s.stu) from cux_stuscore s;

下载本文
显示全文
专题