数据库系统之Stored PL/SQL function项目练习-2

Stored PL/SQL项目练习-2


关于Stored PL/SQL的介绍可以看我的这篇文章:
https://blog.csdn.net/Jifu_M/article/details/112443652
关于Stored PL/SQL procedure的项目练习可以看我的这篇文章:
https://blog.csdn.net/Jifu_M/article/details/112450422

项目介绍

实现一个存储的PL/SQL函数DEPTPROJECT,它接受一个department number作为参数,并查找该部门持有的所有项目编号、职务和预算,以及该部门中处理该项目的员工编号和姓名。

函数必须返回一个字符串,其中包含部门编号、名称、项目编号、部门的职务和预算,以及部门中每个项目的员工编号和名称。如果一个部门有多个项目,这些项目必须按预算的降序排列。在项目中工作的员工必须按姓名的升序排列。

为所有部门执行存储的PL/SQL函数DEPTPROJECT。样本打印输出的片段如下所示:
在这里插入图片描述
使用SQL * Plus命令来列出包括已处理的所有SQL语句的清单:
SET ECHO ON
SET FEEDBACK ON
SET LINESIZE 100
SET PAGESIZE 200
SET SERVEROUTPUT ON

本项目包含以下表:

CREATE TABLE Project (
	P#		    NUMBER(10)	NOT NULL, /* Project number		*/
	PTitle		VARCHAR2(30)	NOT NULL, /* Project title		*/
	Sponsor		VARCHAR2(30),		  /* Project sponsor name	*/
	D#		    NUMBER(5)	NOT NULL, /* Department number		*/
	Budget		NUMBER(10,2)	NOT NULL, /* Project budget		*/
	CONSTRAINT Project_PK PRIMARY KEY(P#),
	CONSTRAINT Project_FK FOREIGN KEY (D#) REFERENCES Department(D#),
	CONSTRAINT Project_CK UNIQUE (PTitle)
);

CREATE TABLE Department (
	D#		    NUMBER(5)	    NOT NULL, /* Department number		*/
	DName		VARCHAR2(30)	NOT NULL, /* Department name		*/
	Manager#	CHAR(5)		     NOT NULL, /* Department manager number	*/
	MSDate		DATE, 			          /* Manager start date     	*/
	CONSTRAINT Department_PK PRIMARY KEY(D#),
	CONSTRAINT Department_CK UNIQUE(DName)
);

CREATE TABLE WorksOn (
	E#		       CHAR(5)		NOT NULL, /* Employee number		*/
	P#		       NUMBER(10)	NOT NULL, /* Project number		*/
	Hours		   NUMBER(3,1)	NOT NULL, /* Working hours per week	*/
	CONSTRAINT WorksOn_PK PRIMARY KEY(E#, P#),
	CONSTRAINT WorksOn_FK1 FOREIGN KEY(E#) REFERENCES Employee(E#),	
	CONSTRAINT WorksOn_FK2 FOREIGN KEY(P#) REFERENCES Project(P#)
);


CREATE TABLE Dependent (
	E#		     CHAR(5)		   NOT NULL, /* Employee number  		*/
	DName		VARCHAR2(30)	   NOT NULL, /* Dependent name		*/
	Sex		    CHAR,			             /* Dependent sex, M-Male, F-Female */
	DOB		    DATE,			            /* Date of birth		*/
	Relationship	VARCHAR2(10),		    /* Relationship with the employee */
	CONSTRAINT Dependent_PK PRIMARY KEY(E#, DName),
	CONSTRAINT Dependent_FK FOREIGN KEY(E#) REFERENCES Employee(E#),
	CONSTRAINT Dependent_CK CHECK (Relationship IN ('SON', 'DAUGHTER', 'SPOUSE', 'OTHER'))
);

CREATE TABLE Employee (
	E#		     CHAR(5)		NOT NULL, /* Employee number    	*/
	Name		VARCHAR2(30)	NOT NULL, /* Employee name		*/
	DOB	        Date,			          /* Date of birth		*/
	Address		VARCHAR2(50),		      /* Home address		*/
	Sex		     CHAR,			         /* M-Male, F-Female		*/
	Salary		NUMBER(7,2),		      /* Salary			*/
	Super#		CHAR(5),		         /* Supervisor number		*/
	D#		    NUMBER(5), 		         /* Department number		*/
	CONSTRAINT Employee_PK PRIMARY KEY(E#),
	CONSTRAINT Employee_FK1 FOREIGN KEY (Super#) REFERENCES Employee(E#),
	CONSTRAINT Employee_FK2 FOREIGN KEY (D#) REFERENCES Department (D#)
);

项目实现

SET ECHO ON
SET FEEDBACK ON
SET LINESIZE 100
SET PAGESIZE 200
SET SERVEROUTPUT ON

CREATE OR REPLACE FUNCTION DEPTPROJECT (d_num department.d#%TYPE)
RETURN VARCHAR2 IS 
p_num project.p#%TYPE;
p_title project.ptitle%TYPE;
p_budget project.budget%TYPE; 
e_name employee.name%TYPE;
e_num employee.E#%TYPE;
e_dept employee.d#%TYPE;
str VARCHAR2(300);

BEGIN

    FOR z IN (SELECT project.p#, project.ptitle, project.budget INTO p_num,p_title,p_budget
    FROM project WHERE project.d#=d_num ORDER BY budget DESC)
    LOOP
    
    DBMS_OUTPUT.PUT_LINE('  Project: '||z.p#||' '||z.ptitle||' '||z.budget);
    
        FOR x IN(SELECT employee.e#,employee.name,employee.d# INTO e_num,e_name,e_dept
                    FROM employee inner join workson ON employee.e#=workson.e#
                    WHERE workson.p#=z.p# ORDER BY e_name ASC)
        LOOP
        IF e_dept = d_num THEN
        DBMS_OUTPUT.PUT_LINE('      '||x.e#||' '||x.name);
        END IF;
        END LOOP;
        
    END LOOP;   
       
    RETURN str;
    
END;
/

--使用创建的函数
DECLARE
pro_p number;

BEGIN

    FOR y IN (SELECT department.d#,department.dname FROM department ORDER BY d# ASC)
    LOOP
    
        SELECT COUNT(project.p#) INTO pro_p FROM project WHERE d#=y.d#;
        IF pro_p=0 then
                DBMS_OUTPUT.PUT_LINE('Department: '||y.d#||' '||y.dname);
        ELSE 
                DBMS_OUTPUT.PUT_LINE('Department: '||y.d#||' '||y.dname);
                DBMS_OUTPUT.PUT_LINE(DEPTPROJECT (y.d#));
        END IF;
    END LOOP;
    
END;

运行结果如下:

Department: 1 SALES
  Project: 1001 Computation 25000

Department: 2 ACCOUNTING
Department: 3 GAMES
  Project: 1003 Racing car 225000
  Project: 1002 Study methods 15000

Department: 4 HUMAN RESOURCES
Department: 5 SPORTS
  Project: 1005 Swimming 125000
  Project: 1004 Football 35000

Department: 6 COMPUTING
Department: 7 SUPPORT

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值