PLSQL试题

合集下载

PLSQL试题

PLSQL试题

PLSQL试题pl/sql试题I多项选择题(18分)1.oracle数据库中为新创建的表分配的初始空间通常有多大()a、 a块B.a区域c.a段D.a表空间2.关于存储过程参数,正确说法的是()a、存储过程的输出参数可以是标量类型或表类型。

B.存储过程的输入参数可以在没有输入信息的情况下调用该过程c.可以指定字符参数的字符长度,(函数的()或者过程的(number/varchar2))d.以上说法都不对3.下列说法正确的是()a、只要存储过程中有添加、删除和修改语句,就必须添加自治事务。

B.表格数据可以在函数中修改。

C.函数不能递归调用。

D.上述陈述是错误的4.关于触发器,下列说法正确的是()a、可以在表上创建Insteadof触发器。

B.和聚合触发器不能使用“:old”和“:new”C.行级触发器不能用于审核D.触发器可以显示调用5.下列哪些是oracle的伪列()(多选)a、罗伊德b.row_number()c.leveld.rownum6.当表中存在大量重复行数据时,应创建的索引类型应为()a.b树b.reversec.bitmapd.函数索引姓名:________二.填空题(10’)1.交易的特点是。

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

(2’)4.%type关键字作用是_________.(2’)三.编程题1.公司想根据员工的职位提高工资。

公司决定按照以下加薪结构进行处理:(22')designationclerksalesmananalystotherwise五百兆一千亿一千五百万二千编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。

2.编写函数检查指定员工的工资是否在有效范围内。

不同职位的薪资范围为:(20')designationraiseclerk1500-25002501-35003501-4500销售人员分析其他4501andabove如果薪资在该范围内,将显示消息“SalarySok”,否则薪资将更新为该范围内的最小值。

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;上述语句中有()处错误。

PLSQL面试题

PLSQL面试题

PLSQL⾯试题⼀、求1-100之间的素数⼆、对所有员⼯,如果该员⼯职位是MANAGER,并且在DALLAS⼯作那么就给他薪⾦加15%;如果该员⼯职位是CLERK,并且在NEW YORK⼯作那么就给他薪⾦扣除5%;其他情况不作处理三、对直接上级是'BLAKE'的所有员⼯,按照参加⼯作的时间加薪:81年6⽉以前的加薪10%81年6⽉以后的加薪5%三、根据员⼯在各⾃部门中的⼯资⾼低排出在部门中的名次(允许并列).四、编写⼀个触发器实现如下功能:对修改职⼯薪⾦的操作进⾏合法性检查:a) 修改后的薪⾦要⼤于修改前的薪⾦b) ⼯资增量不能超过原⼯资的10%c) ⽬前没有单位的职⼯不能涨⼯资四、编写⼀个PL/SQL程序块,对名字以"A"或"S"开始的所有雇员按他们的基本薪⽔的10%加薪。

五、编写⼀PL/SQL,对所有的"销售员"(SALESMAN)增加佣⾦500.六、编写⼀PL/SQL,以提升两个资格最⽼的"职员"为"⾼级职员"。

(⼯作时间越长,优先级越⾼)七、编写⼀PL/SQL,对所有雇员按他们基本薪⽔的10%加薪,如果所增加的薪⽔⼤于5000,则取消加薪。

⼋、显⽰EMP中的第四条记录。

