Oracle11g数据库基础教程课后习题答案(7)

2018-12-08 20:59

create or replace trigger trg_after after update of salary on employees declare

v_maxsal employees.salary%type; v_minsal employees.salary%type; begin

select max(salary),min(salary) into v_maxsal,v_minsal from employees where department_id=pkg_10.v_deptno;

dbms_output.put_Line(v_minsal||' '||v_maxsal||pkg_10.v_newsal); if pkg_10.v_newsalv_maxsal then raise_application_error(-20001,'beyond'); dbms_output.put_Line('beyond'); end if; end;

(10)创建一个存储过程,以一个整数为参数,输出工资最高的前几个员工的信息。 Create or replace procedure pro_emp(p number) As

Cursor c_emp is

Select * from employee where salary is not null and rownum<=p order by salary desc; Begin

For v in v_Emp loop

Dbms_output.put_line(v.employee_id||v.salary||v.department_id); End loop; End;

第11章 PL/SQL高级应用

实训题

(1) 将employees表中所有员工信息存储到一个嵌套表变量中,输出该嵌套表中所

有工资大于10000元的元素。

DECLARE

CURSOR ALL_EMPS IS SELECT * FROM EMPLOYEES;

TYPE T_EMPNESTED IS TABLE OF EMPLOYEES%ROWTYPE; V_EMP T_EMPNESTED :=T_EMPNESTED(); INDEXVALUE BINARY_INTEGER :=1; BEGIN

FOR EMP IN ALL_EMPS LOOP V_EMP.EXTEND;

V_EMP(INDEXVALUE):=EMP; INDEXVALUE:=INDEXVALUE+1; END LOOP;

FOR I IN 1..V_EMP.COUNT LOOP IF V_EMP(I).SALARY>10000 THEN

