plsql习题
Oracle PLSQL测试题与答案(绝对经典)

Oracle PL/SQL测试题姓名:___ _________一、选择题1、Oracle数据库中为新创建的表分配的初始空间通常为多大(B)A、一个块B、一个区C、一个段D、c一个表空间2、关于存储过程参数,正确的说法是(B)A、存储过程的输出参数可以是标量类型,也可以是表类型B、存储过程输入参数可以不输入信息而调用过程C、可以指定字符参数的字符长度(函数的()或者过程的(number/varchar2))D、以上说法都不对3、下列说法,正确的说法是(B)A、只要在存储过程中有增删改语句,一定加自治事务B、在函数内可以修改表数据C、函数不能递归调用D、以上说法都不对4、有一产品表(编号,名称,价格,数量,所属分类),下列语法不正确的是(D)A、select * from 产品表where价格>1000B、select sum(价格) from 产品表group by 所属分类having max(价格)>1000C、select所属分类,sum(价格) from 产品表where 价格>1000 group by 所属分类D、select所属分类,sum(价格) from 产品表where max(价格)>1000 group by 所属分类5、关于触发器,下列说法正确的是(B)A、可以在表上创建INSTEAD OF 触发器B、语句级触发器不能使用“:old”和“:new”C、行级触发器不能用于审计功能D、触发器可以显式调用6、下列那些是Oracle的伪列(ACD)A、ROWIDB、ROW_NUMBER()C、LEVELD、ROWNUME、COLUMN7、当表的重复行数据很多时,应该创建的索引类型应该是(C )A、B树B、reverseC、bitmapD、函数索引8、在建表时如果希望某列的值,在一定的范围内,应建什么样的约束?(C )A、primary keyB、uniqueC、checkD、not null9、利用游标来修改数据时,所用的。
PLSQL测试题

P L S Q L测试题work Information Technology Company.2020YEARPLSQL测试题.txt什么叫乐观派?这个。
就象茶壶一样,屁股被烧得红红的,还有心情吹口哨。
生活其实很简单,过了今天就是明天。
一生看一个女人是不科学的,容易看出病来。
1.procedure,function,trigger的区别,从功能,返回值,参数,与sql关系等说说过程和函数的比较:过程:作为 PL/SQL 语句执行在规格说明中不包含 RETURN 子句不返回任何值可以包含 RETURN 语句,但是与函数不同,它不能用于返回值函数:作为表达式的一部分调用必须在规格说明中包含 RETURN 子句必须返回单个值必须包含至少一条 RETURN 语句2.你经常如何tuning PLSQL代码呢从什么角度tuningPLSQL优化技术你知道的有哪些,可以举例3.对于PLSQL的一些硬编码,你有哪些方法来避免,请举一些有代表性的例子并说明好处。
4.对in,out,in out mode参数的赋值过程是如何的以及他们的主要区别5.在PLSQL里你如何避免重复代码问题的,请举例说明6.你的PLSQL代码里有COMMIT吗?你如何看待频繁COMMIT问题的。
7.请列举4种动态语句,并说明用途。
8.SQL性能调整你经常用哪些工具,比如explain plan,set autotrace,10046等,他们之间有什么区别。
9.描述DBMS_PROFILER包、DBMS_HPROF、DBMS_TRACE、DBMS_UTILITY的常见用途。
10.描述array,nested table,index by table的区别。
11.forall和bulk collect干嘛的基本原理是什么请举例在什么情况下你会用批处理,有什么注意点,limit一般设为多大,为什么?12.你认为package编程与非package编程相比,有什么好处?13.在PLSQL里如何使用绑定变量,为什么要使用绑定变量?请举例说明。
PLSQL练习题一

PLSQL练习题一PL/SQL练习题在Oracle中所有的过程都是以PL/SQL块开始的,掌握PL/SQL 对于过程的开发是非常用用处的。
PL/SQL块的定义格式:范例:使用以上的语句,创建一个简单的程序块以上一个基本的语句块已经写完了,但是里面并没有任何的输出,之所以这样,主要原因在于SQLPLUSW中的系统输出没有打开,需要通过以下的命令完成:以上是一个简单的语句块,但是在PLSQL块中也可以直接进行数据库的查询操作。
范例:要求输入一个雇员的编号,之后显示出此编号雇员的姓名·如果要想输入雇员编号的话,第八章存在一个替代变量“&”此时已经可以查询出来了,但是以上的代码是否会存在其他问题呢?如果现在输入的编号不存在则有可能返回错误信息,那么为了让代码在出现错误之后依然可以正确的使用,则可以加入异常处理的操作机制。
但是,从以上的程序中可以发现,在SQLPLUSW中输出实际上并没有真正的意义,所以显示的格式也就没有必要做任何的调整。
在PL/SQL块中也可以编写循环、判断等语句。
可以使用循环操作:LOOP,循环这个时候一个循环语句就已经编写完成了。
此循环属于先执行后判断,所以可以使用另外一种循环语句:WHILE…LOOP。
那么,此种循环操作属于先判断后执行。
在PL/SQL中也可以使用FOR循环方式PLSQL中同样存在IF语句,执行条件的分支操作。
范例:给定一个值,要求判断其是否大于10,如果大于,则显示记录大于10条但是,以上的内容都属于固定好的结果,现在要求可以将emp表中的记录数进行验证。
也可以使用if..else语句If语句上还能继续扩展,if…elseif….else….但是需要注意的是,在Oracle中的else if要换成elsif那么,下面就可以利用以上的语句完成一些的复杂功能。
要求:要求输入一个雇员编号,为此雇员增长工资,增长工作按照以下的原则进行:·10部门人员工资上涨10%·20部门人员工资上涨20%·30部门人员工资上涨30%但是所有的工资最高不超过5000。
PLSQL经典练习

PLSQL经典练习/*====================================== ===================PL/SQL编程====================================== ===================*/--先把scott里面的表弄到test表空间里面来CREATE TABLE EMP ASSELECT * FROM SCOTT.EMP;CREATE TABLE DEPT ASSELECT * FROM SCOTT.DEPT;/*上机1*/--(1)计算King所交税金DECLAREV_SHUIJIN NUMBER; --应交税金V_SAL SCOTT.EMP.SAL%TYPE; --工资C_QIZHENDIAN CONSTANT NUMBER :=3500;BEGINSELECT SAL INTO V_SAL FROM SCOTT.EMP WHERE ENAME='KING';IF (V_SAL-C_QIZHENDIAN)<=1500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.03-0;ELSIF (V_SAL-C_QIZHENDIAN)>1500 AND (V_SAL-C_QIZHENDIAN)<=4500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.1-105;ELSIF (V_SAL-C_QIZHENDIAN)>4500 AND (V_SAL-C_QIZHENDIAN)<=9000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.2-555;ELSIF (V_SAL-C_QIZHENDIAN)>9000 AND (V_SAL-C_QIZHENDIAN)<=35000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.25-1005;ELSIF (V_SAL-C_QIZHENDIAN)>35000 AND (V_SAL-C_QIZHENDIAN)<=55000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.3-2755;ELSIF (V_SAL-C_QIZHENDIAN)>55000 AND (V_SAL-C_QIZHENDIAN)<=80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.35-5505;ELSIF (V_SAL-C_QIZHENDIAN)>80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.45-13505;END IF;DBMS_OUTPUT.PUT_LINE('KING所交的税金是:'||V_SHUIJIN);END;--(2)根据员工scott入职的时间修改发放奖金列,大于等于6年的奖金为2000,小于6年的奖金是1500DECLAREV_SCOTT_HIREDATE EMP.HIREDATE%TYPE; --SCOTT的入职时间V_COMM NUMBER; --奖金BEGINSELECT HIREDATE INTO V_SCOTT_HIREDATE FROM EMP WHERE ENAME='SCOTT';IF (SYSDATE-V_SCOTT_HIREDATE)>=365*6 THENV_COMM:=2000;ELSEV_COMM:=1500;END IF;--开始修改UPDATE EMP SET COMM=V_COMM WHERE ENAME='SCOTT';IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('修改成功!');ELSEDBMS_OUTPUT.PUT_LINE('修改失败!');END IF;END;--(3)查询scott相应的工资级别并显示所在部门名称,薪水,和所在的级别DECLAREV_SCOTT_SAL EMP.SAL%TYPE; --scott的工资V_JIBIE NUMBER; --级别V_DEPTNAME DEPT.DNAME%TYPE; --部门名称BEGINSELECT SAL,DNAME INTO V_SCOTT_SAL,V_DEPTNAME FROM EMP E JOIN DEPT DON E.DEPTNO=D.DEPTNOWHERE ENAME='SCOTT';IF V_SCOTT_SAL>700 AND V_SCOTT_SAL<=3200 THENV_JIBIE:=1; --第一级别ELSIF V_SCOTT_SAL>3200 AND V_SCOTT_SAL<=4400 THEN V_JIBIE:=2; --第二级别ELSIF V_SCOTT_SAL>4400 AND V_SCOTT_SAL<=5000 THEN V_JIBIE:=3; --第三级别ELSIF V_SCOTT_SAL>5000 AND V_SCOTT_SAL<=7000 THEN V_JIBIE:=4; --第四级别ELSIF V_SCOTT_SAL>7000 AND V_SCOTT_SAL<=10000 THENV_JIBIE:=5; --第五级别END IF;DBMS_OUTPUT.PUT_LINE('SCOTT所在的部门是:'||||',薪水是:'||V_SCOTT_SAL||',所在的级别是:第'||V_JIBIE||'级别');END;--(4)位员工scott增加工资,每次增加100,直到增加到10000为止DECLAREV_SCOTT_SAL EMP.SAL%TYPE; --SCOTT的工资BEGINSELECT SAL INTO V_SCOTT_SAL FROM EMP WHERE ENAME='SCOTT';LOOP--增加工资V_SCOTT_SAL:=V_SCOTT_SAL+100;EXIT WHEN V_SCOTT_SAL>=10000;END LOOP;--修改scott的工资UPDATE EMP SET SAL=V_SCOTT_SAL WHERE ENAME='SCOTT';IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('增加成功!');ELSEDBMS_OUTPUT.PUT_LINE('增加失败!');END IF;END;/*上机2 预定义异常公司通过emp表维护职员记录,用以接收职员编号并检索职员姓名,*/DECLAREV_ENAME VARCHAR2(4);BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=&EMPNO;DBMS_OUTPUT.PUT_LINE('已找到'||V_ENAME);EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('对不起,没有该职员!');WHEN VALUE_ERROR THENDBMS_OUTPUT.PUT_LINE('职员名称太长!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现其他的异常!');END;/*上机3自定义异常、||输入员工编号,工资,部门编号,||如果部门代码是10,且工资低于10000,更新员工的工资是10000||如果部门代码是10,工资高于10000,显示消息“工资不低于10000”||如果部门代码不是10则不显示*/DECLAREV_EMPNO EMP.EMPNO%TYPE; --员工编号V_DEPTNO EMP.DEPTNO%TYPE; --部门编号V_SAL EMP.SAL%TYPE; --工资V_ENAME EMP.ENAME%TYPE; --姓名V_V_EMPNO EMP.EMPNO%TYPE; --输入员工编号V_V_DEPTNO EMP.DEPTNO%TYPE; --输入部门编号V_V_SAL EMP.SAL%TYPE; --输入工资E_ERROR_DEPTNO EXCEPTION; --自定义异常(部门编号不是10)E_ERROR_EMPNO EXCEPTION; --自定义异常(找不到该员工) V_COUNT NUMBER; --声明一个记录数BEGIN--输入员工编号V_EMPNO:=&V_V_EMPNO;--输入工资V_SAL:=&V_VSAL;--输入部门编号V_DEPTNO:=&V_V_DEPTNO;IF V_DEPTNO=10 THEN--在进行二次判断(输入员工编号)IF V_SAL<10000 THEN--判断输入的员工编号是否存在,不存在的话报异常,存在的话继续SELECT COUNT(*) INTO V_COUNT FROM EMP WHERE EMPNO=V_DEPTNO;IF V_COUNT!=1 THENRAISE E_ERROR_EMPNO; --报异常ELSE--更新工资为1000UPDATE EMP SET SAL=10000 WHERE EMPNO=V_EMPNO; IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('更新成功');ELSEDBMS_OUTPUT.PUT_LINE('更新失败');END IF;END IF;ELSIF V_SAL>10000 THENDBMS_OUTPUT.PUT_LINE('工资不低于10000!!');END IF;ELSERAISE E_ERROR_DEPTNO;END IF;EXCEPTIONWHEN E_ERROR_DEPTNO THENDBMS_OUTPUT.PUT_LINE('部门代码不是10!!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现其他异常,请自行解决'); END;------------------------------------------------------SELECT * FROM EMP;DECLAREV_NAME EMP.ENAME%TYPE;E_ERROR EXCEPTION;V_COUNT NUMBER; --记录数BEGINSELECT COUNT(*) INTO V_COUNT FROM EMP WHERE EMPNO=7901;IF (V_COUNT=1) THENDBMS_OUTPUT.PUT_LINE(V_NAME);ELSERAISE E_ERROR;END IF;EXCEPTIONWHEN E_ERROR THENDBMS_OUTPUT.PUT_LINE('没有记录!');/*when no_data_found thenDBMS_OUTPUT.PUT_LINE('找不到!');*/END;-------------------------------------------------------------DECLAREV_NAME VARCHAR2(10);E_ERROR EXCEPTION;BEGINIF V_NAME IS NULL THENRAISE E_ERROR;ELSEDBMS_OUTPUT.PUT_LINE();END IF;EXCEPTIONWHEN E_ERROR THENDBMS_OUTPUT.PUT_LINE('没有记录!');END;/*//上机4使用游标*/--(1)计算公司应交税金的总额DECLAREV_SHUIJIN NUMBER; --应交税金V_SAL SCOTT.EMP.SAL%TYPE; --工资V_SUM NUMBER(10):=0; --总税金C_QIZHENDIAN CONSTANT NUMBER :=3500;CURSOR CURSOR_SAL ISSELECT SAL FROM EMP; --所有的员工的工资BEGINOPEN CURSOR_SAL;LOOPFETCH CURSOR_SAL INTO V_SAL;--把所有的工资放在V_SAL里面EXIT WHEN CURSOR_SAL%NOTFOUND;IF (V_SAL-C_QIZHENDIAN)<=1500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.03-0;ELSIF (V_SAL-C_QIZHENDIAN)>1500 AND (V_SAL-C_QIZHENDIAN)<=4500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.1-105;ELSIF (V_SAL-C_QIZHENDIAN)>4500 AND (V_SAL-C_QIZHENDIAN)<=9000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.2-555;ELSIF (V_SAL-C_QIZHENDIAN)>9000 AND (V_SAL-C_QIZHENDIAN)<=35000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.25-1005;ELSIF (V_SAL-C_QIZHENDIAN)>35000 AND (V_SAL-C_QIZHENDIAN)<=55000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.3-2755;ELSIF (V_SAL-C_QIZHENDIAN)>55000 AND (V_SAL-C_QIZHENDIAN)<=80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.35-5505;ELSIF (V_SAL-C_QIZHENDIAN)>80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.45-13505;END IF;V_SUM:=V_SUM+V_SHUIJIN;END LOOP;CLOSE CURSOR_SAL; --关闭游标DBMS_OUTPUT.PUT_LINE(V_SUM);EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现异常!');END;--(2)根据员工入职时间修改所有员工发放奖金,大于6年的+2000,小于的1500+DECLAREV_COMM M%TYPE; --奖金CURSOR CURSOR_EMP_COMM ISSELECT HIREDATE FROM EMP FOR UPDATE;BEGINFOR CUR1 IN CURSOR_EMP_COMM LOOPIF (SYSDATE-CUR1.HIREDATE)>=365*6 THENV_COMM:=2000;ELSEV_COMM:=1500;END IF;--开始修改UPDATE EMP SET COMM=V_COMM WHERE CURRENT OF CURSOR_EMP_COMM;IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('更新成功');ELSEDBMS_OUTPUT.PUT_LINE('更新失败');END IF;END LOOP;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现异常!');END;--(3)显示员工姓名,所在部门名称,薪水,所在级别DECLAREC_DNAME CONSTANT VARCHAR2(20):='SALES'; --销售部门V_JIBIE NUMBER; --级别CURSOR CURSOR_EMP ISSELECT ENAME,DNAME,SAL FROM EMP EJOIN DEPT D ON E.DEPTNO=D.DEPTNOWHERE DNAME=C_DNAME;BEGINFOR C1 IN CURSOR_EMP LOOPIF C1.SAL>700 AND C1.SAL<=3200 THENV_JIBIE:=1; --第一级别ELSIF C1.SAL>3200 AND C1.SAL<=4400 THENV_JIBIE:=2; --第二级别ELSIF C1.SAL>4400 AND C1.SAL<=5000 THENV_JIBIE:=3; --第三级别ELSIF C1.SAL>5000 AND C1.SAL<=7000 THENV_JIBIE:=4; --第四级别ELSIF C1.SAL>7000 AND C1.SAL<=10000 THENV_JIBIE:=5; --第五级别ELSEV_JIBIE:=0; --没有级别END IF;DBMS_OUTPUT.put_line(C1.ENAME||'在'||C1.DNAME||'部门,'||'薪水是'||C1.SAL||'在第'||V_JIBIE||'级别');END LOOP;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现异常!');END;/*上机5 存储过程*/--(1)根据输入的员工编号,删除相应的员工CREATE OR REPLACE PROCEDURE DEL_EMPNAME(ENO EMP.EMPNO%TYPE, --输入员工的编号ON_FLAG OUT NUMBER, --执行状态,-1失败,1成功0异常ON_MSG OUT VARCHAR --提示信息)ISE_ERROR EXCEPTION; --异常信息BEGINDELETE FROM EMP WHERE EMPNO=ENO; IF SQL%NOTFOUND THENRAISE E_ERROR;ELSEON_FLAG:=1; --执行成功ON_MSG:='删除成功!';END IF;EXCEPTIONWHEN E_ERROR THENON_FLAG:=0; --执行成功ON_MSG:='删除失败!';WHEN OTHERS THENON_FLAG:=0;ON_MSG:='出现异常!';END;DROP PROCEDURE DEL_EMPNAME;--调用存储过程DECLAREV_EMPNO NUMBER;ENO NUMBER(5);ON_FLAG NUMBER(1);ON_MSG VARCHAR(20);BEGINENO:=&EMPNO; --输入编号DEL_EMPNAME(ENO,ON_FLAG,ON_MSG); DBMS_OUTPUT.PUT_LINE(ON_FLAG); DBMS_OUTPUT.PUT_LINE(ON_MSG); END;--(2)创建输出参数为薪水集合的存储过程,调用并显示所有员工的薪水。
plsql练习2