九、.编写⼀个给特殊雇员加薪10%的过程,这之后,检查如果已经雇佣该雇员超过60个⽉,则给他额外加薪3000答案:⼀、declarefag boolean:=true;beginfor i in 1..100 loopfor j in 2..i-1 loopif mod(i,j)=0 thenfag:=false;end if;end loop;if fag thendbms_output.put_line(i);end if;fag:=true;end loop;end;⼆、declarecursor c1 is select * from emp;c1rec c1%rowtype;v_loc varchar2(20);beginfor c1rec in c1 loopselect loc into v_loc from dept where deptno = c1rec.deptno;if c1rec.job = 'MANAGER' and v_loc = 'DALLAS' thenupdate emp set sal = sal * 1.15 where empno = c1rec.empno;elsif c1rec.job='CLERK' and v_loc = 'NEW YORK' thenupdate emp set sal = sal * 0.95 where empno = c1rec.empno;elsenull;end if;end loop;end;三、declarecursor c1 is select * from emp where mgr = (selectempno from emp where ename='BLAKE'); --直接上级是'BLAKE'的所有员⼯c1rec c1%rowtype;for c1rec in c1 loopif c1rec.hiredate < '01-6⽉-81' thenupdate emp set sal = sal * 1.1 where empno = c1rec.empno;elseupdate emp set sal = sal * 1.05 where empno = c1rec.empno;end if;end loop;end;三、<1> ⼀条SQL语句select deptno,ename,sal,(select count(*) + 1from emp where deptno = a.deptnoand sal > a.sal) as ordfrom emp aorder by deptno,sal desc;<2> PL/SQL块declarecursor cc isselect * from dept;ccrec cc%rowtype;cursor ck(no number) isselect * from emp where deptno = no order by sal desc;ckrec ck%rowtype;i number;j number;v_sal number:=-1;beginfor ccrec in cc loopi := 0;for ckrec in ck(ccrec.deptno) loopi := i + 1;--写⼊临时表if ckrec.sal = v_sal thennull;elsej:=i;end if;--显⽰DBMS_OUTPUT.put_line(ccrec.deptno||chr(9)||ccrec.ename||chr(9)||ckrec.sal||chr(9)||j); v_sal := ckrec.sal;end loop;end loop;end;四、create or replace trigger tr1after update of sal on empfor each rowbeginif :new.sal <= :old.sal thenraise_application_error(-20001,'修改后的薪⾦要⼤于修改前的薪⾦');elsif :new.sal > :old.sal * 1.1 thenraise_application_error(-20002,'⼯资增量不能超过原⼯资的10%');elsif :old.deptno is null thenraise_application_error(-20003,'没有单位的职⼯不能涨⼯资');end;四、DECLARECURSOR c1 ISSELECT * FROM emp WHERE SUBSTR(ename,1,1)=´A´ OR SUBSTR(ename,1,1)=´S´ FOR UPDATE OF sal; BEGINFOR i IN c1LOOPUPDATE emp SET sal=NVL(sal,0)+NVL(sal,0)*0.1 WHERE CURRENT OF c1;END LOOP;END;五、DECLARECURSOR c1 ISSELECT * FROM emp WHERE job=´SALESMAN´ FOR UPDATE OF sal;BEGINFOR i IN c1LOOPUPDATE emp SET sal=NVL(sal,0)+500 WHERE CURRENT OF c1;END LOOP;END;六、DECLARECURSOR c1 ISSELECT * FROM emp WHERE job=´CLERK´ ORDER BY hiredate FOR UPDATE OF job;--升序排列,⼯龄长的在前⾯BEGINFOR i IN c1LOOPEXIT WHEN c1%ROWCOUNT>2;DBMS_OUTPUT.PUT_LINE(i.ename);UPDATE emp SET job=´HIGHCLERK´ WHERE CURRENT OF c1;END LOOP;END;七、DECLARECURSOR c1 IS SELECT * FROM emp FOR UPDATE OF sal;BEGINFOR i IN c1LOOPIF (i.sal+i.sal*0.1)<=5000 THENUPDATE emp SET sal=sal+sal*0.1 whereEmpno=i.empnoDBMS_OUTPUT.PUT_LINE(i.sal);END IF;END LOOP;END;⼋、DECLARECURSOR c1 IS SELECT * FROM emp;BEGINFOR i IN c1LOOPIF c1%ROWCOUNT=4 THENDBMS_OUTPUT.PUT_LINE(i. EMPNO || ´ ´ ||i.ENAME || ´ ´ || i.JOB || ´ ´ || i.MGR || ´ ´ || i.HIREDATE || ´ ´ || i.SAL || ´ ´ ||M || ´ ´ || i.DEPTNO);EXIT;END IF;END LOOP;END;九、CREATE OR REPLACE PROCEDURE Raise_Sal(no IN NUMBER) ASvhiredate DATE;vsal emp.sal%TYPE;BEGINSELECT hiredate,sal INTO vhiredate,vsal FROM emp WHERE empno=no;IF MONTHS_BETWEEN(SYSDATE,vhiredate)>60 THENvsal:=NVL(vsal,0)*1.1+3000;ELSEvsal:=NVL(vsal,0)*1.1;END IF;UPDATE emp SET sal=vsal WHERE empno=no;END;/VARIABLE no NUMBERBEGIN:no:=7369;END;考试总分为100分,共8题,时间为1⼩时。

plsql——精选推荐

plsql——精选推荐

