Oracle_PL_SQL经典练习题
- 格式:doc
- 大小:59.50 KB
- 文档页数:9
oracle常见sql⾯试题,ORACLEPLSQL超经典⾯试题《ORACLEPLSQL超经典⾯试题》由会员分享,可在线阅读,更多相关《ORACLEPLSQL超经典⾯试题(7页珍藏版)》请在⼈⼈⽂库⽹上搜索。
1、北京科蓝 PL/SQL 编程摸底考试(⼆)⽇期(date):2010年11⽉1⽇, (Nov. 1, 2010)考⽣姓名(Last Name, First Name):黄兴超试题⼀:在报表中增加描述。
Exam 1. Add description for insurance IDs on the report在Patient 表中存有病⼈的ID,和他所购买的保险的ID(代号)在Insurance 表中存有保险的ID(代号)及其描述(description)Patient table: Patient ID and Insurance ID (Ins_ID_1,Ins_ID_2, Ins_ID。
2、_3)Insurance table: Insurance ID and theirdescription.PatientInsurancePat_IDIns_ID_1Ins_ID_2Ins_ID_3Ins_IDDescription151Medicare282BlueCross34123OXFORD41141st Health Ins510715United Healthcare6576Travellers73727Medicaid84958CapitalHealthplan939MVP Healthcare10110Harvard Healthplan⽤Join的⽅式来产⽣如下的报表。
3、,每个Ins ID后⾯加上相应的描述。
如InsID不能在Insurance 表中发现,即⽤空格表⽰:(如ID 11 和12)Use “Join” to generate a report, each insurance ID followed by its description, if the insurance ID not in insurance table , leave blank.Pat_IDInsID1Desc-1InsID2Desc-2InsID3Desc-315United Healthcare28Capital Healthplan341st Health Ins124。
(完整word版)Oracle---PL-SQL经典练习题亲爱的读者:本文内容由我和我的同事精心收集整理后编辑发布到文库,发布之前我们对文中内容进行详细的校对,但难免会有错误的地方,如果有错误的地方请您评论区留言,我们予以纠正,如果本文档对您有帮助,请您下载收藏以便随时调用。
下面是本文详细内容。
最后最您生活愉快 ~O(∩_∩)O ~Oracle 作业题一.创建一个简单的PL/SQL程序块使用不同的程序块组件工作使用编程结构编写PL/SQL程序块处理PL/SQL程序块中的错误1.编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位。
declarev_emp emp%rowtype;beginselect * into v_emp from emp where ename='SMITH';dbms_output.put_line('员工的工作是:'||v_emp.job||' ;他的薪水是:'||v_emp.sal);end;2.编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置。
方法一:(传统方法)declarev_loc deptcp.dname%type;v_dname deptcp.dname%type;v_deptno deptcp.deptno%type;beginv_deptno :=&部门编号;select loc,dname into v_loc,v_dname from deptcp wheredeptno=v_deptno;dbms_output.put_line('员工所在地是:'||v_loc||';部门名称是:'||v_dname);exceptionwhen no_data_foundthen dbms_output.put_line('您输入的部门编号不存在,请从新输入,谢谢');end;方法二:(使用%rowtype)declarev_dept dept%rowtype;beginselect * into v_dept from dept where deptno=&部门号;dbms_output.put_line(v_dept.dname||'--'||v_dept.loc);end;3.编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。
OraclePLSQL习题PL/SQL习题:1、下列哪行代码有错误?1) DECLARE2) v_name varchar2(40):=’David Clark’;3)v_id number(4):=1001;4)v_status BOOLEAN:=FALSE;5)BEGIN6)INSERT INTO EMP(id,name,status)7)values(v_id,v_name,v_status);8)END;A. 第2行B. 第3行C. 第4行D. 第7行2、判断些列语句,v_price的值是多少时,将给变量v_grade赋值为’C’?IF v_price>1000 ThenV_grade:='A';ElseIf v_price>900 thenV_grade:='B';ElseIf v_price>800 thenV_grade:='C';ElseIf v_price>600 thenV_grade:='D';ElseV_grade:='E';End if;End if;End if;A. v_price大于1000B. v_price大于800C. v_price在801和900之间D. v_price在601和800之间3、什么情况下将引起while循环中断?A. 当条件的值是NULL时B. 当条件的值是FALSE时C. 当条件的值是TRUE时D. 当执行到EXIT语句时4、一个IF…THEN…ELSEIF语句可以有多少个else子句?A. 0B. 1C. 没有限制D. 645、考虑下列PL/SQL块时,有多少行被加入到numbers中?BEGINFOR IX IN 5..10LOOPIF IX=6 THENINSERT INTO NUMBERS VALUES(IX);ELSEIF IX=7 THENDELETE FROM NUMBERS;END IF;IF IX=7 THENROLLBACK;COMMIT;END IF;END IF;END LOOP;COMMIT;END;A. 6B. 1C. 5D. 06、假如C1是PL/SQL块中的定义游标,在游标打开之后,取第一条记录之前,C1%NOTFOUND的值是什么?A. TRUEB. FALSEC. NULLD. 都不是7、当下列PL/SQL块执行时,V1的值是什么?DECLAREV0 PLS_INTEGER;V1 BOOLEAN;BEGINBEGINSELECT COUNT(*) INTO V0 FROM EMP;END;BEGINV1:=SQL%FOUND;END;END;A. NULLB. TRUEC. FALSED. 代码清单8、下列代码中哪一行有错误?1)DECLARE2)CURSOR C_EMP IS SELECT EMPNO,SAL FROM EMP;3)R_EMP C_EMP%ROWTYPE;4)BEGIN5)OPEN C_EMP;6)LOOP7)FETCH C_EMP INTO R_EMP;8)EXIT WHEN C_EMP%NOTFOUND;9)UPDATE EMP SET SAL=SAL+50010)WHERE EMPNO=C_EMP.EMPNO;11)END LOOP;12)CLOSE C_EMP;13)END;A. 第2行B. 第3行C. 第7行D. 第8行E. 第10行9、下列PL/SQL执行后将显示什么?DECLAREX VARCHAR2(10):=’TITLE’;Y VARCHAR2(10):=’TITLE’;BEGINIF X>=Y THENDBMS_OUTPUT.PUT_LINE(‘X is greater’);End if;IF Y>=X THENDBMS_OUTPUT.PUT_LINE(‘Y is greater’);End if;END;A. X is greaterB. Y is greaterC. X is greater 和Y is greaterD. 两者都不是10、下列PL/SQL块的哪一行将引起一个错误?1) DECLARE2) CURSOR eCUR(en_IN number) IS3) SELECT * FROM emp WHERE empno=en_in;4) emp_info ecur%ROWTYPE;5) BEGIN6) OPEN ecur(7965);7) FETCH eCUR INTO emp_info;8) END;A. 第2行B. 第3行C. 第4行D. 没有引起错误11、在下列PL/SQL块的第3行将引发一个错误,该错误将在哪儿处理?1)BEGIN2) DECLARE TIMESTAMP DATE:='SYSDATE';3) BEGIN4) DBMS_output.put_line('sw'); --CALL_SOME_PROC;5) EXCEPTION6) WHEN VALUE_ERROR THEN7) DBMS_OUTPUT.PUT_LINE('VALUE ERROR');8) WHEN OTHERS THEN9) DBMS_OUTPUT.PUT_LINE('SOME OTHER ERROR');10) END;11)EXCEPTION12) WHEN OTHERS THEN13) D BMS_OUTPUT.PUT_LINE('unknown ERROR');14)15)END;A. 第7行B. 第9行C. 第13行D. 第9、13行12、什么类型的异常需要一条RAISE语句A. 一个命名的异常B. 一个用户定义异常C. 一个非命名的异常D. 在处理异常时从不需要RAISE语句13、下列PL/SQL代码做了什么工作?INVALID_DATE EXCEPTION;A. 定义一个异常B. 引发一个异常C. 联系一个异常D. 处理一个异常(异常信息:SQLCODE< 如:ORA-1422>、SQLERRM)14、哪些类型的异常不能在出错处理部分进行处理?A. 语法错误B. 数据库错误C. 数据类型不匹配错误D. 被零除错误15、在下列游标定义中错误是什么?CURSOR C1(PEMPNO IN NUMBER(4)) ISSELECT EMPNO,ENAME FROM EMPWHERE EMPNO=PEMPNO;A. 缺少INTO语句B. 在游标定义中,变量名前面需要加”:”C. 游标定义中不能指定inD. 在游标定义中不能指定数据类型的长度16、EMP表有下列数据empno ename salary comm deptno7369 SMITH 800 207499 ALLEN 1600 300 307521 WARD 1250 500 307566 JONES 2975 207654MARTIN 1250 1400 30下列PL/SQL块执行后,V_EMPNO的值是什么?(EMPNO是EMP 表的主键) SET SERVEROUTPUT ONDECLAREV_EMPNO EMP.EMPNO%TYPE:=800;CURSOR C_EMPNO(P_EMPNO EMP.EMPNO%TYPE:=7369) IS SELECT EMPNO FROM EMP WHERE EMPNO=P_EMPNO;BEGINOPEN C_EMPNO(null);FETCH C_EMPNO INTO V_EMPNO;CLOSE C_EMPNO;dbms_output.put_line(v_empno);END;A. 7369B. 800C. NULLD. 017、参看上题的emp数据,当下列块执行时,V_A的值是什么?DECLAREV_A NUMBER;V_E NUMBER;CURSOR C1 IS SELECT EMPNO FROM EMP;BEGINOPEN C1;LOOPFETCH C1 INTO V_E;V_A:=C1%ROWCOUNT;EXIT WHEN C1%NOTFOUND;END LOOP;CLOSE C1;END;A. 5B. 6C. 4D. 018、参看上题的emp数据,当下列块执行时,V_COUNT的值是什么?DECLAREV_COUNT NUMBER;R_EMP EMP%ROWTYPE;BEGINSELECT * INTO R_EMP FROM EMP WHERE EMPNO<7700;V_COUNT:=SQL%ROWCOUNT;END;A. 块内有错,执行将失败B. 4C. 5D. 019、参看上面的emp数据,当下列块执行时,将输出什么?Set serveroutput onDECLAREV_ENAME EMP.ENAME%TYPE;BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=9999;IF SQL%NOTFOUND THENDBMS_OUTPUT.PUT_LINE(‘NO SUCH EMPLOYEE NUMBER’);ELSEDBMS_OUTPUT.PUT_LINE(V_ENAME);END IF;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE(‘INVALID EMPLOYEE NUMBER’);END;A. 块执行时将返回一个错误B. NO SUCH EMPLOYEE NUMBERC. NO NAMED. INVALID EMPLOYEE NUMBER20、考虑下列执行块,当块执行并且没有记录被删除时,V_COUNT的值是什么?DECLAREV_COUNT NUMBER;BEGINDELETE FROM EMP WHERE EMPNO<0;V_COUNT:=SQL%ROWCOUNT;END;A. NULLB. TRUEC. 0D. FALSE21、在一个PL/SQL块中,执行任何语句之前SQL%NOTFOUND 的值是什么?A. NOTFOUNDB. TRUEC. NULLD. FALSE22、在一个块中不允许出现哪些命令?A. TRUNCATEB. DELETEC. SAVEPOINTD. ALTER TABLE23、考虑下列SELECT语句,假如没有满足where条件的行,将发生什么?Select count(*) into v_count from emp where sal<10;A. 引起一个NO_DATA_FOUND错误B. SELECT 将成功地执行C. 引起一个TOO_MANY_ROWS错误D. COUNT(*)在PL/SQL块内使用是无效的24、考虑下列PL/SQL块,选择最合适的答案。
习题四一、选择题1.关于PL/SQL程序设计语言的优点,说法不正确的是()A.PL/SQL是结构化查询语言,与SQL语言没有区别B.PL/SQL是集过程化功能和查询功能为一体的语言C.PL/SQL程序设计语言可以进行错误处理D.PL/SQL程序设计语言可以定义变量,使用控制结构2.关于在PL/SQL程序设计中使用输出语句,说法不正确的是()A.使用输出语句之前,需要激活系统包DBMS_OUTPUTB.输出语句为DBMS_OUTPUT系统包中的PUT_LINE函数C.激活输出包的语法为SET serveroutput OND.PL/SQL中行注释用符号"//"3.下列选项中,()是PL/SQL块的必选项。
A.DECLAREC. EXCEPTIOND. SELECTB.BEGIN4.在PL/SQL块中不能直接嵌人(A. SELECTB.INSERTC. CREATE TABLEMIT5.下列变量定义方法不正确的是()。
A.al VARCHAR2(10);a2 al%TYPE;B. a3 student.sno%TYPE;C. a4 student%ROWTYPE;D.b2 bl%TYPE;b1 VARCHAR2(10);6.下列记录类型的变量有()个分变量。
CURSOR s 1 IS SELECT sno, sname, age FROM student;v_c s_18 ROWTYPE;A.1B.2C.3D.47.在PL/SQL中,非法的标识符是()A. table $123B.123 tableC.table123D.Table_1238.判断IF语句∶IF v_num<5THEN v_example:= 1;ELSIF v_num<10 THEN v_example:= 2;ELSIF v_num>20 THEN v_example:= 3;ELSIF v_num>35 THEN v_example:=4;ELSE v_example:=5;END IF如果v_num是37,值()将被赋值给v_exampleA.1B.2C.3D.49.判断IF语句∶IF a>10 THEN b:=0;ELSE IF a>5 THEN b:= 1;ELSE THEN b:= 2;END;上述语句中有()处错误。
Oracle数据库基础学习(⼋)PLSQL综合练习1、定义游标:列出每个员⼯的姓名、部门名称并编程显⽰第10个到第20个记录。
declarecursor zemp_cursor is (select temp.ename, temp.dnamefrom (select e.ename, d.dname, ROWNUM rnfrom zemp e, zdept dwhere e.deptno=d.deptno(+)and ROWNUM<=20) tempwhere temp.rn >10) ;beginfor zemp_record in zemp_cursor loop --隐式打开游标dbms_output.put_line('ename is '|| zemp_record.ename ||' dname is '|| zemp_record.dname) ;end loop; --隐式关闭游标end;/2、定义游标:从雇员表中显⽰⼯资⼤于3000的记录,只要姓名、部门编号和⼯资。
编程显⽰其中的奇数记录。
declarecursor zemp_cursor is (select ROWNUM rn, ename, deptno, salfrom zempwhere sal >3000) ;beginfor zemp_record in zemp_cursor loop--if mod(zemp_record.rn, 2)<>0 thenif mod(zemp_cursor%rowcount, 2)<>0thendbms_output.put_line( zemp_cursor%rowcount--zemp_record.rn||' ename is '|| zemp_record.ename||' deptno is '|| zemp_record.deptno||' sal is '|| zemp_record.sal) ;end if ;end loop;end;/3、计算下⾯级数当末项⼩于0.001时的部分和。
Oracle课程中的PL与SQL编程基础练习题1、输出九九乘法表declarei int;j int;beginfor i in 1..9 loopfor j in 1..i loopdbms_output.put(i||'*'||j||'='||(i*j)||' ');end loop;dbms_output.put_line(' ');end loop;end;2、输出名为SMITH的雇员的薪水和职位declarev_name emp1.ename%type:='&name';v_emp emp1%rowtype;beginselect sal,job into v_emp.sal,v_emp.job from emp where ename=upper(v_name);dbms_output.put_line('名字为:'||v_name||' 薪水为:'||v_emp.sal||' 工作岗位为:'||v_emp.job);end;3、接收部门编号,输出部门名和地理位置(DEPT表)declarev_no dept1.deptno%type:='&deptno';v_dept dept1%rowtype;beginselect DNAME,loc into v_dept.DNAME,v_dept.loc from dept where deptno=v_no;dbms_output.put_line('部门编号为:'||v_no||' 部门名称为:'||v_dept.dname||' 部门地理位置为:'||v_dept.loc);end;4、接收雇员号,输出该雇员的工资和提成,没有佣金的用0替代。
1、编写一个PL/SQL程序块,对名字以“A”或“S”开头的所有雇员按他们基本薪水的10%给他们加薪。
2、编写一个PL/SQL程序块,对所有的销售员增加佣金500。
3、编写一个PL/SQL程序块以提升两个资格最老的“职员”为“高级职员”。
(提示:工作时间越长,资
格越老)
4、编写一个PL/SQL程序块,对所有雇员按他们基本薪水的10%给他们加薪。
如果加薪后的薪水大于5000,
则取消加薪。
5、编写一个PL/SQL程序块以接受用户输入的三个数值并显示其中的最大值。
6、编写一个PL/SQL程序块以显示指定名称的雇员所在的部门名称和部门位置。
7、编写一个给指定雇员加薪10%的PL/SQL程序块,之后,检查如果已经雇佣该雇员超过60个月,则给
他额外加薪3000。
8、编写一个PL/SQL程序块以检查指定雇员的薪水是否在有效范围内。
不同职位的薪水范围为
Designation Range
Clerk 1500~2500
Salesman 2501~3500
Analyst 3501~4500
Others 4501 and above
如果薪水在此范围内,则显示消息“Salary is OK!”,否则,更新薪水为该范围内的最小值。
9、编写一个PL/SQL程序块以显示某个雇员在此组织中的工作天数。
Oracle SQL&PLSQL Test一、选择题(共30题;每题3分)1.Oracle发出下列select语句:SQL> select e.empno, e.ename, d.loc2 from emp e, dept d3 where e.deptno = d.deptno4 and substr(e.ename, 1, 1) = ‘S’;下列哪个语句是Oracle数据库中可用的ANSI兼容等价语句?A.select empno, ename, loc from emp join dept on emp.deptno = dept.deptno where substr(emp.ename, 1, 1) = ‘S’;B.select empno, ename, loc from emp, dept on emp.deptno = dept.deptno where substr(emp.ename, 1, 1) = ‘S’;C.select empno, ename, loc from emp join dept where emp.deptno = dept.deptno and substr(emp.ename, 1, 1) = ‘S’;D.select empno, ename, loc from emp left join dept on emp.deptno = dept.deptno and substr(emp.ename, 1, 1) = ‘S’;2.用下列代码回答问题:Examine the data in the EMPLOYEES and DEPARTMENTS tables.You want to retrieve all employees, whether or not they have matching departments in the departments table. Which query would you use?需要检索出无论雇员是否和部门匹配的记录A. SELECT last_name, department_nameFROM employees , departments(+);B. SELECT last_name, department_nameFROM employees JOIN departments (+);C. SELECT last_name, department_nameFROM employees(+) e JOIN departments dON (e.department_id = d.department_id);D. SELECT last_name, department_nameFROM employees eRIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);E. SELECT last_name, department_nameFROM employees(+) , departmentsON (e.department_id = d.department_id);F. SELECT last_name, department_nameFROM employees e LEFT OUTERJOIN departments d ON (e.department_id = d.department_id);3.公司销售数据库包含一个PROFITS表,按产品名、销售地区和季度列出利润信息。
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。
oracle pl/sql实例练习第一部分:oracle pl/sql实例练习(1)一、使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)dept部门表(deptno部门编号/dname部门名称/loc地点)工资=薪金+佣金也可以通过以下脚本测试:create table DEPT(DEPTNO NUMBER(2) not null,DNAME VARCHAR2(14),LOC VARCHAR2(13))tablespace USERS;alter table DEPT add constraint PK_DEPT primary key (DEPTNO);insert into DEPT (DEPTNO, DNAME, LOC)values (10, 'ACCOUNTING', 'NEW YORK');insert into DEPT (DEPTNO, DNAME, LOC)values (20, 'RESEARCH', 'DALLAS');insert into DEPT (DEPTNO, DNAME, LOC)values (30, 'SALES', 'CHICAGO');insert into DEPT (DEPTNO, DNAME, LOC)values (40, 'OPERATIONS', 'BOSTON');commit;create table EMP(EMPNO NUMBER(4) not null,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7,2),COMM NUMBER(7,2),DEPTNO NUMBER(2))tablespace USERS;alter table EMP add constraint PK_EMP primary key (EMPNO);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 300, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 500, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 1400, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850, null, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450, null, 10);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000, null, 10);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500, 0, 30);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, null, 20);insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, null, 10);commit;二、问题:1.列出至少有一个员工的所有部门。
Oracle 作业题一.创建一个简单的PL/SQL程序块使用不同的程序块组件工作使用编程结构编写PL/SQL程序块处理PL/SQL程序块中的错误1.编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位。
declarev_emp emp%rowtype;beginselect * into v_emp from emp where ename='SMITH';dbms_output.put_line('员工的工作是:'||v_emp.job||' ;他的薪水是:'||v_emp.sal);end;2.编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置。
方法一:(传统方法)declarev_loc deptcp.dname%type;v_dname deptcp.dname%type;v_deptno deptcp.deptno%type;beginv_deptno :=&部门编号;select loc,dname into v_loc,v_dname from deptcp where deptno=v_deptno; dbms_output.put_line('员工所在地是:'||v_loc||';部门名称是:'||v_dname); exceptionwhen no_data_foundthen dbms_output.put_line('您输入的部门编号不存在,请从新输入,谢谢');end;方法二:(使用%rowtype)declarev_dept dept%rowtype;beginselect * into v_dept from dept where deptno=&部门号;dbms_output.put_line(v_dept.dname||'--'||v_dept.loc);end;3.编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。
(*期末考试试题*)declarev_sal emp.sal%type;beginselect sal+comm into v_sal from emp where empno=&雇员号;dbms_output.put_line(v_sal);end;4.编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。
方式一:(错误程序)(让学生思考错在哪里?)declarev_emp empcp%rowtype;beginselect*into v_emp from empcp where empno = &雇员编号;dbms_output.put_line('整体薪水是:'||v_emp.sal+v_m);end;declarev_emp emp%rowtype;beginselect * into v_emp from emp where empno=&雇员号;dbms_output.put_line(v_emp.sal+v_m);end;5.某公司要根据雇员的职位来加薪,公司决定按下列加薪结构处理:Designation Raise-----------------------Clerk 500Salesman 1000Analyst 1500Otherwise 2000编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。
(*期末考试试题*)declarev_emp emp%rowtype;beginselect * into v_emp from emp where ename='&name';if v_emp.job='CLERK'thenupdate emp set sal=sal+500 where empno=v_emp.empno;elsif v_emp.job='SALESMAN'thenupdate emp set sal=sal+1000 where empno=v_emp.empno;elsif v_emp.job='ANALYST'thenupdate emp set sal=sal+1500 where empno=v_emp.empno;elseupdate emp set sal=sal+2000 where empno=v_emp.empno;end if;commit;end;6.编写一个程序块,将emp表中雇员名全部显示出来。
declarecursor v_cursor is select * from emp;beginfor v_emp in v_cursorloopdbms_output.put_line(v_emp.ename);end loop;end;7.编写一个程序块,将emp表中前5人的名字显示出来。
declarecursor v_cursor is select * from emp;v_count number :=1;beginfor v_emp in v_cursorloopdbms_output.put_line(v_emp.ename);v_count := v_count+1;exit when v_count>5;end loop;end;8.编写一个程序块,接受一个雇员名,从emp表中显示该雇员的工作岗位与薪水,若输入的雇员名不存在,显示“该雇员不存在”信息。
(*期末考试试题*)declarev_emp emp%rowtype;my_exception Exception;beginselect * into v_emp from emp where ename='&name';raise my_exception;exceptionwhen no_data_found thendbms_output.put_line('该雇员不存在!');when others thendbms_output.put_line(v_emp.job||'---'||v_emp.sal);end;9.接受两个数相除并且显示结果,如果第二个数为0,则显示消息“除数不能为0”(课堂未讲)。
declarev_dividend float;v_divisor float;v_result float;my_exception Exception;beginv_dividend:=&被除数;v_divisor:=&除数;v_result:=v_dividend/v_divisor;raise my_exception;exceptionwhen my_exception thendbms_output.put_line(v_result);when others thendbms_output.put_line('除数不能为0');end;二.声明和使用游标使用游标属性使用游标For循环工作声明带参数的游标(使用FOR UPDATE OF和CURRENT OF子句工作)1.通过使用游标来显示dept表中的部门名称。
declarecursor v_cursor is select * from dept;beginfor v_dept in v_cursorloopdbms_output.put_line(v_dept.dname);end loop;2.使用For循环,接受一个部门号,从emp表中显示该部门的所有雇员的姓名,工作和薪水。
declarecursor v_cursor is select * from emp where deptno=&部门号;beginfor v_emp in v_cursorloopdbms_output.put_line(v_emp.ename||'--'||v_emp.job||'--'||v_emp.sal);end loop;end;3.使用带参数的游标,实现第2题。
declarecursor v_cursor(p_deptno number) is select * from emp wheredeptno=p_deptno;v_deptno number(2);beginv_deptno:=&部门号;for v_emp in v_cursor(v_deptno)loopdbms_output.put_line(v_emp.ename||'--'||v_emp.job||'--'||v_emp.sal);end loop;end;4.编写一个PL/SQL程序块,从emp表中对名字以“A”或“S”开始的所有雇员按他们基本薪水的10%给他们加薪。
declarecursor v_cursor is select * from emp;beginfor v_emp in v_cursorloopif v_emp.ename like'A%'thenupdate emp set sal=sal+sal*0.1 where empno=v_emp.empno;elsif v_emp.ename like'S%'thenupdate emp set sal=sal+sal*0.1 where empno=v_emp.empno;end if;commit;end loop;5.emp表中对所有雇员按他们基本薪水的10%给他们加薪,如果所增加后的薪水大于5000卢布,则取消加薪。
declarecursor v_cursor isselect * from emp;beginfor v_emp in v_cursor loopif v_emp.sal * 1.1 < 5000thenupdate emp set sal = sal * 1.1where empno = v_emp.empno;end if;commit;end loop;end;三,创建PL/SQL记录和PL/SQL表创建过程创建函数3.创建一个过程,能向dept表中添加一个新记录.(in参数)create or replace procedureinsert_dept(dept_no in number,dept_name in varchar2,dept_loc in varchar2)isbegininsert into dept values(dept_no,dept_name,dept_loc);end;调用该存储过程:begininsert_dept(50,'技术部','武汉');end;4.创建一个过程,从emp表中带入雇员的姓名,返回该雇员的薪水值。