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_newsal
(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数据库中数据进行分页查询。 略