1.以下哪种PL/SQL块用于返回数据?(单选)A 匿名块B 命名块C 过程D 函数E 触发器2.以下哪几种定义变量和常量的方法是正确的?(多选)A v_ename VARCHAR2(10);B v_sal,v_comm NUMBER(6,2);C v_sal NUMBER(6,2) NOT NULL;D c_tax CONSTANT NUMBER(6,2) DEFAULT 0.17;E %SAL NUMBER(6,2)F v_comm m%TYPE3. 在PL/SQL块中不能直接嵌入以下哪些语句?(多选)A SELECTB INSERTC CREATE TABLED GRANTE COMMMIT4. 当SELECT INTO 语句没有返回行时,会触发以下哪种异常?(单选)A. TOO_MANY_ROWSB. VALUE_ERRORC. NO_DATA_FOUND5. 当执行UPDATE语句时没有更新任何行,会触发以下哪种异常?(单选)A VALUE_ERRORB NO_DATA_FOUNDC 不会触发任何例外6. 请查看以下IF语句:(单选)DECLARESal NUMBER:=500;Comm NUMBER;BeginIF Sal<100 thenComm:=0;ELSIF sal < 600 thenComm:=sal*0.1;ELSIF sal < 1000 thenComm:=sal*0.15;ELSEComm:=sal*0.2;ENDIF;END;当执行了以上语句之后,变量COMM的结构:A.0B.50C.75D.1007 .请看以下CASE语句,答案?(单选)DECLAREv_sal NUMBER:=1000;v_tax NUMBER;BeginCASEWHEN v_sal<1500 THENv_tax:=v_sal*0.03;WHEN v_sal< 2500 THENv_tax:=v_sal*0.04;WHEN v_sal<3500 THENv_tax:=v_sal*0.05;WHEN v_sal<8000 THENV_tax:=v_sal*0.08;END CASE;END;当执行了以上的PL/SQL后,变量v_tax的值为A 30B 40C 50D 808 .下面哪几个复合数据类型可以作为表列?(多选)A 记录类型B 嵌套表C PL/SQL表D VARRAY9 .当初始化哪种类型的集合元素时,可以直接给元素赋值?(单选)A 嵌套表B PL/SQL表C VARRAY10 .当定义PL/SQL表时,其下标可以使用以下哪些数据类型?(多选)A CHARB VARCHAR2C INTD INTEGERE BINARY_INTEGERF PLS_INTEGER11 .当使用显式游标时,在执行了哪条语句后应该检查游标是否包含行?(单选)A OPENB FETCHC CLOSEE CURSOR12 .在以下哪些语句中可以包含 WHERE CURRENT OF 子句?(多选)A OPENB FETCHC DELETED SELECTE UPDATEF CURSOR13 .在SQL*PLUS中可以那几种方式运行过程?(多选)A EXECUTEB CALLC EXECD 以上都不行14 .以上那几个是PLSQL包的特性?(多选)A 支持重载B 支持构造过程C 可以在包规范中定义公共变量D 包体包规范必须同时定义15 .RAISE 语句应该放在PL/SQL块的哪个部分?(单选)A 子程序头部B 定义部分C 执行部分D 异常处理部分16 .请看以下游标定义语句1DECLARE2 CURSOR cust_cursor (p_cust_id,p_last_name)3 IS4 SELECT cust_id,first_name,last_name,credit_limit5 FROM customer6 WHERE cust_id = p_cust_id7 AND last_name =p_list_name哪行会引起错误?A. 2B. 3C. 4D. 5E. 617. 当在异常和ORACLE错误之间建立关联时,应该在哪个部分完成?(单选)A 定义部分B 执行部分C 异常处理部分18 . 假定在EMP表上定义了CHECK约束要求雇员工资不能高于6000,为了处理工资超过6000可能出现的错误,应该使用哪种异常?(单选)A.预定义异常B.非预定义异常C.自定义异常19. 哪个是使用过程raise_application_error的原因?(单选)A.捕捉自定义异常B.捕捉预定义异常C.捕捉非预定义异常D.发出用户自定义的错误消息20 .当在PL/SQL块中编写静态SQL语句时,PL/SQL块可以处理以下哪些SQL语句?(多选)A DDL语句B DCL 语句C SELECT 语句D DML语句E 事务控制语句21. 以下哪些SQL语句必须要使用动态SQL进行处理?(多选)A DDL语句B DCL 语句C SELECT 语句D DML语句E 事务控制语句22 .以下哪个几个是游标的属性?(多选)A %ISOPENB %FOUNDC %NOTFOUNDD %ROWCOUNT23 .哪个游标循环不需要手动的打开关闭游标? (单选)A LOOPB WHILEC FORD 以上都不是24. 以下哪种程序单元必须返回数据?(单选)A 触发器B 函数C 过程D 包25. 当建立过程时,使用以下哪些参数可以输出数据?(多选)A IN参数B OUT参数C IN OUT 参数D 任何参数都不能输出数据26. 为了在其他应用程序中引用包的组件,应该在包的哪个部分定义该组件?(单选)A,包规范B,包体27. 为了实现信息隐蔽,应该在包的哪个部分定义组件? (单选)A 包规范B 包体28. 在触发器执行代码中可以包含以下哪些SQL语句?(多选)A SELECT语句B DML语句C DDL语句D 事务控制语句29. 当建立DML触发器时,为了审计数据变化,应该建立哪种类型的触发器?(单选)A BEFORE 语句触发器B AFTER 语句触发器C BEFORE 行触发器D AFTER 行触发器30. 当在复杂视图上执行UPDATE操作时,应该建立以下哪种触发器?(单选)A BEFORE语句触发器B AFTER 语句触发器C BEFORE 行触发器D BEFORE 语句触发器E INSTEAD-OF 触发器31. SCOTT用户可以建立以下哪些类型的触发器?(多选)A DML触发器B INSTEAD-OF 触发器C 例程启动触发器D 登陆触发器32. 下列哪个不是PL/SQL集合类型?(单选)A PL/SQL表B PL/SQL 记录C 嵌套表D VARRAY33. 以下哪个可以使用%ROWTYPE属性?(多选)A 表B 视图C 游标D 嵌套表34. 以下哪些PLSQL类型需要不需要初始化?(单选)A PL/SQL表B 嵌套表C VARRAYD 都不需要35. 下面那个不能作为PLSQL表的下标类型?(单选)A BINARY_INTEGERB PLS_INTEGERC NUMBERD VARCHAR236. 哪个方法可以返回VARRAY变量所允许的最大元素个数?(单选)A COUNTB LIMITC EXISTSD TRIM37 . 下面那个方法不是用于操纵嵌套表和VARRAY中元素的方法?(单选)A DROPB EXTENDC TRIMD DELETE38. 在PL/SQL块中SELECT语句什么情况下执行将产生例外情况?(单选)A)得到一行结果。

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。

数据库plsql考试题

数据库plsql考试题

数据库plsql考试题以下是为大家整理的数据库plsql考试题的相关范文,本文关键词为数据库,plsql,试题,数据库,试题,50分,填空,每空,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。

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

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