DBMS_OUTPUT.PUT_LINE(V_EMP(I).EMPLOYEE_ID||''||V_EMP(I).FIRST_NAME ||’'||EMP(I).LAST_NAME||''||V_EMP(I).SALARY||'' ||V_EMP(I).DEPARTMENT_ID); END IF; END LOOP; END;

(2) 将departments表中所有部门信息存储到一个可变数组变量中,输出该可变数

组中元素的个数及所有元素。

DECLARE

CURSOR C_DEPT IS SELECT * FROM DEPARTMENTS;

TYPE T_DEPT IS VARRAY(200) OF DEPARTMENTS%ROWTYPE; V_DEPT T_DEPT :=T_DEPT();

INDEXVALUE BINARY_INTEGER :=1; BEGIN

FOR V IN C_DEPT LOOP V_DEPT.EXTEND;

V_DEPT(INDEXVALUE):=V; INDEXVALUE:=INDEXVALUE+1;

END LOOP;

FOR I IN 1..V_DEPT.LAST LOOP

DBMS_OUTPUT.PUT_LINE(V_DEPT(I).DEPARTMENT_ID||’ ‘||V_DEPT(I).DEPARTMENT_NAME||’ ‘||V_DEPT(I).LOCATION); END LOOP;

DBMS_OUTPUT.PUT_LINE(V_DEPT.COUNT); END;

(3) 创建一个存储过程,以表名和一个列名为参数,创建一个表。

CREATE OR REPLACE PROCEDURE CREATE_TABLE(

P_TABLENAME VARCHAR2, P_COL1 VARCHAR2, P_COL1_TYPE VARCHAR2) AS

V_CREATION VARCHAR2(100); BEGIN

V_CREATION:='CREATE TABLE '||P_TABLENAME||'('|| P_COL1||' '|| P_COL1_TYPE||' PRIMARY KEY'; EXECUTE IMMEDIATE V_CREATION; END;

(4) 创建一个存储过程,将某个表的SELECT权限授予某个用户。

CREATE OR REPLACE PROCEDURE GRANT_PRIV(

P_TABLENAME VARCHAR2,P_USERNAME VARCHAR2) AS

SQL_STR VARCHAR2(100); BEGIN

SQL_STR:='GRANT SELECT ON '||P_TABLENAME ||' TO '||P_USERNAME; EXECUTE IMMEDIATE SQL_STR; END;

(5) 创建一个存储过程,以员工号为参数删除该员工。

(6) 创建一个存储过程,参数为员工号、列名、值,实现对特定员工信息中特定列

信息的修改。

CREATE OR REPLACE PROCEDURE DYN_DML_TEST(

P_COL VARCHAR2, P_VALUE VARCHAR2,P_EMPNO NUMBER) IS

V_STR VARCHAR2(100); BEGIN

V_STR:='UPDATE EMP SET '||P_COL||

'=:PH_VALUE WHERE EMPLOYEE_ID=:PH_ EMPNO';

EXECUTE IMMEDIATE V_STR USING P_VALUE,P_EMPNO;

END;

(7) 创建一个存储过程,参数为列名、值,查询该员工信息。

CREATE OR REPLACE PROCEDURE QUERY_EMP( P_COL VARCHAR2, P_VALUE VARCHAR2) IS

V_FNAME EMPLOYEES.FIRST_NAME%TYPE; V_LNAME EMPLOYEES.LAST_NAME%TYPE; V_EMPNO EMPLOYEES.EMPLOYEE_ID%TYPE; V_DEPTNO EMPLOYEES.DEPARTMENT_ID%TYPE; V_SAL EMPLOYEES.SALARY%TYPE; V_STR VARCHAR2(200); BEGIN

V_STR:='SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY,DEPARTMENT_ID FROM EMPLOYEES WHERE '||P_COL ||'=:PH_VALUE';

EXECUTE IMMEDIATE V_STR INTO V_EMPNO,V_FNAME,V_LNAME,V_SAL,V_DEPTNO USING P_VALUE;

DBMS_OUTPUT.PUT_LINE(V_EMPNO||' '||V_FNAME||' '||V_LNAME||' '||V_SAL|| ' '||V_DEPTNO); END;

(8) 创建一个存储过程,参数为列名、值,根据部门号或部门名称查询部门信息。

CREATE OR REPLACE PROCEDURE QUERY_EMP( P_COL VARCHAR2, P_VALUE VARCHAR2) IS

V_DEPT DEPARTMTENTS%ROWTYPE; V_STR VARCHAR2(200); BEGIN

V_STR:='SELECT * FROM DEPARTMENTS WHERE '||P_COL ||'=:PH_VALUE'; EXECUTE IMMEDIATE V_STR INTO V_DEPT USING P_VALUE; DBMS_OUTPUT.PUT_LINE(V_DEPT.DEPARTMENT_ID||' '||

V_dept.department_name);

END;

(9) 创建一个存储过程,根据参数查询符合特定条件的员工信息(如根据工资查询、

部门号查询、入职时间等)。

CREATE OR REPLACE PROCEDURE MULTI_QUERY(

P_COL VARCHAR2,P_CONDITION VARCHAR2,P_VALUE VARCHAR2) AS

TYPE T_CURSOR IS REF CURSOR; V_CURSOR T_CURSOR;

LV_QUERY VARCHAR2(200);

V_EMPNO EMPLOYEES.EMPLOYEE_ID%TYPE; V_FNAME EMPLOYEES.FIRST_NAME%TYPE; V_LNAME EMPLOYEES.LAST_NAME%TYPE; V_SAL EMPLOYEES.SALARY%TYPE;

V_DEPTNO EMPLOYEES.DEPARTMENT_ID%TYPE; BEGIN

LV_QUERY:='SELECT MPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY,DEPARTMENT_ ID FROM EMPLOYEES WHERE '||P_COL||P_CONDITION||':PH_VALUE'; OPEN V_CURSOR FOR LV_QUERY USING P_VALUE; LOOP

FETCH V_CURSOR INTO V_EMPNO,V_FNAME,V_LNAME,V_SAL,V_DEPTNO ; EXIT WHEN V_CURSOR%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(V_EMPNO||' '||V_FNAME||' '||V_LNAME||' '||V_SAL|| ' '||V_DEPTNO); END LOOP; END;

(10)创建一个包,实现对HUMAN_RESOURCE数据库中数据进行分页查询。 略


Oracle11g数据库基础教程课后习题答案(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《中国注册会计师审计准则第1521号—注册会计师对其他信息的责任

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: