Oracle 11g数据库基础教程(第2版)-课后习题-第十一章

--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;
/
--增加权限或者切换用户到超级管理员
BEGIN
 create_table('test2','sno','number');
END;
/
 --检查表字段
 desc test1
--4 创建一个存储过程,将某个表的SELECT权限授予某个用户
create or replace procedure grant_p(p_table VARCHAR2,p_username VARCHAR2)
AS
	str VARCHAR2(100);
BEGIN
	str:='grant select on ' || p_table || ' TO ' || p_username;
	EXECUTE IMMEDIATE str;--立即执行
END;
/
BEGIN
 grant_p('user_tablespaces','scott');
end;
/

--5	创建一个存储过程,以员工号为参数删除该员工。
create or replace procedure delete_e(p_no varchar2)
AS
	str varchar2(100);
BEGIN	
	str:='delete from emp where empno=' || p_no;
	EXECUTE IMMEDIATE str;
end;
/
BEGIN
 delete_e(7839);
end;
/

--6创建一个存储过程,
--参数为员工号、列名、值,实现对特定员工信息中特定列信息的修改。
create or replace procedure test(p_col varchar2,p_value varchar2,p_no varchar2)
AS
	str varchar2(100);
begin
	str:='update emp set ' || p_col || '=:ph_value where empno=:ph_empno';
	EXECUTE IMMEDIATE str using p_value,p_no;
end;
/
begin
	test('sal','8000','2010');
end;
/
--7
SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE QUERY_EMP(
P_COL VARCHAR2, P_VALUE VARCHAR2)
as
  V_NAME  EMP.ENAME%TYPE;
--  V_LNAME  EMPLOYEES.LAST_NAME%TYPE;
  V_EMPNO  EMP.EMPNO%TYPE;
  V_DEPTNO EMP.DEPTNO%TYPE;
  V_SAL    EMP.SAL%TYPE;
  V_STR    VARCHAR2(200);
BEGIN
  V_STR:='SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP WHERE '||P_COL||'=:PH_VALUE';
  EXECUTE IMMEDIATE V_STR INTO V_EMPNO,V_NAME,V_SAL,V_DEPTNO USING P_VALUE;
  DBMS_OUTPUT.PUT_LINE(V_EMPNO||' '||V_NAME||' '||V_SAL||' '||V_DEPTNO);
END;
/
--8 创建一个存储过程,参数为列名、值,根据部门号或部门名称查询部门信息
set SERVEROUTPUT on
CREATE OR REPLACE PROCEDURE QUERY_EMP2(P_COL VARCHAR2, P_VALUE VARCHAR2)
as
	V_DEPT dept%ROWTYPE;
	V_STR    VARCHAR2(200);
BEGIN
	V_STR:='SELECT * FROM dept WHERE '||P_COL ||'=:PH_VALUE';
	EXECUTE IMMEDIATE V_STR INTO V_DEPT USING P_VALUE;
	DBMS_OUTPUT.PUT_LINE(V_DEPT.deptno||' '||V_dept.dname);
END;
/
BEGIN
	QUERY_EMP2('deptno','10');
end;
/

--9 创建一个存储过程,根据参数查询符合特定条件的员工信息
--(如根据工资查询、部门号查询、入职时间等)

set SERVEROUTPUT on
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  EMP.EMPNO%TYPE;
	V_NAME   EMP.ENAME%TYPE;
	V_SAL    EMP.SAL%TYPE;
	V_DEPTNO EMP.DEPTNO%TYPE;   
BEGIN
	LV_QUERY:='SELECT empno,ename,SAL,DEPTNO FROM EMP WHERE '||P_COL||P_CONDITION||':PH_VALUE';
	OPEN V_CURSOR FOR LV_QUERY USING P_VALUE;    
	LOOP
    FETCH V_CURSOR INTO V_EMPNO,V_NAME,V_SAL,V_DEPTNO ;
    EXIT WHEN V_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_EMPNO||' '||V_NAME||' '||V_SAL||' '||V_DEPTNO);
  END LOOP;
END;
/

BEGIN
	MULTI_QUERY('sal','>','1000');
end;
/

你可能感兴趣的:(Oracle,11g)