不定项选择题(每空2分,必需全部选正确,共32分)1、请看下面的查询语句seLecT*FRomtableswheRenameLIKe'%Log'执行该语句可以:()A、从表tables中查找name为\的记录b、从表tables中查找name中最前面三个字符是\的所有记录c、从表tables中查找name中最后面三个字符是\的所有记录D、从表tables中查找name为LIKe'%Log'的记录2、请看下面的删除语句:DeLeTeemployee_id,salary,job_idFRomemployeeswheRedept_id=90;请问这个删除语句为什么会执行失败?()A、empLoYees表中没有dept_id为90的记录b、不能在删除语句的DeLeTe后面指定列名c、不能删除Job_ID列,因为它是一个非空列D、不能删除empLoYee_ID 列,因为它是主键3、请看下面的查询语句:seLecTLAsT_nAme,sALARY,DepARTmenT_IDFRomempwheReDepARTmenT_ID=nuLL;这个查询语句需要查出所有没有指派部门的职员,请问以下哪个说法是正确的?()A、查询语句可以显示需要的结果b、查询语句中,wheRe子句的列名需要修改为LAsT_nAmec、查询语句中,wheRe子句中的操作符需要修改为IsD、查询语句中,wheRe 子句中需要修改为使用外连接4、请看下面的触发器语句:cReATeoRRepLAceTRIggeRupdate_empAFTeRupDATeonempbegInInseRTInToaudit_table(who,audited)VALues(useR,sYsDATe);enD;你执行了一个emp表的update操作,这个update操作修改了十条记录。

plsql练习题及答案

plsql练习题及答案PL/SQL练习题及答案PL/SQL是一种过程化编程语言,用于Oracle数据库的存储过程和触发器的编写。

掌握PL/SQL编程技巧对于数据库开发人员来说至关重要。

为了帮助大家提高PL/SQL编程能力,以下是一些练习题及其答案,供大家参考。

1. 编写一个PL/SQL程序,计算并输出1到100之间所有奇数的和。

答案:```sqlDECLAREtotal NUMBER := 0;BEGINFOR i IN 1..100 LOOPIF MOD(i, 2) <> 0 THENtotal := total + i;END IF;END LOOP;DBMS_OUTPUT.PUT_LINE('奇数的和为:' || total);END;```2. 编写一个PL/SQL程序,查询一个员工表中工资最高的员工信息。

答案:```sqlDECLAREemp_name VARCHAR2(100);emp_salary NUMBER;BEGINSELECT name, salary INTO emp_name, emp_salaryFROM employeesWHERE salary = (SELECT MAX(salary) FROM employees);DBMS_OUTPUT.PUT_LINE('工资最高的员工是:' || emp_name || ',工资为:' || emp_salary);END;```3. 编写一个PL/SQL程序,创建一个存储过程,将一个输入参数作为员工的姓氏,查询并输出该姓氏的所有员工信息。

答案:```sqlCREATE OR REPLACE PROCEDURE get_employees_by_lastname (p_lastname IN st_name%TYPE)ISBEGINFOR emp IN (SELECT * FROM employees WHERE last_name = p_lastname) LOOPDBMS_OUTPUT.PUT_LINE('员工ID:' || emp.employee_id || ',姓名:' || emp.first_name || ' ' || st_name);END LOOP;END;```4. 编写一个PL/SQL程序,创建一个触发器,当向一个订单表中插入一条记录时,自动更新对应客户的订单数量。

plsql经典试题