5.使用REF游标显示"EMP"表中的值。
6、使用游标将各个职位前3位的职员的姓名、工资、名次存到一个数据表GOOD中。
编写一plsql对所有雇员按他们基本薪水的10加薪如果所增加的薪水大于5000则取消加薪
PL/Sห้องสมุดไป่ตู้L游标、包练习
1、简单的描述一下游标的类型,说一下普通游标和REF光标之间的区别。
2.编写一个PL/SQL程序块,对名字以“A”或“S”开始的所有雇员按他们的基本薪水的10%加薪。
3.编写一PL/SQL,以提升两个资格最老的“职员”为“高级职员”。(工作时间越长,优先级越高)
PLSQL基础练习题

Oracle Application E-B USINESS S UITEOracle Applications Technical TrainingPLSQL ExerciseAuthor: ConsultantCreation Date: 2016/01/01Last Updated: 2016/01/01Document Ref:Version: 1.01.PLSQL练习题目1.1PLSQL简介1. 定义变数v_sex 为字元型态(只有一个字元),试举出三种方式2. 定义v_name 为varchar2(40)、v_empno 为Number,v_hiredate 为Date 资料型态3. 定义v_sal 变数为Number 型态且不可为空值4. 同上例,v_sal 预设值为10005. 定义变数v_tax 为常数值(34.5)6. 定义变数v_hiredate 继承原emp 表格中hiredate 栏位资料型态7. 同上例,定义一变数v_hiredate2 继承v_hiredate 变数资料型态8. 定义变数dept_rec 继承原Dept 表格所有栏位资料型态9. 宣告dept_rec_type Record 资料型态,包含deptno number 及dname varchar2(40)10. 由上例资料型态,定义Record 变数dept_rec1.2执行语法说明1. 写出下列语法产出结果DECLAREv_name VARCHAR2(40) :='KEN';v_mgr NUMBER :=7688;v_times NUMBER :=10;BEGINDECLAREv_name VARCHAR2(40) :='JOHN';v_times NUMBER :=20;BEGINdbms_output.put_line(v_name||' '||v_mgr ||' '||v_times) ;END ;dbms_output.put_line(v_name||' '||v_mgr||' '||v_times) ;END;2. 于PL/SQL 语法中,使用SQL 语法将'KING'薪水资料带给变数v_sal3. 使用IF 逻辑运算判断成绩,当成绩(v_score)>=90 则v_grade 为A,介于90(不含)至80(含)为B,介于80(不含)至70(含)为C,70 以下为D4. 使用LOOP 方式,计算由1+2...10 所得结果1.3副程式1. 建立Function 名称为get_loc,传入员工代号,回传部门所在地2. 使用已建立好get_loc 函数,传入7839 员工代号,并将回传值传给v_loc 变数3. 同范例1,建立Procedure 名称为get_loc1,使用参数(OUT)方式回传4. 使用已建立好get_loc1 Procedure,传入7839 员工代号将值带给v_loc 变数5. 建立一Package Spec handle_loc 包含上述两个副程式6. 建立一Package Body handle_loc 包含上述两个副程式7. 使用handle_loc Package 中handle_loc Function,传入7839 员工代号,并将值传给v_loc 变数1.4Cursor功能说明1. 宣告一个Cursor 名为 emp_dept_cur,资料集为员工代号、员工姓名、部门代号及部门名称2. 同上例,范围缩小为部门代码不包含10 及依照薪水由大至小排序3. 同上例,使用参数(p_deptno)方式传入4. 同上例,建立一显性(Explicit) Cursor 将资料(empno、ename、deptno、dname)写入emp_dept_temp 中5. 同上例,使用Cursor for loop 方式,将资料(empno、ename、deptno、dname)写入emp_dept_temp 中1.5例外状况处理1. 判断下列语法,会产生结果为何?DECLAREi NUMBER :=1;j NUMBER :=0;BEGINBEGINi:= i/j;EXCEPTIONWHEN no_data_found THENdbms_output.put_line('no_data_found');END;EXCEPTIONWHEN too_many_rows THENdbms_output.put_line('no_data_found');WHEN zero_divide THENdbms_output.put_line('zero_divide');WHEN OTHERS THENdbms_output.put_line('others');END;2. 建立一 Exception 当sal/comm 发生zero_divide 时,将错误代码及写入讯息记录档emp_error 中3. 同上例,当 comm 为0 时,于执行语法中使用raise_application_error 触发Exception 错误代码为-20011 及错误讯息"dividor can not be zero!!"2. SQL 练习答案2.1PLSQL简介1. 定义变数v_sex 为字元型态(只有一个字元),试举出三种方式v_sex CHAR;v_sex CHAR(1);v_sex VARCHAR2(1);2. 定义v_name 为varchar2(40)、v_empno 为Number,v_hiredate 为Date 资料型态v_name VARCHAR2(40);v_empno NUMBER;v_hiredate DATE;3. 定义v_sal 变数为Number 型态且不可为空值v_sal NUMBER NOT NULL;4. 同上例,v_sal 预设值为1000v_sal NUMBER NOT NULL DEFAULT 1000;5. 定义变数v_tax 为常数值(34.5)v_tax CONSTANT NUMBER := 34.5;6. 定义变数v_hiredate 继承原emp 表格中hiredate 栏位资料型态v_hiredate emp.hiredate%TYPE;7. 同上例,定义一变数v_hiredate2 继承v_hiredate 变数资料型态v_hiredate2 v_hiredate%TYPE;8. 定义变数dept_rec 继承原Dept 表格所有栏位资料型态dept_rec dept%ROWTYPE;9. 宣告dept_rec_type Record 资料型态,包含deptno number 及dname varchar2(40)TYPE dept_rec_type IS RECORD(deptno NUMBER,dname VARCHAR2(40));10. 由上例资料型态,定义Record 变数dept_recdept_rec dept_rec_type;2.2执行语法说明1. 写出下列语法产出结果DECLAREv_name VARCHAR2(40) :='KEN';v_mgr NUMBER :=7688;v_times NUMBER :=10;BEGINDECLAREv_name VARCHAR2(40) :='JOHN';v_times NUMBER :=20;BEGINdbms_output.put_line(v_name||' '||v_mgr ||' '||v_times) ;END ;dbms_output.put_line(v_name||' '||v_mgr||' '||v_times) ;END;结果:JOHN 7688 20KEN 7688 102. 于PL/SQL 语法中,使用SQL 语法将'KING'薪水资料带给变数v_salSELECT sal INTO v_salFROM empWHERE ename = 'KING';3. 使用IF 逻辑运算判断成绩,当成绩(v_score)>=90 则v_grade 为A,介于90(不含)至80(含)为B,介于80(不含)至70(含)为C,70 以下为DIF v_score >= 90 THENv_grade := 'A';ELSIF v_score >=80 THENv_grade := 'B';ELSIF v_score >=70 THENv_grade := 'C';ELSEv_grade := 'D';END IF;4. 使用LOOP 方式,计算由1+2...10 所得结果v_acc:=0;v_time:=1;LOOPv_acc := v_acc + v_time;EXIT WHEN v_time>=10;v_time := v_time + 1;dbms_output.put_line(v_acc);END LOOP;2.3副程式1. 建立Function 名称为get_loc,传入员工代号,回传部门所在地CREATE OR REPLACE FUNCTION get_loc(p_empno IN NUMBER)RETURN VARCHAR2ISv_loc VARCHAR2(120);BEGINSELECT dept.loc INTO v_locFROM emp,deptWHERE emp.deptno = dept.deptnoAND empno = p_empno;RETURN v_loc;EXCEPTION WHEN OTHERS THENRETURN NULL;END get_loc;2. 使用已建立好get_loc 函数,传入7839 员工代号,并将回传值传给v_loc 变数v_loc := get_loc(7839);3. 同范例1,建立Procedure 名称为get_loc1,使用参数(OUT)方式回传CREATE OR REPLACE PROCEDURE get_loc1(p_empno IN NUMBER,x_locOUT VARCHAR2)ISBEGINSELECT dept.loc INTO x_locFROM emp,deptWHERE emp.deptno = dept.deptnoAND empno = p_empno;EXCEPTIONWHEN OTHERS THENx_loc := NULL;END get_loc1;4. 使用已建立好get_loc1 Procedure,传入7839 员工代号将值带给v_loc 变数get_loc1(7839,v_loc);5. 建立一Package Spec handle_loc 包含上述两个副程式6. 建立一Package Body handle_loc 包含上述两个副程式7. 使用handle_loc Package 中handle_loc Function,传入7839 员工代号,并将值传给v_loc 变数2.4Cursor功能说明1. 宣告一个Cursor 名为 emp_dept_cur,资料集为员工代号、员工姓名、部门代号及部门名称2. 同上例,范围缩小为部门代码不包含10 及依照薪水由大至小排序3. 同上例,使用参数(p_deptno)方式传入4. 同上例,建立一显性(Explicit) Cursor 将资料(empno、ename、deptno、dname)写入emp_dept_temp 中5. 同上例,使用Cursor for loop 方式,将资料(empno、ename、deptno、dname)写入emp_dept_temp 中2.5例外状况处理1. 判断下列语法,会产生结果为何?DECLAREi NUMBER :=1;j NUMBER :=0;BEGINBEGINi:= i/j;EXCEPTIONWHEN no_data_found THENdbms_output.put_line('no_data_found');END;EXCEPTIONWHEN too_many_rows THENdbms_output.put_line('no_data_found');WHEN zero_divide THENdbms_output.put_line('zero_divide');WHEN OTHERS THENdbms_output.put_line('others');END;2. 建立一 Exception 当sal/comm 发生zero_divide 时,将错误代码及写入讯息记录档emp_error 中3. 同上例,当 comm 为0 时,于执行语法中使用raise_application_error 触发Exception 错误代码为-20011 及错误讯息"dividor can not be zero!!"3. Open and Closed IssuesAdd open issues that you identify while writing or reviewing this document to theopen issues section. As you resolve issues, move them to the closed issues sectionand keep the issue ID the same. Include an explanation of the reSolution.Open IssuesClosed Issues。
plsql面试笔试题目及答案
plsql面试笔试题目及答案一、单项选择题(每题2分,共10题)1. PL/SQL中,哪个关键字用于定义变量?A. VARB. DECLAREC. VARIBLED. DECLARE_VAR答案:B2. 在PL/SQL中,哪个语句用于结束循环?A. EXITB. END_LOOPC. LOOP_ENDD. QUIT答案:A3. PL/SQL中,哪个关键字用于定义存储过程?A. PROCEDUREB. FUNCTIONC. PACKAGED. TRIGGER答案:A4. 在PL/SQL中,哪个关键字用于定义函数?A. PROCEDUREB. FUNCTIONC. PACKAGED. TRIGGER答案:B5. PL/SQL中,哪个关键字用于定义游标?A. CURSORB. SELECTC. LOOPD. FOR答案:A6. PL/SQL中,哪个关键字用于定义异常处理?A. EXCEPTIONB. TRYC. CATCHD. RAISE答案:A7. 在PL/SQL中,哪个关键字用于定义记录类型?A. RECORDB. TYPEC. ROWD. TABLE答案:B8. PL/SQL中,哪个关键字用于定义集合类型?A. COLLECTIONB. SETC. ARRAYD. LIST答案:A9. 在PL/SQL中,哪个关键字用于定义触发器?A. TRIGGERB. PROCEDUREC. FUNCTIOND. PACKAGE答案:A10. PL/SQL中,哪个关键字用于定义包?A. PACKAGEB. PROCEDUREC. FUNCTIOND. TRIGGER答案:A二、多项选择题(每题2分,共10题)1. PL/SQL中,哪些关键字用于控制流程?A. IFB. LOOPC. GOTOD. CASE答案:A, B, D2. 在PL/SQL中,哪些关键字用于集合操作?A. BULK COLLECTB. FORALLC. LIMITD. FETCH答案:A, B3. PL/SQL中,哪些关键字用于异常处理?A. EXCEPTIONB. RAISEC. WHEND. THEN答案:A, B, C4. 在PL/SQL中,哪些关键字用于定义数据类型?A. TYPEB. TABLEC. RECORDD. COLLECTION答案:A, C, D5. PL/SQL中,哪些关键字用于定义游标?A. CURSORB. FORC. LOOPD. SELECT答案:A, B6. 在PL/SQL中,哪些关键字用于定义触发器?A. TRIGGERB. BEFOREC. AFTERD. INSTEAD OF答案:A, B, C7. PL/SQL中,哪些关键字用于定义存储过程和函数?A. PROCEDUREB. FUNCTIONC. PACKAGED. TRIGGER答案:A, B8. 在PL/SQL中,哪些关键字用于定义变量?A. VARB. DECLAREC. VARIBLED. DECLARE_VAR答案:B9. PL/SQL中,哪些关键字用于定义条件语句?A. IFB. THENC. ELSED. ELSIF答案:A, B, C, D10. 在PL/SQL中,哪些关键字用于定义循环?A. LOOPB. FORC. WHILED. REPEAT答案:A, B三、判断题(每题2分,共10题)1. PL/SQL是一种过程式编程语言。
PLSQL测试题
1.procedure,function,trigger的区别,从功能,返回值,参数,与sql关系等说说过程和函数的比较:过程:作为 PL/SQL 语句执行在规格说明中不包含 RETURN 子句不返回任何值可以包含 RETURN 语句,但是与函数不同,它不能用于返回值函数:作为表达式的一部分调用必须在规格说明中包含 RETURN 子句必须返回单个值必须包含至少一条 RETURN 语句2.你经常如何tuning PLSQL代码呢?从什么角度tuning?PLSQL优化技术你知道的有哪些,可以举例?3.对于PLSQL的一些硬编码,你有哪些方法来避免,请举一些有代表性的例子并说明好处。
4.对in,out,in out mode参数的赋值过程是如何的?以及他们的主要区别?5.在PLSQL里你如何避免重复代码问题的,请举例说明6.你的PLSQL代码里有COMMIT吗?你如何看待频繁COMMIT问题的。
7.请列举4种动态语句,并说明用途。
8.SQL性能调整你经常用哪些工具,比如explain plan,set autotrace,10046等,他们之间有什么区别。
9.描述DBMS_PROFILER包、DBMS_HPROF、DBMS_TRACE、DBMS_UTILITY的常见用途。
10.描述array,nested table,index by table的区别。
11.forall和bulk collect干嘛的?基本原理是什么?请举例在什么情况下你会用批处理,有什么注意点,limit一般设为多大,为什么?12.你认为package编程与非package编程相比,有什么好处?13.在PLSQL里如何使用绑定变量,为什么要使用绑定变量?请举例说明。
14.sql中可以调用自定义的function,有什么限制?15.autonomous transaction是干嘛的?请描述一下,并且举例说明其用途。
16.在PLSQL里,你用什么的方法保护你的代码安全。
plsql 练习题
plsql 练习题PL/SQL 练习题PL/SQL(Procedural Language/Structured Query Language)是Oracle 数据库中的一种过程性编程语言,它可以用于编写数据库触发器、存储过程以及其他的数据库业务逻辑。
在这篇文章中,我们将提供一些PL/SQL练习题,旨在帮助读者巩固并加深对PL/SQL语言的了解。
一、创建表格和触发器假设我们要创建一个学生信息的数据库,其中包含两个表格:学生表格(students)和成绩表格(grades)。
学生表格包含学生的ID (id)、姓名(name)和年龄(age)等字段,成绩表格包含学生的ID (student_id)和分数(score)等字段。
1. 请使用PL/SQL语言创建上述两个表格,并插入一些测试数据。
2. 创建一个触发器,当成绩表格中的分数大于90分时,在学生表格中将该学生的年龄增加1岁。
二、存储过程和函数1. 创建一个存储过程,该存储过程接受学生的ID作为参数,并根据该ID查询该学生的姓名和年龄,并在输出中显示。
2. 创建一个函数,该函数接受学生的ID作为参数,并根据该ID查询该学生的平均分数,并返回。
三、游标和循环1. 创建一个游标,并使用循环语句遍历学生表格中所有学生的姓名和年龄,并在每次循环中将姓名和年龄输出。
2. 修改上述游标的示例,使用条件判断语句,只输出年龄大于20岁的学生的姓名和年龄。
四、异常处理1. 创建一个存储过程,该存储过程接受学生的ID作为参数,并根据该ID查询该学生的姓名。
当查询结果为空时,使用异常处理机制输出错误信息。
2. 修改上述存储过程的示例,当查询结果为空时,抛出自定义的异常,并在外部中捕获该异常,输出错误信息。
五、光标和触发器1. 创建一个光标,并使用触发器,在插入成绩表格的数据时,通过光标查询学生表格中相应学生的年龄,并将该年龄更新到成绩表格中。
2. 修改上述触发器的示例,当插入的学生不存在于学生表格中时,抛出异常,阻止插入操作。
SQL_PLSQL练习题
SQL_PLSQL练习题在开始做题目之前,请首先仔细阅读关于几个表的说明:学生基本信息表:Students (个人编号,姓名,性别,生日);课程信息表:courses (课程编号,课程名称)考试成绩表:results(个人编号,课程编号,分数,档次)成绩档次表:grades(序号,最低分,最高分,等级评定,说明)学生成绩临时信息表temp(个人编号,课程编号,分数)/From students a left join results b where a.sno=b.sno在scott/tiger用户下,执行以下语句,进行建表和插入数据操作:------------------以下为初始数据---------------------------INSERT INTO studentsVALUES(101,'张三', '女', '07-5月-1990');INSERT INTO studentsVALUES(102,'李四', '男', '25-11月-1992');INSERT INTO studentsVALUES(103,'王五', '女', '12-8月-1991');INSERT INTO studentsVALUES(104,'赵六', '男', '08-10月-1991');INSERT INTO studentsVALUES(105,'周七', '男', '03-4月-1992');INSERT INTO studentsVALUES(106,'孙八', '男', '21-7月-1990');INSERT INTO studentsVALUES(107,'钱九', '男', '21-12月-1990'); INSERT INTO studentsVALUES(108,'沈十', '女', '11-7月-1992'); INSERT INTO COURSES VALUES ('91', 'C语言'); INSERT INTO COURSES VALUES ('92', 'JAVA语言'); INSERT INTO COURSES VALUES ('93', 'Oracle编程'); INSERT INTO COURSES VALUES ('94', '语文'); INSERT INTO RESULTS VALUES ('101', '91', 85, ''); INSERT INTO RESULTS VALUES ('103', '91', 71, ''); INSERT INTO RESULTS VALUES ('104', '93', 82, ''); INSERT INTO RESULTS VALUES ('105', '92', 95, ''); INSERT INTO RESULTS VALUES ('107', '94', 90, ''); INSERT INTO RESULTS VALUES ('108', '92', 67, ''); INSERT INTO TEMP VALUES ('102', '91', 58); INSERT INTO TEMP VALUES ('101', '94', 88); INSERT INTO TEMP VALUES ('104', '93', ''); INSERT INTO TEMP VALUES ('106', '92', 95); INSERT INTO TEMP VALUES ('112', '93', 76); INSERT INTO TEMP VALUES ('110', '91', 100); INSERT INTO TEMP VALUES ('108', '92', ''); Commit;******************以下为题目*****************1.(5分)向成绩档次表grades中的前三个字段(ind, min_score, max_score)中插入以下几条数据序号min_score max_score1 0 592 60 793 80 894 90 1002. (5分)根据下面说明完善成绩档次表grades中的字段(grade,remark)分数段档次说明0-59分 D 不及格60-79分 C 差80-89分 B 良好90-100分 A 优秀3. (10分)统计成绩表中,各门课程的课程编号,课程名称,人数,以及该门课程总分,课程平均分(保留两位小数)等信息,查询显示出人数不止1人的课程的上述信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Pl/sql 语句习题: P410(1): declare v_empno emp.empno%type; cursor c_emp is select * from emp where empno=v_empno; v_emp emp%rowtype; begin v_empno:=&x; open c_emp; loop fetch c_emp into v_emp; exit when c_emp%notfound; dbms_output.put_line(v_emp.ename||' '||v_emp.empno||' '||v_emp.sal||' '||v_emp.deptno); end loop; close c_emp; end; p410(2): declare v_ename emp.ename%type; cursor c_emp is select * from emp where ename=v_ename for update; v_emp emp%rowtype; begin v_ename:=&x; open c_emp; if c_emp%notfound then insert into emp(empno,ename,sal,deptno) values(2007,'SMITH',1500,10); else loop fetch c_emp into v_emp; exit when c_emp%notfound; dbms_output.put_line(v_emp.empno||' '||v_emp.sal||' '||v_emp.deptno); end loop; end if; close c_emp; end; p410(3): 先创建: create or replace procedure c_emp(v_empno emp.empno%type) as v_sal emp.sal%type; begin select sal into v_empno from emp where empno=7844; dbms_output.put_line(v_sal); end c_emp; 再调用: declare v_sal emp.sal%type; v_empno emp.empno%type; begin v_empno:=&x; c_emp(v_empno); dbms_output.put_line(v_sal); end; p410(4): 先创建: create or replace procedure example(v_empno emp.empno%type) as v_deptno emp.deptno%type; v_sal emp.sal%type; v_increment number(4); begin select deptno into v_deptno from emp where empno=v_empno; CASE v_deptno when 10 then v_increment:=150; when 20 then v_increment:=200; when 30 then v_increment:=250; else v_increment:=300; end CASE; update emp set sal=sal+v_increment where deptno=v_deptno; select sal into v_sal from emp where empno=v_empno; dbms_output.put_line(v_sal); end example; 在调用:
declare v_sal emp.sal%type; v_empno emp.empno%type; begin v_empno:=&x; example(v_empno); dbms_output.put_line(v_sal); end; p410(5): 创建: create or replace procedure c_emp(v_empno emp.empno%type) as v_hiredate number(4); begin select (sysdate-hiredate)/365 into v_hiredate from emp where empno=v_empno; dbms_output.put_line(v_hiredate); end; 调用: declare v_workyears number(4); v_empno emp.empno%type; begin v_empno:=&x; c_emp(v_empno); dbms_output.put_line(v_workyears); p410(7):先创建一个函数: create or replace function c_emp1(v_empno emp.empno%type) return emp.sal%type as v_sal emp.sal%type; begin select sal into v_sal from emp where empno=v_empno; return v_sal; end c_emp1; 在调用函数: declare v_empno emp.empno%type; v_sal emp.sal%type; begin v_empno:=&x; v_sal:=c_emp1(v_empno); dbms_output.put_line(v_sal); end; p410(9): 先创建函数: create or replace function a(v_empno emp.empno%type) return emp.sal%type as v_deptno emp.deptno%type; v_avgsal emp.sal%type; begin select deptno into v_deptno from emp where empno=v_empno; select avg(sal) into v_avgsal from emp where deptno=v_deptno; return v_avgsal; end; 在调用: declare v_empno emp.empno%type; v_avgsal emp.sal%type; begin v_empno:=&x; v_avgsal:=a(v_empno); dbms_output.put_line(v_avgsal); end; (10): 先创建一个包规范: create or replace package pkg_emp as function func(v_deptno emp.deptno%type) return emp.sal%type; procedure proc(v_deptno emp.deptno%type); end pkg_emp; 在创建包体: create or replace package body pkg_emp as function func(v_deptno emp.deptno%type) return emp.sal%type as v_sal emp.sal%type; begin select min(sal) into v_sal from emp where deptno=v_deptno; return v_sal; end func; procedure proc(v_deptno emp.deptno%type) as v_sal emp.sal%type; begin select max(sal) into v_sal from emp where deptno=v_deptno; end proc; end pkg_emp;
最后调用包: declare v_deptno emp.deptno%type; v_minsal emp.sal%type; begin v_deptno:=&x; v_minsal:=pkg_emp.func(v_deptno); pkg_emp.proc(v_deptno); dbms_output.put_line(v_minsal); end;
创建数据库用户: (1):创建一个口令认证的数据库用户user3,口令为user3默认表空间为USERS ,配额为10MB,初始帐号为锁定状态。 create user user3 identified by user3 default tablespace users quota 10M on users account lock。 创建概要文件:create profile res_profile limit sessions_per_user 4 connect_time 60 idle_time 20 private_sga 100k cpu_per_call 100; 触发器: P410(13):create or replace trigger trg_emp1 after insert or update or delete on emp declare v_count number; v_sal emp.sal%type; begin if inserting or updating or deleting then select deptno,count(*),avg(sal) into v_count,v_sal from emp group by deptno; dbms_output.put_line(v_count||' '||v_sal); end if; end trg_emp1;