Oracle_PL_SQL经典练习题

合集下载

oracle常见sql面试题,ORACLEPLSQL超经典面试题

oracle常见sql面试题,ORACLEPLSQL超经典面试题

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。

Oracle---PL-SQL经典练习题

Oracle---PL-SQL经典练习题

(完整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习题

OraclePLSQL习题

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块,选择最合适的答案。

oracle 第四章PLSQL习题及答案

oracle 第四章PLSQL习题及答案

习题四一、选择题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综合练习

Oracle数据库基础学习(八)PLSQL综合练习

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编程基础练习题

Oracle课程中的PL与SQL编程基础练习题

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替代。

oracle练习题

oracle练习题

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考试试卷

oracle 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表,按产品名、销售地区和季度列出利润信息。

PLSQL基础练习题

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。

oracle plsql实例练习

oracle plsql实例练习

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.列出至少有一个员工的所有部门。

PLSQL试题

PLSQL试题

PL/SQL试题姓名:________一.选择题(18’)1.Oracle数据库中为新创建的表分配的初始空间通常有多大()A.一个块B.一个区C.一个段D.一个表空间2.关于存储过程参数,正确说法的是()A.存储过程的输出参数可以是标量类型,也可以是表类型B.存数过程输入参数可以不输入信息而调用调用过程C.可以指定字符参数的字符长度,(函数的()或者过程的(number/varchar2))D.以上说法都不对3.下列说法正确的是()A.只要在存储过程中有增删改语句,一定要加自治事务B.在函数内可以修改表数据C.函数不能递归调用D.以上说法都不对4.关于触发器,下列说法正确的是()A.可以在表上创建INSTEAD OF 触发器B.与聚集触发器不能使用“:old”和“:new”C.行级触发器不能用于审计D.触发器可以显示调用5.下列哪些是oracle的伪列()(多选)A.ROWIDB.ROW_NUMBER()C.LEVELD.ROWNUM6.当表的重复行数据很多时,应该创建的索引类型应该是()A.B树B.R everseC.B itmapD. 函数索引二.填空题(10’)1.事务的特性有___ __、__ ___、___ ___、___ __ 。

(4’)2.定义游标的过程包括:声明游标中将要使用的变量、声明游标、_____、_____、和关闭游标(2’)3.子程序包括______和_______。

(2’)4.%type关键字作用是_________.(2’)三.编程题1.某公司要根据雇员的职位来加薪,公司决定按如下列加薪结构处理:(22’)DesignationClerk 500Salesman 1000Analyst 1500Otherwise 2000编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。

2、编写一个函数以检查所指定雇员的薪水是否在有效范围内。

不同职位的薪水范围为:(20’)Designation RaiseClerk 1500-2500Salesman 2501-3500Analyst 3501-4500Others 4501 and above如果薪水在此范围内,则显示消息”Salary is OK”,否则更新薪水为该范围内的最小值。

oracleplsql练习题-考核题

oracleplsql练习题-考核题

oracleplsql练习题-考核题数据库脚本:– Create table 学⽣信息create table HAND_STUDENT(STUDENT_NO VARCHAR2(10) not null,STUDENT_NAME VARCHAR2(20),STUDENT_AGE NUMBER(2),STUDENT_GENDER VARCHAR2(5));– Add comments to the tablecomment on table HAND_STUDENTis ‘学⽣信息表’;– Add comments to the columnscomment on column HAND_STUDENT.STUDENT_NOis ‘学号’;comment on column HAND_STUDENT.STUDENT_NAMEis ‘姓名’;comment on column HAND_STUDENT.STUDENT_AGEis ‘年龄’;comment on column HAND_STUDENT.STUDENT_GENDERis ‘性别’;– Create/Recreate primary, unique and foreign key constraintsalter table HAND_STUDENT add primary key (STUDENT_NO);– Create table 教师信息表create table HAND_TEACHER(TEACHER_NO VARCHAR2(10) not null,TEACHER_NAME VARCHAR2(20),MANAGER_NO VARCHAR2(10));– Add comments to the tablecomment on table HAND_TEACHERis ‘教师信息表’;– Add comments to the columnscomment on column HAND_TEACHER.TEACHER_NOis ‘教师编号’;comment on column HAND_TEACHER.TEACHER_NAMEis ‘教师名称’;comment on column HAND_TEACHER.MANAGER_NOis ‘上级编号’;– Create/Recreate primary, unique and foreign key constraintsalter table HAND_TEACHER add primary key (TEACHER_NO);– Create table 课程信息表create table HAND_COURSE(COURSE_NO VARCHAR2(10) not null,COURSE_NAME VARCHAR2(20),TEACHER_NO VARCHAR2(20) not null);– Add comments to the tablecomment on table HAND_COURSEis ‘课程信息表’;– Add comments to the columnscomment on column HAND_COURSE.COURSE_NOis ‘课程号’;comment on column HAND_COURSE.COURSE_NAMEis ‘课程名称’;comment on column HAND_COURSE.TEACHER_NOis ‘教师编号’;– Create/Recreate primary, unique and foreign key constraintsalter table HAND_COURSE add constraint PK_COURSE primary key (COURSE_NO, TEACHER_NO);– Create table 成绩信息表create table HAND_STUDENT_CORE(STUDENT_NO VARCHAR2(10) not null,COURSE_NO VARCHAR2(10) not null,CORE NUMBER(4,2));– Add comments to the tablecomment on table HAND_STUDENT_COREis ‘学⽣成绩表’;– Add comments to the columnscomment on column HAND_STUDENT_CORE.STUDENT_NOis ‘学号’;comment on column HAND_STUDENT_CORE.COURSE_NOis ‘课程号’;comment on column HAND_STUDENT_CORE.COREis ‘分数’;– Create/Recreate primary, unique and foreign key constraintsalter table HAND_STUDENT_CORE add constraint PK_SC primary key (STUDENT_NO, COURSE_NO); /*初始化学⽣表的数据**/insert into HAND_STUDENT values (‘s001’,’张三’,23,’男’);insert into HAND_STUDENT values (‘s002’,’李四’,23,’男’);insert into HAND_STUDENT values (‘s003’,’吴鹏’,25,’男’);insert into HAND_STUDENT values (‘s004’,’琴沁’,20,’⼥’);insert into HAND_STUDENT values (‘s005’,’王丽’,20,’⼥’);insert into HAND_STUDENT values (‘s006’,’李波’,21,’男’);insert into HAND_STUDENT values (‘s007’,’刘⽟’,21,’男’);insert into HAND_STUDENT values (‘s008’,’萧蓉’,21,’⼥’);insert into HAND_STUDENT values (‘s009’,’陈萧晓’,23,’⼥’);insert into HAND_STUDENT values (‘s010’,’陈美’,22,’⼥’);commit;/********初始化教师表*************/insert into HAND_TEACHER values (‘t001’, ‘刘阳’,”);insert into HAND_TEACHER values (‘t002’, ‘谌燕’,’t001’);insert into HAND_TEACHER values (‘t003’, ‘胡明星’,’t002’);commit;/*****初始化课程表******************/insert into HAND_COURSE values (‘c001’,’J2SE’,’t002’);insert into HAND_COURSE values (‘c002’,’Java Web’,’t002’);insert into HAND_COURSE values (‘c003’,’SSH’,’t001’);insert into HAND_COURSE values (‘c004’,’Oracle’,’t001’);insert into HAND_COURSE values (‘c005’,’SQL SERVER 2005’,’t003’);insert into HAND_COURSE values (‘c006’,’C#’,’t003’);insert into HAND_COURSE values (‘c007’,’JavaScript’,’t002’);insert into HAND_COURSE values (‘c008’,’DIV+CSS’,’t001’);insert into HAND_COURSE values (‘c009’,’PHP’,’t003’);insert into HAND_COURSE values (‘c010’,’EJB3.0’,’t002’);commit;/*****初始化成绩表*************/insert into HAND_STUDENT_CORE values (‘s001’,’c001’,58.9);insert into HAND_STUDENT_CORE values (‘s002’,’c001’,80.9);insert into HAND_STUDENT_CORE values (‘s003’,’c001’,81.9);insert into HAND_STUDENT_CORE values (‘s004’,’c001’,60.9);insert into HAND_STUDENT_CORE values (‘s001’,’c002’,82.9);insert into HAND_STUDENT_CORE values (‘s002’,’c002’,72.9);insert into HAND_STUDENT_CORE values (‘s003’,’c002’,81.9);insert into HAND_STUDENT_CORE values (‘s001’,’c003’,’59’);commit;1.查询没学过“谌燕”⽼师课的同学,显⽰(学号、姓名)select out_stu.student_no, out_stu.student_name from hand_studentout_stu where out_stu.student_no not in(select distinct hs.student_nofrom hand_course c,hand_teacher t,hand_student hs,hand_student_core hscwhere c.teacher_no = t.teacher_noand hs.student_no = hsc.student_noand hsc.course_no = c.course_noand t.teacher_name = ‘谌燕’)SELECT hs.student_no, hs.student_name FROM hand_student hs WHERENOT EXISTS (SELECT 1FROM hand_course hc,hand_teacher ht,hand_student_core hscWHERE hc.teacher_no = ht.teacher_noAND hc.course_no = hsc.course_noAND ht.teacher_name = ‘谌燕’AND hsc.student_no = hs.student_no);2.查询没有学全所有课的同学,显⽰(学号、姓名)select hs.student_no, hs.student_name from hand_student hs,hand_student_core hsc where hs.student_no = hsc.student_no(+) groupby hs.student_no, hs.student_name having count(hsc.course_no) <(select count(*) from hand_course c);3.查询 c001 课程⽐ c002 课程成绩⾼的所有学⽣,显⽰:学号,姓名select stu.student_no,stu.student_name from hand_student stu,(select t1.student_nofrom (select *from hand_student_core scwhere sc.course_no = ‘c001’) t1,(select *from hand_student_core scwhere sc.course_no = ‘c002’) t2where t1.student_no = t2.student_noand t1.core > t2.core) tt where stu.student_no = tt.student_no4.按各科平均成绩和及格率的百分数,按及格率⾼到低的顺序排序,显⽰(课程号、平均分、及格率)select hsc.course_no,avg(hsc.core),sum(casewhen hsc.core > 60 then1elseend) / count() 100 || ‘%’ pass_rate from hand_student_core hsc group by hsc.course_no order byto_number(substr(pass_rate, 1, length(pass_rate) - 1)) desc5.1992年之后出⽣的学⽣名单找出年龄最⼤和最⼩的同学,显⽰(学号、姓名、年龄)SELECT hs.student_no, hs.student_name, hs.student_age FROMhand_student hs,(SELECT MAX(hs.student_age) max_age, MIN(hs.student_age) min_ageFROM hand_student hsWHERE to_number(to_char(SYSDATE, ‘yyyy’)) - hs.student_age > 1992) hh WHERE hs.student_age = hh.max_ageOR hs.student_age = hh.min_age;6.列出矩阵类型各分数段⼈数,横轴为分数段[100-85]、[85-70]、[70-60]、[<60],纵轴为课程号、课程名称(提⽰使⽤case when句式)SELECT hsc.course_no,hc.course_name,SUM(CASEWHEN hsc.core BETWEEN 85 AND 100 THEN1ELSEEND) AS “[100-85]”,SUM(CASEWHEN hsc.core BETWEEN 70 AND 85 THEN1ELSEEND) AS “[85-70]”,SUM(CASEWHEN hsc.core BETWEEN 60 AND 70 THEN1ELSEEND) AS “[70-60]”,SUM(CASEWHEN hsc.core < 60 then1ELSEEND) AS “[<60]” FROM hand_student_core hsc, hand_course hc WHERE hsc.course_no = hc.course_no GROUP BYhsc.course_no,hc.course_name;7.查询各科成绩前三名的记录:(不考虑成绩并列情况),显⽰(学号、课程号、分数)SELECT student_no, course_no, core FROM (SELECT hsc.student_no,hsc.course_no,hsc.core,DENSE_RANK() OVER(PARTITION BY hsc.course_no ORDER BY hsc.core DESC) ranksFROM hand_student_core hsc) WHERE ranks < 4;8.查询选修“谌燕”⽼师所授课程的学⽣中每科成绩最⾼的学⽣,显⽰(学号、姓名、课程名称、成绩)SELECT hs.student_no,hs.student_name,hc.course_name,hsc.core FROM hand_student hs,hand_student_core hsc,hand_course hc,hand_teacher ht WHERE hs.student_no = hsc.student_no AND hsc.course_no = hc.course_no AND hc.teacher_no =ht.teacher_noAND ht.teacher_name = ‘谌燕’ AND hsc.core = (SELECT MAX(sc.core)FROM hand_student_core scWHERE sc.course_no = hc.course_no);9.查询两门以上不及格课程的同学及平均成绩,显⽰(学号、姓名、平均成绩(保留两位⼩数))SELECT hsc.student_no,hs.student_name,ROUND(AVG(hsc.core),2) avg_core FROM hand_student_core hsc,hand_student hs WHERE EXISTS (SELECT sc.student_noFROM hand_student_core scWHERE sc.core < 60AND sc.student_no = hsc.student_noGROUP BY sc.student_noHAVING COUNT(sc.student_no) > 1) AND hsc.student_no = hs.student_no GROUP BY hsc.student_no,hs.student_name;10。

OraclePLSQL测试题与答案(绝对经典)

OraclePLSQL测试题与答案(绝对经典)

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价格>1000 产品表B、select sum(价格所属分类 having max(价格价格)>1000 产品表 group by 所属分类价格) from 产品表C、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、ROWID B、ROW_NUMBER() C、LEVEL D、ROWNUM E、COLUMN 7、当表的重复行数据很多时,应该创建的索引类型应该是(、当表的重复行数据很多时,应该创建的索引类型应该是( C )A、B树B 、reverse C 、bitmap D 、函数索引、函数索引8、在建表时如果希望某列的值,在一定的范围内,应建什么样的约束?(C )A 、primary key B 、unique C 、check D 、not null 9、利用游标来修改数据时,所用的。

经典_Oracle的sql语句百例训练

经典_Oracle的sql语句百例训练

经典_Oracle的sql语句百例训练oracle系列《一》:简单sql与单行函数使用scott/tiger用户下的emp表和dept表中顺利完成以下练,表的结构表明如下dept部门表(deptno部门编号/dname部门名称/loc地点)工资=薪金+佣金登入oracle数据库1、sqlplusscott/tiger2、sqlplus/nologsql>connscott/tiger若是使用sys的账号进行登录的话,则使用以下语句sql>conn/assysdba【1】emp表中内容查阅sql>select*fromemp;失效,原因就是没找出该表中,因为该表时scott用户的表中,所以查阅时必须加之scott.emp就可以了【2】显示当前用户sql>showuser【3】查看当前用户的所有表sql>select*fromtab;【4】若想重复继续执行上一条sql语句,则在sqlplus命令行下输出\即可【5】查询一张表的结构,例如dept表sql>descdept【6】在雇员表查阅雇员的编号、姓名、工作sql>selectempno,ename,jobfromemp;【7】可以为列名取别名,在linux下oracle如果英文别名不加上双引号则会变成大写sql>selectempno编号,ename姓名,job工作fromemp;【8】查询所有的工作sql>selectdistinctjobfromemp;工作可能会重复,加之distinct关键字【9】若要求按照以下的格式进行结果输出,如no:7469,name:smith,job:clerksql>select'no:'||empno||',name:'||ename||',job:'||jobfromemp;【10】建议列举每个雇员的姓名及年薪【11】查看每月可以得到奖金的雇员信息【12】建议基本工资大于1500,同时可以申领奖金的雇员信息【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息【14】查阅在1981年雇用的全部雇员信息,between..and涵盖等同于的情况sql>select*fromempwherehiredatebetween'01-jan-81'and'31-dec-81';【15】oracle对大小敏感,所以查询时名字要区分大小写【16】建议查阅出来雇员编号不是7369、7499的雇员信息sql>select*fromempwhereempnonotin(7369,7499);【17】sql中like语句必须特别注意通配符%和_sql>select*fromempwherehiredatelike'?%';【18】查阅雇员编号不是7369的雇员信息,采用<>或!=sql>select*fromempwhereempno<>7369;【19】要求对雇员的工资由低到高进行排序,升序为默认(asc),降序(desc)sql>select*fromempgroupbysal;【20】查阅出来部门号为10的雇员信息,查阅的信息按照工资从低至高,若工资成正比则按雇佣日期从早到晚排序sql>select*fromempwheredeptno=10groupbysaldesc,hiredateasc;数据库系统中,每个数据库之间区别最小的就是在函数的积极支持上,单行函数就是最简单的函数,单行函数分成1、字符函数:接受字符输入并且返回字符或数值2、数值函数:接受数值输入并返回数值3、日期函数:对日期型数据进行操作4、切换函数:将一种数据初始化为另一种数据类型5、通用型函数:nvl、decode函数字符函数:【1】大小写切换upper和lowersql>selectupper('smith')fromdual;【2】将雇员姓名变为开头字母大写,initcapsql>selectinitcap(ename)fromemp;字符函数中存有相连接函数concat,但不如||不好用,除了字符串处置的一些函数字符串撷取:substr()字符串长度:length()内容替代:replace()sql>selectsubstr('hello',1,3),length('hello'),replace('hello','l','x')fromdual;这里注意的是oracle中字符串截取从0和从1开始都是一样的,谨防面试提问【3】建议表明所有雇员的姓名及姓名的后3个字符sql>selectename,substr(ename,length(ename)-2)fromemp;以上操作显得较为麻烦,substr()函数是可以倒着截取sql>selectename,substr(ename,-3,3)fromemp;数值函数:1、四舍五入:round()2、截断小数位:trunc()3、取余(取模):modsql>selectround(789.536)fromdual;【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)sql>selectround(783.56,2)fromdual;【2】使用mod()函数进行取余操作sql>selectmod(10,3)fromdual;日期函数:1、日期-数字=日期2、日期+数字=日期3、日期-日期=数字(天数)【1】求出当前日期sql>selectsysdatefromdual;oracle提供了以下的日期函数支持:months_between():谋出来给定日期范围的月数add_months():在指定日期上加上指定的月数,求出之后的日期next_day():下一个的今天的日期last_day():谋出来给定日期的最后一天日期【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数sql>selectempno,ename,round(months_between(sysdate,hiredate))fromemp;。

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. 修改上述触发器的示例,当插入的学生不存在于学生表格中时,抛出异常,阻止插入操作。

oracle plsql考试试卷

oracle plsql考试试卷

Oracle SQL&PL/SQL Test一、选择题(45 * 2)1.用下列代码块回答问题:SQL> select ______(-45) as output from dual;OUTPUT-------45下列哪个单行函数无法产生这个输出?A.abs() B.ceil() C.floor() D.round()2.用下列代码回答问题:Evaluate the set of SQL statements:CREATE TABLE dept(deptno NUMBER(2),dname VARCNAR2(14),loc VARCNAR2(13));ROLLBACK;DESCRIBE DEPTWhat is true about the set?哪个语句是正确的?A. The DESCRIBE DEPT statement displays the structure of the DEPT table.B. The ROLLBACK statement frees the storage space occupies by the DEPT table.C. The DESCRIBE DEPT statement returns an error ORA-04043: object DEPT does not exist.D. The DESCRIBE DEPT statement displays the structure of the DEPT table only ifthere is a COMMIT statement introduced before the ROLLBACK statement.3.用下列代码回答问题:Examine the structure of the EMPLOYEES and DEPARTMENTS tables:检查如下表结构EMPLOYEESColumn name Data type RemarksEMPLOYEE_ID NUMBER NOT NULL, Primary KeyEMP_NAME VARCHAR2 (30)JOB_ID VARCHAR2 (20)SALARY NUMBERMGR_ID NUMBER References EMPLOYEE_ID COLUMNDEPARTMENT ID NUMBER Foreign key to DEPARTMENT IDcolumn of the DEPARTMENTS tableDEPARTMENTSColumn name Data type RemarksDEPARTMENT_ID NUMBER NOT NULL, Primary KeyDEPARTMENT_NAME VARCHAR2(30)MGR_ID NUMBER References MGR_ID column of theEMPLOYEES tableEvaluate this SQL statement:SELECT employee_id, e.department_id, department_name,salaryFROM employees e, departments dWHERE e.department_id = d.department_id;Which SQL statement is equivalent to the above SQL statement?一下哪个语句和上面的语句执行结果相同?A. SELECT employee_id, department_id, department_name,salaryFROM employeesWHERE department_id IN (SELECT department_idFROM departments);B. SELECT employee_id, department_id, department_name,salaryFROM employeesNATURAL JOIN departments;C. SELECT employee_id, d.department_id, department_name,salaryFROM employees eJOIN departments dON e.department_id = d.department_id;D. SELECT employee_id, department_id, department_name,SalaryFROM employeesJOIN departmentsUSING (e.department_id, d.department_id);4.运行下列哪个查询时会产生错误?A.select deptno, job, sum(sal) from emp group by job, deptno;B.select sum(sal), deptno, job from emp group by job, deptno;C.select deptno, job, sum(sal) from emp;D.select deptno, sum(sal), job from emp group by job, deptno;5.检查下列SQL的输出SQL> select a.deptno,a.job,b.loc,sum(a.sal)2 from emp a,dept b3 where a.deptno = b.deptno4 group by a.deptno,a.job,b.loc5 order by sum(a.sal);这个查询结果将以哪个列的顺序输出?A.DEPTON B.A.JOB C.B.LOC D.SUM(A.SAL)6.要查询的PROFITS表存储公司不同地区、产品类型和季度的利润信息。

数据库plsql考试题

数据库plsql考试题

数据库试题(共50分)填空(每空1分,共5分)1、SQL是处理关系数据库的标准语言,用于事务回滚的语句是,用于事务提交的语句是。

2、查询语句中,关键字可从SELECT 语句的结果中除去重复的行,子句可指定结果集的排序,有ASC、DESC两种排序顺序,关键字可以指定结果集分组。

不定项选择题(每空2分,必需全部选正确,共32 分)1、请看下面的查询语句SELECT * FROM tables WHERE name LIKE '%LOG'执行该语句可以:( )A、从表tables中查找name为"%LOG"的记录B、从表tables中查找name中最前面三个字符是"LOG"的所有记录C、从表tables中查找name中最后面三个字符是"LOG"的所有记录D、从表tables中查找name为LIKE '%LOG'的记录2、请看下面的删除语句:DELETE employee_id, salary, job_idFROM employeesWHERE dept_id = 90;请问这个删除语句为什么会执行失败?( )A、EMPLOYEES表中没有dept_id为90的记录B、不能在删除语句的DELETE后面指定列名C、不能删除JOB_ID列,因为它是一个非空列D、不能删除EMPLOYEE_ID列,因为它是主键3、请看下面的查询语句:SELECT LAST_NAME, SALARY, DEPARTMENT_IDFROM EMPWHERE DEPARTMENT_ID = NULL;这个查询语句需要查出所有没有指派部门的职员,请问以下哪个说法是正确的?( )A、查询语句可以显示需要的结果B、查询语句中,WHERE子句的列名需要修改为LAST_NAMEC、查询语句中,WHERE子句中的操作符需要修改为ISD、查询语句中,WHERE子句中需要修改为使用外连接4、请看下面的触发器语句:CREATE OR REPLACE TRIGGER update_empAFTER UPDATE ON empBEGININSERT INTO audit_table (who, audited)VALUES(USER, SYSDATE);END;你执行了一个emp表的update操作,这个update操作修改了十条记录。

plsql试题

plsql试题

plsql试题
好的,以下是一份简单的PL/SQL试题,请参考:一、选择题
PL/SQL是什么的扩展?
A. SQL
B. C
C. Java
D. Python
在PL/SQL中,哪一个关键字用于定义块?
A. BEGIN
B. END
C. CREATE
D. ALTER
以下哪个是PL/SQL中用于声明变量的关键字?
A. VAR
B. CONST
C. PROGRAM
D. DECLARE
PL/SQL中的游标用于什么?
A. 存储数据
B. 查询数据
C. 修改数据
D. 事务处理
哪个关键字用于在PL/SQL中定义循环?
A. LOOP
B. FOR
C. WHILE
D. FOREACH
哪个语句用于在PL/SQL中提交事务?
A. COMMIT
B. ROLLBACK
C. SAVEPOINT
D. SET TRANSACTION
二、填空题
PL/SQL的中文含义是_________。

PL/SQL中用于异常处理的关键词是_________。

在PL/SQL中,使用_________关键字可以定义存储过程。

声明一个类型为VARCHAR2(50)的变量,应使用_________关键字。

使用_________语句可以在PL/SQL中创建一个表。

三、简答题
描述PL/SQL的主要特点。

简述PL/SQL中的异常处理机制。

plsql练习题及答案

plsql练习题及答案

plsql练习题及答案标题:PL/SQL练习题及答案PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库中的一种编程语言,用于编写存储过程、触发器和函数等数据库对象。

在学习和掌握PL/SQL的过程中,进行一些练习题是非常有帮助的。

本文将为大家提供一些PL/SQL练习题及其答案,帮助读者加深对PL/SQL的理解和应用。

1. 编写一个PL/SQL程序,创建一个名为"employees"的表,包含以下字段:员工编号(emp_id),员工姓名(emp_name),员工职位(emp_position),员工工资(emp_salary)。

然后插入几条员工记录,并查询该表的所有数据。

答案:```sql-- 创建employees表CREATE TABLE employees (emp_id NUMBER,emp_name VARCHAR2(50),emp_position VARCHAR2(50),emp_salary NUMBER);-- 插入员工记录INSERT INTO employees VALUES (1, 'John', 'Manager', 5000);INSERT INTO employees VALUES (2, 'Jane', 'Developer', 4000);INSERT INTO employees VALUES (3, 'Mike', 'Analyst', 3500);-- 查询表的所有数据SELECT * FROM employees;```2. 编写一个PL/SQL程序,创建一个名为"get_employee_salary"的存储过程,该存储过程接收一个员工编号作为输入参数,并返回该员工的工资。

Oracle PLSQL考试题

Oracle PLSQL考试题

Oracle SQL & PL/SQL 测试题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数据库中可用的兼容等价语句?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 wheresubstr(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.你要对操纵Oracle数据库中的数据。

下列哪个选项表示Oracle中select语句的功能,并且不需要使用子查询?A.可以用select语句改变Oracle中的数据 B.可以用select语句删除Oracle 中的数据C.可以用select语句和另一个表的内容生成一个表 D.可以用select语句对表截断3.你要操纵Oracle数据,下列哪个不是SQL命令?A.select * from dual; B.set defineC.update emp set ename = 6543 where ename = ‘SMITHERS’;D.create table employees(empid varchar2(10) primary key);4.你要在Oracle中定义SQL查询。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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表中带入雇员的姓名,返回该雇员的薪水值。

相关文档
最新文档