题目:PL-SQL经典试题0. 准备工作:set serveroutput onhellowrold 程序begin dbms_output.put_line('helloworld'); end;/[语法格式]--declare--声明的变量、类型、游标begin--程序的执行部分(类似于 java 里的 main()方法)dbms_output.put_line('helloworld');--exception--针对 begin 块中出现的异常,提供处理的机制--when .... then ... --when .... then ...end;*******************************************************************************基本语法******************************************************************************* 1. 使用一个变量declare--声明一个变量v_name varchar2(25); begin--通过select ... into ... 语句为变量赋值select last_name into v_name fromemployees where employee_id = 186;-- 打印变量的值dbms_output.put_line(v_name); end;2. 使用多个变量declare--声明变量v_name varchar2(25);v_email varchar2(25);v_salary number(8, 2);v_job_id varchar2(10);begin--通过 select ... into ... 语句为变量赋值--被赋值的变量与 SELECT 中的列名要一一对应select last_name, email, salary, job_id into v_name, v_email, v_salary, v_job_idfrom employees where employee_id = 186;-- 打印变量的值dbms_output.put_line(v_name || ', ' || v_email || ', ' || v_salary || ', ' || v_job_id); end; ----------------------------------------------------------------记录类型----------------------------------------------------------------3.1 自定义记录类型declare--定义一个记录类型type customer_type isrecord( v_cust_namevarchar2(20), v_cust_idnumber(10));--声明自定义记录类型的变量v_customer_type customer_type; beginv_customer_type.v_cust_name := '刘德华';v_customer_type.v_cust_id := 1001;dbms_output.put_line(v_customer_type.v_cust_name||','||v_customer_type.v_cust_id); end;3.2 自定义记录类型declare--定义一个记录类型type emp_record isrecord( v_namevarchar2(25), v_emailvarchar2(25), v_salarynumber(8, 2), v_job_idvarchar2(10));--声明自定义记录类型的变量v_emp_record emp_record; begin--通过 select ... into ... 语句为变量赋值select last_name, email, salary, job_id into v_emp_recordfrom employees where employee_id = 186;-- 打印变量的值dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' || v_emp_record.v_salary || ', ' || v_emp_record.v_job_id); end;4. 使用 %type 定义变量,动态的获取数据的声明类型declare--定义一个记录类型type emp_record is record( v_namest_name%type, v_emailemployees.email%type, v_salaryemployees.salary%type, v_job_idemployees.job_id%type);--声明自定义记录类型的变量v_emp_record emp_record; begin--通过 select ... into ... 语句为变量赋值select last_name, email, salary, job_id into v_emp_recordfrom employees where employee_id = 186;-- 打印变量的值dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' || v_emp_record.v_salary || ', ' || v_emp_record.v_job_id); end;5. 使用 %rowtypedeclare--声明一个记录类型的变量v_emp_record employees%rowtype; begin--通过select ... into ... 语句为变量赋值select * into v_emp_record from employeeswhere employee_id = 186;-- 打印变量的值dbms_output.put_line(v_emp_st_name || ', ' || v_emp_record.email || ', ' || v_emp_record.salary || ', ' || v_emp_record.job_id || ', ' || v_emp_record.hire_date); end;6.1 赋值语句:通过变量实现查询语句declare v_emp_record employees%rowtype;v_employee_id employees.employee_id%type;begin--使用赋值符号位变量进行赋值v_employee_id := 186;--通过select ... into ... 语句为变量赋值select * into v_emp_record from employeeswhere employee_id = v_employee_id;-- 打印变量的值dbms_output.put_line(v_emp_st_name || ', ' || v_emp_record.email || ', ' ||v_emp_record.salary || ', ' || v_emp_record.job_id || ', ' || v_emp_record.hire_date); end;6.2 通过变量实现 DELETE、INSERT、UPDATE 等操作declare v_emp_idemployees.employee_id%type;begin v_emp_id := 109; deletefrom employees whereemployee_id = v_emp_id;--commit; end;*******************************************************************************流程控制*******************************************************************************-----------------------------------------------------条件判断-----------------------------------------------------7. 使用 IF ... THEN ... ELSIF ... THEN ...ELSE ... END IF;要求: 查询出 150 号员工的工资, 若其工资大于或等于 10000 则打印 'salary >= 10000'; 若在5000 到 10000 之间, 则打印 '5000<= salary < 10000'; 否则打印 'salary < 5000'(方法一)declare v_salaryemployees.salary%type; begin--通过 select ... into ... 语句为变量赋值select salary into v_salaryfrom employees whereemployee_id = 150;dbms_output.put_line('salary: ' || v_salary);-- 打印变量的值if v_salary >= 10000 thendbms_output.put_line('salary >= 10000'); elsifv_salary >= 5000 then dbms_output.put_line('5000<= salary < 10000'); elsedbms_output.put_line('salary < 5000'); end if;(方法二)declare v_emp_name st_name%type; v_emp_sal employees.salary%type;v_emp_sal_level varchar2(20); begin select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150; if(v_emp_sal >= 10000) then v_emp_sal_level :='salary >= 10000'; elsif(v_emp_sal >= 5000) then v_emp_sal_level := '5000<= salary < 10000'; else v_emp_sal_level := 'salary < 5000'; end if; dbms_output.put_line(v_emp_name||','||v_emp_sal||','||v_emp_sal); end;7+ 使用 CASE ... WHEN ... THEN ...ELSE ... END 完成上面的任务declare v_salemployees.salary%type; v_msgvarchar2(50); begin select salaryinto v_sal from employees whereemployee_id = 150;--case 不能向下面这样用/* case v_sal when salary >= 10000 then v_msg := '>=10000' whensalary >= 5000 then v_msg := '5000<= salary < 10000' else v_msg := 'salary< 5000' end;*/v_msg := case trunc(v_sal / 5000) when0 then 'salary < 5000' when 1 then '5000<= salary< 10000' else 'salary >= 10000' end;dbms_output.put_line(v_sal ||','||v_msg); end;8. 使用 CASE ... WHEN ... THEN ... ELSE ... END;要求: 查询出 122 号员工的 JOB_ID, 若其值为 'IT_PROG', 则打印 'GRADE: A';'AC_MGT', 打印 'GRADE B', 'AC_ACCOUNT',打印 'GRADE C'; 否则打印 'GRADE D'declare--声明变量v_grade char(1); v_job_idemployees.job_id%type; begin selectjob_id into v_job_id from employeeswhere employee_id = 122;dbms_output.put_line('job_id: ' || v_job_id);--根据 v_job_id 的取值, 利用 case 字句为 v_grade 赋值v_grade := case v_job_id when 'IT_PROG' then 'A'when 'AC_MGT' then 'B' when 'AC_ACCOUNT' then'C' else 'D' end;dbms_output.put_line('GRADE: ' || v_grade); end;-----------------------------------------------------循环结构-----------------------------------------------------9. 使用循环语句打印 1 - 100.(三种方式)1). LOOP ... EXIT WHEN ... END LOOP declare--初始化条件v_i number(3) := 1;begin loop --循环体dbms_output.put_line(v_i);--循环条件exit when v_i = 100;--迭代条件 v_i := v_i + 1; end loop; end;2). WHILE ... LOOP ... END LOOP declare--初始化条件v_i number(3) := 1; begin--循环条件while v_i <= 100 loop--循环体dbms_output.put_line(v_i);--迭代条件v_i := v_i + 1; endloop; end;3). begin for i in 1 .. 100 loopdbms_output.put_line(i); end loop;end;10. 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数 (素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).declare v_flagnumber(1):=1; v_inumber(3):=2; v_jnumber(2):=2; beginwhile (v_i<=100) loop while v_j <= sqrt(v_i) loop if (mod(v_i,v_j)=0) then v_flag:= 0;end if; v_j :=v_j +1; end loop; if(v_flag=1) then dbms_output.put_line(v_i);endif;v_flag :=1;v_j := 2; v_i :=v_i+1; end loop;end;(法二)使用 for 循环实现 1-100 之间的素数的输出declare--标记值, 若为 1 则是素数, 否则不是v_flag number(1) := 0;begin for i in 2 .. 100loopv_flag := 1;for j in 2 .. sqrt(i) loop ifi mod j = 0 thenv_flag := 0;end if;end loop; if v_flag = 1 thendbms_output.put_line(i); end if;end loop; end;11. 使用 gotodeclare--标记值, 若为 1 则是素数, 否则不是v_flag number(1) := 0;begin for i in 2 .. 100loop v_flag := 1;for j in 2 .. sqrt(i) loop ifi mod j = 0 then v_flag :=0; goto label; endif; end loop;<<label>> if v_flag = 1 thendbms_output.put_line(i); end if;end loop; end;11+.打印 1——100 的自然数,当打印到 50 时,跳出循环,输出“打印结束” (方法一)begin for i in 1..100 loopdbms_output.put_line(i); if(i= 50) then goto label; endif; end loop;<<label>> dbms_output.put_line('打印结束');end;(方法二)begin for i in 1..100 loop dbms_output.put_line(i); if(imod 50 = 0) then dbms_output.put_line('打印结束'); exit;end if; end loop; end;******************************************************************************游标的使用******************************************************************************* 12.1 使用游标要求: 打印出 80 部门的所有的员工的工资:salary: xxxdeclare--1. 定义游标cursor salary_cursor is select salary from employees where department_id = 80;v_salary employees.salary%type; begin--2. 打开游标open salary_cursor;--3. 提取游标fetch salary_cursor into v_salary;--4. 对游标进行循环操作: 判断游标中是否有下一条记录while salary_cursor%found loopdbms_output.put_line('salary: ' || v_salary); fetchsalary_cursor into v_salary; end loop;--5. 关闭游标close salary_cursor; end;12.2 使用游标要求: 打印出 80 部门的所有的员工的工资: Xxx 'ssalary is: xxxdeclare cursor sal_cursor is select salary ,last_name from employees where department_id= 80; v_sal number(10);v_name varchar2(20); beginopen sal_cursor;fetch sal_cursor into v_sal,v_name;while sal_cursor%found loopdbms_output.put_line(v_name||'`s salary is '||v_sal); fetchsal_cursor into v_sal,v_name; end loop; close sal_cursor;end;13. 使用游标的练习:打印出 manager_id 为 100 的员工的 last_name, email, salary 信息(使用游标, 记录类型)declare--声明游标 cursor emp_cursor is select last_name, email, salary from employees where manager_id = 100;--声明记录类型type emp_record is record( namest_name%type, emailemployees.email%type, salaryemployees.salary%type);-- 声明记录类型的变量v_emp_record emp_record; begin--打开游标open emp_cursor;--提取游标fetch emp_cursor into v_emp_record;--对游标进行循环操作while emp_cursor%found loop dbms_output.put_line(v_emp_ || ', ' || v_emp_record.email|| ', ' || v_emp_record.salary ); fetchemp_cursor into v_emp_record; end loop;--关闭游标close emp_cursor; end;(法二:使用 for 循环)declare cursor emp_cursor isselect last_name,email,salary fromemployees where manager_id =100;beginfor v_emp_record in emp_cursor loopdbms_output.put_line(v_emp_st_name||','||v_emp_record.email||','||v_emp_record. salary); end loop; end;14. 利用游标, 调整公司中员工的工资:工资范围调整基数0 - 5000 5%5000 - 10000 3%10000 - 15000 2%15000 - 1%declare--定义游标cursor emp_sal_cursor is select salary, employee_id from employees;--定义基数变量temp number(4, 2);--定义存放游标值的变量v_sal employees.salary%type; v_idemployees.employee_id%type; begin--打开游标open emp_sal_cursor;--提取游标fetch emp_sal_cursor into v_sal, v_id;--处理游标的循环操作while emp_sal_cursor%found loop--判断员工的工资, 执行 update 操作--dbms_output.put_line(v_id || ': ' || v_sal);if v_sal <= 5000 thentemp := 0.05; elsif v_sal<= 10000then temp := 0.03; elsifv_sal <= 15000 then temp :=0.02; else temp := 0.01;end if;--dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp); update employees set salary = salary * (1 + temp) where employee_id = v_id;fetch emp_sal_cursor into v_sal,v_id; end loop;--关闭游标close emp_sal_cursor; end;使用 SQL 中的 decode 函数update employees set salary = salary * (1 + (decode(trunc(salary/5000), 0, 0.05,1, 0.03,2, 0.02,0.01)))15. 利用游标 for 循环完成 14.declare--定义游标cursor emp_sal_cursor is select salary, employee_id id from employees;--定义基数变量temp number(4, 2); begin --处理游标的循环操作for c in emp_sal_cursor loop--判断员工的工资, 执行 update 操作--dbms_output.put_line(c.employee_id || ': ' || c.salary);if c.salary <= 5000 thentemp := 0.05; elsif c.salary <= 10000then temp := 0.03; elsifc.salary <= 15000 then temp :=0.02; else temp := 0.01;end if;--dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp); update employeesset salary = salary * (1 + temp) where employee_id = c.id; end loop; end;16*. 带参数的游标declare--定义游标cursor emp_sal_cursor(dept_id number, sal number) isselect salary + 1000 sal, employee_id id from employeeswhere department_id = dept_id and salary > sal;--定义基数变量temp number(4, 2); begin--处理游标的循环操作for c in emp_sal_cursor(sal => 4000, dept_id => 80) loop--判断员工的工资, 执行 update 操作--dbms_output.put_line(c.id || ': ' || c.sal);if c.sal <= 5000 thentemp := 0.05; elsif c.sal <= 10000then temp := 0.03; elsifc.sal <= 15000 then temp :=0.02; elsetemp := 0.01; end if; dbms_output.put_line(c.sal|| ': ' || c.id || ', ' || temp);--update employees set salary = salary * (1 + temp) where employee_id = c.id; end loop; end;17. 隐式游标: 更新指定员工 salary(涨工资 10),如果该员工没有找到,则打印”查无此人” 信息begin update employees set salary = salary + 10 where employee_id = 1005;if sql%notfound thendbms_output.put_line('查无此人!'); end if; end;*******************************************************************************异常处理*******************************************************************************[预定义异常]declarev_sal employees.salary%type;begin select salary into v_salfrom employees whereemployee_id >100;dbms_output.put_line(v_sal);exception when Too_many_rows then dbms_output.put_line('输出的行数太多了'); end;[非预定义异常]declarev_sal employees.salary%type;--声明一个异常delete_mgr_excep exception;--把自定义的异常和 oracle 的错误关联起来PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);begin delete from employees where employee_id = 100;select salary into v_salfrom employees whereemployee_id >100;dbms_output.put_line(v_sal);exception when Too_many_rows then dbms_output.put_line('输出的行数太多了'); when delete_mgr_excep then dbms_output.put_line('Manager 不能直接被删除'); end;[用户自定义异常]declarev_sal employees.salary%type;--声明一个异常delete_mgr_excep exception;--把自定义的异常和 oracle 的错误关联起来PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);--声明一个异常too_high_sal exception; beginselect salary into v_sal fromemployees whereemployee_id =100;if v_sal > 1000 then raisetoo_high_sal; end if;delete from employeeswhere employee_id = 100;dbms_output.put_line(v_sal);exceptionwhen Too_many_rows then dbms_output.put_line('输出的行数太多了');when delete_mgr_excep then dbms_output.put_line('Manager 不能直接被删除'); --处理异常when too_high_sal then dbms_output.put_line('工资过高了'); end;18. 异常的基本程序:通过 select ... into ... 查询某人的工资, 若没有查询到, 则输出 "未找到数据"declare--定义一个变量v_sal employees.salary%type; begin--使用 select ... into ... 为 v_sal 赋值 select salary into v_sal from employees where employee_id = 1000; dbms_output.put_line('salary:' || v_sal); exception when No_data_found thendbms_output.put_line('未找到数据'); end;或declare--定义一个变量v_sal employees.salary%type; begin--使用 select ... into ... 为 v_sal 赋值 select salaryinto v_sal from employees;dbms_output.put_line('salary: ' || v_sal); exceptionwhen No_data_found thendbms_output.put_line('未找到数据!'); whenToo_many_rows then dbms_output.put_line('数据过多!'); end;19.更新指定员工工资,如工资小于 300 ,则加 100;对 NO_DATA_FOUND 异常,TOO_MANY_ROWS 进行处理.declare v_sal employees.salary%type; begin select salary into v_salfrom employees where employee_id = 100;if(v_sal < 300) then update employees set salary = salary + 100 where employee_id = 100; else dbms_output.put_line('工资大于 300'); end if; exception when no_data_found then dbms_output.put_line('未找到数据'); when too_many_rows thendbms_output.put_line('输出的数据行太多'); end;20.处理非预定义的异常处理: "违反完整约束条件"declare--1. 定义异常temp_exception exception;--2. 将其定义好的异常情况,与标准的 ORACLE 错误联系起来,使用 EXCEPTION_INIT 语句 PRAGMA EXCEPTION_INIT(temp_exception, -2292);begin delete from employees where employee_id =100;exception--3. 处理异常when temp_exception then dbms_output.put_line('违反完整性约束!'); end;21. 自定义异常: 更新指定员工工资,增加 100;若该员工不存在则抛出用户自定义异常: no_resultdeclare--自定义异常no_result exception; begin update employees set salary = salary + 100where employee_id = 1001;--使用隐式游标, 抛出自定义异常if sql%notfound thenraise no_result; end if;exception--处理程序抛出的异常when no_result then dbms_output.put_line('更新失败'); end;*******************************************************************************存储函数和过程******************************************************************************* [存储函数:有返回值,创建完成后,通过 select function() from dual;执行][存储过程:由于没有返回值,创建完成后,不能使用 select 语句,只能使用 pl/sql 块执行][格式]--函数的声明(有参数的写在小括号里)create or replace function func_name(v_param varchar2)--返回值类型return varchar2 is--PL/SQL 块变量、记录类型、游标的声明(类似于前面的 declare 的部分) begin--函数体(可以实现增删改查等操作,返回值需要 return)return 'helloworld'|| v_param; end;22.1 函数的 helloworld: 返回一个 "helloworld" 的字符串create or replace function hello_func returnvarchar2isbegin return'helloworld'; end;执行函数begindbms_output.put_line(hello_func()); end;或者: select hello_func() from dual;22.2 返回一个"helloworld: atguigu"的字符串,其中 atguigu 由执行函数时输入。

PL SQL考试题目

PL/SQL考试题目1、完成以下PL/SQL块,功能是:显示2 到50的25个偶数。

BEGINFOR________ IN _________LOOPDBMS_OUTPUT.PUT_LINE(even_number*2);END LOOPEND;答案:even_number 1 .. 252、完成以下PL/SQL块,功能是:使用游标,显示所有单价低于250元的玩具的单价。

DECLAREmy_toy_price toys.toyprice%TYPE;CURSOR toy_cur ISSELECT toyprice FROM toysWHERE toyprice<250;BEGIN______________LOOP________________________________________EXIT WHEN toy_cur%NOTFOUND;DBMS_OUTPUT.PUT_LINE (toy_cur%ROWCOUNT || '. 玩具单价:' || my_toy_price);END LOOP;CLOSE toy_cur;END;答案:OPEN toy_cur FETCH toy_cur INTO my_toy_price;3、找出emp表中的dept表没有的dept_no 使用Exists方式实现即改写select * from emp a where a.dept_no not in (select b.dept_no from dept b) 答:参考答案:SELECT *FROM EMP AWHERE NOT EXISTS(SELECT 1 FROM DEPT B WHERE A.DEPT_NO = B. DEPT_NO)4、现有 dept表有字段code,code的数据结构是H.+序号(9位数字)用户输入的参数:序号为p_numselect t.* from dept t where substr(t.code,3)= p_num;上面的SQL语句写法是否合理,如不合理请写你优化上面的语句?答:参考答案:select t.* from dept t where t.code= ‘H.’||p_num;5、有Table1,Table2两表,Table2是Table1的从表,Table1表有字段head_id(主键)和head_name,Table2表有字段Line_id(主键),head_id(外键),line_name,现要求查询统计出有那些hand_name在Table2表中有2条以上的数据。

plsql经典测试题.docx

PL/SQL 编程摸底考试日期:2010年 10月 18日考生姓名:试题一:从 2 个 table中产生报表,generate report from 2 tables假定有 2 个 tables :checking和savings,此2个tables已注入数据:Checking SavingsCus_ID Acct_No Cus_ID Acct_No1100011500012100023500021 号顾客有checking accout账号为10001,同时还有savings account账号为500012 号顾客有checking accout账号为10002,但是没有savings account3 号顾客有savings account账号为50002,但是没有checking account写 SQL语句,产生这样的报表:Use SQL statement to generate this reportCus_ID Checking Account Savings Account11000150001210002350002select, Checking_Account, Savings_Accountfrom checking a, savings bwhere= (+)unionselect, Checking_Account, Savings_Accountfrom checking a, savings bwhere (+) = ;用 jion更简单试题二:从 1 个 table中产生报表, generate report from 1 table 情况与上题相似,但是数据在 1 个 table里:Data stored in 1 table instead of 2 tablesAccountsCus_ID Acct_No Acct_Type110001Checking150001Savings210002Checking350002Savings写 SQL语句 , 产生这样的报表(与上题相同的报表):Use SQL statement to generate this reportCus_ID Checking Account Savings Account11000150001210002350002select,max( case when ='Savings'then end ),max( case when ='Checking'then end )from test1 bgroup by ;select,max(decode,'Checking',, null)) Checking_Account,max(decode,'Savings',,null)) Savings_Accountfrom test1 agroup by ;试题三:( 1)数据同步data sync ,( 2)触发器 trigger,(3)报表report有 2 个表: Account 和 payment :Acct_No: 账号 Account numberDate_created: 账户创建日期 Date acount was createdAmount:应付的金额Amount chargedSerial_No:支付的序列号serial number for paymentPayment:支付金额 amount paidDate_paid:支付日期Date paidAccount PaymentAcct_No Date_Created Amount Acct_No Serial_No Payment Date_paid 10002010-1-14900100014502010-1-30 10012010-4-15500100024502010-2-22 10022010-6-202000100213002010-7-20 10032010-8-43000100223002010-8-20 10042010-10-104400100233002010-9-301003110002010-9-9我们需要这样一份应收款分类报表:We need a categorized account receivable reportBalanceAcct_No Last_act_date<=30days>30days10012010-4-1550010022010-9-30110010032010-9-9200010042010-10-104400Last_act_date:最近的活动日期,即最近的支付日期,如无支付,就用账户创建日期1000:余额为零,不显示在报表中1001:无 paymnet,它的账户创建日期就是最近的活动日期,已超过30 天1002:余额为 1400,其最近的 payment 是 2010-9-30 ,在 30 天内1003:余额为 2000,其最近的 payment 是 2010-9-9 ,已超过 30 天1004:无 paymnet,它的账户创建日期就是最近的活动日期,在30 天内。

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

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.ROWID
B.ROW_NUMBER()
C.LEVEL
D.ROWNUM
6.当表的重复行数据很多时,应该创建的索引类型应该是()
A.B树
B.R everse
C.B itmap
D. 函数索引
二.填空题(10’)
1.事务的特性有___ __、__ ___、___ ___、___ __ 。

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

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

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

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

3、编写PL/SQL查询语句,显示部门代码为10的所有雇员名、部门名,以及其他部门名(10’)
4. 编写PL/SQL查询语句,要求按以下格式显示下面信息,条件是此人工资在所有人中最高。

(10’)
部门姓名工资
5. 创建触发器不允许用户每天在8:00-10:00使用dept表。

(10’)。

相关文档
最新文档