还剩2页未读,继续阅读
文本内容:
简答题
1.解释FUNCTION,PROCEDURE和PACKAGE区别答存储过程(procedure)存储过程是预先编译好的代码,可以作为PL/SQL语句直接调用执行;过程存储没有返回值;存储过程在规格说明中不包含return语句,即使包含也不起任何作用函数(function)函数可以作为一个表达式的一部分使用;函数必须有返回值;函数在规格说明中必须包含至少一条return语句包(package)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位;包有包头和包体两部分组成;包中可以将一些用于完成某功能的函数和存储过程放进包中可以方便维护
2.什么是序列?如何取得取某个序列的当前值答1)序列是序列号生成器,可以为表中的行生成序列号,产生一组等间隔的系列数值2)先通过调用nextval产生序列的下一个值,再调用currval产生序列的当前值
3.列举出至少三种表约束,各有什么作用?答1)实体完整性约束减少数据的冗余,作用于行,例如主键约束;2)域完整性约束提高数据的准确性,作用于列,check检测;3)引用完整性约束满足数据的一致性,作用于表与表之间,例如外键约束;
4.取当前系统时间点日期(不包括年月)的SQL写法是怎样的?答写法一selectto_charsysdate"ddhh24:mi:ss"fromdual;写法二selectsubstrto_charsysdateYYYYMMDDh24hh:MM:SSfromdual;
5.什么是同义词,分为哪几类?答1)同义词是数据库某些复杂对象的一个别名,用于简化对象访问和提高对象访问的安全性2)同义词分公有和私有两类公有同义词授权用户和system用户可以使用,私有同义词只有建立该同义词的用户才能使用
6.请说明Oracle中存储过程和函数有什么区别,分别如何定义?答存储过程存储过程是预先编译好的代码,可以作为PL/SQL语句直接调用执行;过程存储没有返回值;存储过程在规格说明中不包含return语句,即使包含也不起任何作用Createorreplaceprocedure存储过程名参数名in[输入、默认方式]数据类型,参数名out参数类型AsBegin…………--执行DML操作End;函数函数可以作为一个表达式的一部分使用;函数必须有返回值;函数在规格说明中必须包含至少一条return语句createfunction函数名变量名类型变量名类型return返回类型is变量类型;begin…………--执行部分return返回值;End;
7.什么是角色,如何创建一个角色并把角色赋予指定账户?答1)角色是具有名称的一组相关权限的组合2)创建角色有验证方式和非验证方式两种例如--创建public_role和private_role角色Createrolepublic_rolenotidentified;Createroleprivate_roleidentifiedbyprivate;--给public_role角色授予某些系统权限和对象权限如selectupdateGrantselectupdateonscott.emptopublic_role;3)把角色赋予指定账户的sql语句和直接把某一权限赋予指定账户相似例如--把角色public_role授予给用户wangcaiGrantpublic_roletowangcaiwithadminoption;编程题:
1.编写PL程序块循环给scott.emp表中所有职工增加工资,每次增加100元,直到平均工资高于5000或任一职工的工资超过6000元为止,最后显示出给所有员工一共增加了多少工资DECLARE--声明变量avg_salemp.sal%TYPE;max_salemp.sal%TYPE;v_countnumber:=0;BEGIN--循环遍历loopSELECTAVGsalINTOavg_salFROMemp;SELECTMAXsalINTOmax_salFROMemp;--退出条件判断EXITWHENavg_sal5000ORmax_sal6000;UPDATEempSETsal=sal+100;v_count:=v_count+SQL%ROWCOUNT;ENDLOOP;--打印结果dbms_output.put_line职工工资增加了¥||v_count*100;END;
2.编写一个PL块,定义一个静态游标存储scott.emp表中所有雇员的员empno、ename和sal,并使用循环打印出所有数据declarecursorcur_empisselect*fromemp;--创建一个游标变量v_erowemp%rowtype;--存储结果集每行变量名beginopencur_emp;--打开游标loop--开始遍历游标fetchcur_empintov_erow;exitwhencur_emp%notfound;--打印员工信息dbms_output.put_line员工编号||v_erow.empno||员工姓名||v_erow.ename||员工工资||v_erow.sal;endloop;end;
3.编写一个存储过程upsal接收一个员工号,如果该员工职位是MANAGER,并且在DALLAS工作,那么就给他薪金加15%;如果该员工职位是CLERK,并且在NEWYORK工作,那么就给他薪金扣除5%;其他情况不作处理--创建存储过程CREATEORREPLACEPROCEDUREupsalv_empnoinemp.empno%TYPEASv_jobemp.job%TYPE;v_locdept.loc%TYPE;BEGIN--查询数据SELECTjoblocINTOv_jobv_locFROMempdeptWHEREempno=v_empnoANDemp.deptno=dept.deptno;--显示数据IFv_job=MANAGERANDv_loc=DALLASTHENUPDATEempSETsal=sal*
1.15WHEREempno=v_empno;ELSIFv_job=CLERKANDv_loc=NEWYORKTHENUPDATEempSETsal=sal*
0.95WHEREempno=v_empno;ELSENULL;ENDIF;--异常处理EXCEPTIONWHENOTHERSTHENdbms_output.put_line数据没更新!;END;--调用存储过程DECLAREv_empnoemp.empno%TYPE;BEGINv_empno:=请输入职工号;upsalv_empno;END;
4.编写一个存储过程comSalary,分别统计出scott.emp表中所有部门的平均工资,并且只显示出工资超过3500的部门并编写PL块调用此存储过程--创建存储过程CREATEORREPLACEPROCEDUREcomSalaryASCURSORcurISSELECTdeptnoAVGsalFROMempGROUPBYdeptno;linecur%ROWTYPE;avg_salemp.sal%TYPE;BEGINOPENcur;--打开游标LOOP--开始遍历游标FETCHcurINTOline;EXITWHENcur%NOTFOUND;SELECTAVGsalINTOavg_salFROMempWHEREdeptno=line.deptno;IFavg_sal3500THEN--判断dbms_output.put_lineline.deptno;--打印结果ELSENULL;ENDIF;ENDLOOP;CLOSEcur;--关闭游标END;--调用存储过程BEGINcomSalary;END;。