数据库入门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数据库中可用的ANSI兼容等价语句?AA.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语句的功能,并且不需要使用子查询?BA.可以用select语句改变Oracle中的数据 B.可以用select语句删除Oracle 中的数据C.可以用select语句和另一个表的内容生成一个表 D.可以用select语句对表截断3.Oracle数据库中发出一个查询。
SQL基础知识题库100道及答案(完整版)

SQL基础知识题库100道及答案(完整版)1. 在SQL 中,用于创建表的语句是()A. CREATE TABLEB. INSERT INTOC. UPDATED. DELETE答案:A2. 以下哪个关键字用于在SQL 中添加数据()A. ADDB. INSERTC. APPENDD. PUT答案:B3. 在SQL 中,用于从表中检索数据的语句是()A. SELECTB. GETC. FETCHD. REQUEST答案:A4. 以下哪个关键字用于在SQL 中更新数据()A. MODIFYB. CHANGEC. UPDATED. REPLACE答案:C5. 要从表中删除数据,应使用的SQL 语句是()A. DROPB. DELETEC. REMOVED. CLEAR答案:B6. SQL 中用于创建索引的关键字是()A. CREATE INDEXB. MAKE INDEXC. BUILD INDEXD. ESTABLISH INDEX答案:A7. 以下哪种数据类型用于存储整数()A. INTB. FLOATC. VARCHARD. DATE答案:A8. 用于存储字符串的常见数据类型是()A. CHARB. INTC. DECIMALD. DOUBLE答案:A9. 在SQL 中,用于对结果集进行排序的关键字是()A. SORTB. ORDER BYC. ARRANGED. ALIGN答案:B10. 以下哪个运算符用于等于比较()A. =B. ==C. <>D. >答案:A11. 用于不等于比较的运算符是()A.!=B. < >C. NOT EQUALSD. DIFFERENT答案:B12. 以下哪个运算符用于大于比较()A. >B. >=C. <D. <=答案:A13. 用于小于比较的运算符是()A. <B. <=C. >D. >=答案:A14. 以下哪个关键字用于在SQL 中进行分组操作()A. GROUP BYB. SORT BYC. CLASSIFY BYD. CATEGORIZE BY答案:A15. 聚合函数SUM 用于()A. 计算总和B. 计算平均值C. 计算数量D. 计算最小值答案:A16. 聚合函数AVG 用于()A. 计算总和B. 计算平均值C. 计算数量D. 计算最大值答案:B17. COUNT 函数用于()A. 计算总和B. 计算平均值C. 计算数量D. 计算最小值答案:C18. MAX 函数用于()A. 计算总和B. 计算平均值C. 计算最大值D. 计算最小值答案:C19. MIN 函数用于()A. 计算总和B. 计算平均值C. 计算最大值D. 计算最小值答案:D20. 在SQL 中,用于连接两个表的关键字是()A. JOINB. CONNECTC. LINKD. BIND答案:A21. 内连接使用的关键字是()A. INNER JOINB. LEFT JOINC. RIGHT JOIND. FULL JOIN答案:A22. 左连接使用的关键字是()A. INNER JOINB. LEFT JOINC. RIGHT JOIND. FULL JOIN答案:B23. 右连接使用的关键字是()A. INNER JOINB. LEFT JOINC. RIGHT JOIND. FULL JOIN答案:C24. 全连接使用的关键字是()A. INNER JOINB. LEFT JOINC. RIGHT JOIND. FULL JOIN答案:D25. 在SQL 中,用于限制结果集行数的关键字是()A. LIMITB. RESTRICTC. BOUNDD. CONSTRAINT答案:A26. 以下哪个子句用于在SQL 中进行条件筛选()A. WHEREB. HAVINGC. FROMD. GROUP BY答案:A27. HAVING 子句通常与()一起使用A. GROUP BYB. ORDER BYC. WHERED. FROM答案:A28. 在SQL 中,用于创建视图的语句是()A. CREATE VIEWB. MAKE VIEWC. BUILD VIEWD. ESTABLISH VIEW 答案:A29. 以下哪个关键字用于删除视图()A. DROP VIEWB. DELETE VIEWC. REMOVE VIEWD. CLEAR VIEW 答案:A30. 要在SQL 中添加注释,可以使用()A. //B. /* */C. #D. --答案:D31. 在SQL 中,以下哪种数据类型用于存储日期和时间()A. DATEB. TIMEC. DATETIMED. TIMESTAMP答案:C32. 用于提取日期部分的函数是()A. DATEPART()B. DAY()C. MONTH()D. YEAR()答案:A33. 以下哪个函数用于计算字符串的长度()A. LENGTH()B. SIZE()C. COUNT()D. LEN()答案:A34. 在SQL 中,用于将字符串转换为大写的函数是()A. UPPER()B. TO_UPPER()C. CAPITALIZE()D. BIGCASE()答案:A35. 用于将字符串转换为小写的函数是()A. LOWER()B. TO_LOWER()C. SMALLCASE()D. DECAPITALIZE()答案:A36. 以下哪个函数用于去除字符串两端的空格()A. TRIM()B. CLEAN()C. REMOVE_SPACES()D. STRIP()答案:A37. 在SQL 中,用于执行事务的语句是()A. BEGIN TRANSACTIONB. START TRANSACTIONC. OPEN TRANSACTIOND. INITIATE TRANSACTION答案:A38. 提交事务使用的语句是()A. COMMITB. SUBMITC. CONFIRMD. VALIDATE答案:A39. 回滚事务使用的语句是()A. ROLLBACKB. REVERTC. CANCELD. ABORT答案:A40. 以下哪个关键字用于在SQL 中创建存储过程()A. CREATE PROCEDUREB. MAKE PROCEDUREC. BUILD PROCEDURED. ESTABLISH PROCEDURE答案:A41. 调用存储过程使用的语句是()A. EXECUTEB. CALLC. INVOKED. RUN答案:B42. 在SQL 中,用于删除存储过程的语句是()A. DROP PROCEDUREB. DELETE PROCEDUREC. REMOVE PROCEDURED. CLEAR PROCEDURE答案:A43. 以下哪个关键字用于在SQL 中创建触发器()A. CREATE TRIGGERB. MAKE TRIGGERC. BUILD TRIGGERD. ESTABLISH TRIGGER44. 删除触发器使用的语句是()A. DROP TRIGGERB. DELETE TRIGGERC. REMOVE TRIGGERD. CLEAR TRIGGER答案:A45. 在SQL 中,用于授予权限的语句是()A. GRANTB. ALLOWC. PERMITD. AUTHORIZE答案:A46. 收回权限使用的语句是()A. REVOKEB. DENYC. REFUSED. FORBID答案:A47. 以下哪个关键字用于在SQL 中创建索引的唯一性约束()A. UNIQUEB. PRIMARY KEYC. FOREIGN KEYD. CHECK答案:A48. 用于定义主键约束的关键字是()A. PRIMARY KEYB. UNIQUE KEYC. FOREIGN KEYD. INDEX KEY答案:A49. 外键约束使用的关键字是()A. FOREIGN KEYB. OUTER KEYC. RELATED KEYD. REFERENCED KEY答案:A50. 以下哪个约束用于检查数据的有效性()A. CHECKB. VALIDATEC. INSPECTD. VERIFY答案:A51. 在SQL 中,以下哪个语句用于创建数据库()A. CREATE DATABASEB. MAKE DATABASEC. BUILD DATABASED. ESTABLISH DATABASE 答案:A52. 要删除数据库,应使用的语句是()A. DROP DATABASEB. DELETE DATABASEC. REMOVE DATABASED. CLEAR DATABASE 答案:A53. 以下哪个关键字用于在SQL 中切换数据库()A. USEB. SELECT DBC. CHANGE DBD. SWITCH DB答案:A54. 在SQL 中,以下哪种操作可以对多个表同时进行()A. 联合查询B. 子查询C. 交叉连接D. 内连接55. 子查询可以在以下哪个子句中使用()A. SELECTB. FROMC. WHERED. 以上都可以答案:D56. 以下哪个语句用于在SQL 中创建用户()A. CREATE USERB. MAKE USERC. BUILD USERD. ESTABLISH USER答案:A57. 删除用户使用的语句是()A. DROP USERB. DELETE USERC. REMOVE USERD. CLEAR USER答案:A58. 在SQL 中,用于修改表结构的语句是()A. ALTER TABLEB. MODIFY TABLEC. CHANGE TABLED. UPDATE TABLE答案:A59. 以下哪个操作可以添加列到表中()A. ADD COLUMNB. INSERT COLUMNC. APPEND COLUMND. PUT COLUMN答案:A60. 要删除表中的列,应使用()A. DROP COLUMNB. DELETE COLUMNC. REMOVE COLUMND. CLEAR COLUMN答案:A61. 在SQL 中,以下哪个关键字用于对结果集进行分页()A. PAGEB. PAGINGC. OFFSETD. LIMIT答案:D62. 以下哪个函数用于返回当前日期()A. CURDATE()B. NOW()C. CURRENT_DATE()D. TODAY()答案:C63. 用于返回当前时间的函数是()A. CURTIME()B. NOW()C. CURRENT_TIME()D. THIS_TIME()答案:C64. 在SQL 中,以下哪个关键字用于为表中的列设置默认值()A. DEFAULTB. INITIALC. BASED. START答案:A65. 以下哪个语句用于在SQL 中重命名表()A. RENAME TABLEB. MODIFY TABLE NAMEC. CHANGE TABLE NAMED. UPDATE TABLE答案:A66. 要获取表的结构信息,可以使用以下哪个语句()A. DESCRIBE TABLEB. SHOW TABLE STRUCTUREC. EXPLAIN TABLED. GET TABLE DETAILS答案:A67. 在SQL 中,以下哪个关键字用于在查询结果中去除重复行()A. DISTINCTB. UNIQUEC. SINGLED. ONLY答案:A68. 以下哪个函数用于对字符串进行拼接()A. CONCAT()B. JOIN()C. MERGE()D. COMBINE()答案:A69. 在SQL 中,用于创建临时表的关键字是()A. TEMPORARY TABLEB. TEMP TABLEC. TRANSIENT TABLED. SHORT_LIVED TABLE答案:A70. 以下哪个语句用于在SQL 中为列添加注释()A. COMMENT ON COLUMNB. NOTE ON COLUMNC. REMARK ON COLUMND. EXPLAIN COLUMN答案:A71. 在SQL 中,以下哪个关键字用于在子查询中引用外部查询的结果()A. CORRELATEDB. RELATEDC. CONNECTEDD. LINKED答案:A72. 以下哪个操作符用于在SQL 中进行范围查询()A. BETWEENB. INC. LIKED. EXISTS答案:A73. 用于模糊匹配的操作符是()A. LIKEB. SIMILARC. MATCHD. CLOSE_TO答案:A74. 在SQL 中,以下哪个关键字用于对查询结果进行排序时按照多个列进行()A. ORDER BY MULTIPLEB. SORT BY SEVERALC. ORDER BY MORE THAN ONED. ORDER BY MULTIPLE COLUMNS答案:D75. 以下哪个函数用于返回字符串的子串()A. SUBSTRING()B. PART()C. SEGMENT()D. SLICE()答案:A76. 在SQL 中,以下哪个关键字用于在存储过程中定义输入参数()A. INB. OUTC. INOUTD. PARAMETER答案:A77. 用于定义输出参数的关键字是()A. INB. OUTC. INOUTD. PARAMETER答案:B78. 以下哪个关键字用于在存储过程中定义既可以输入又可以输出的参数()A. INB. OUTC. INOUTD. PARAMETER答案:C79. 在SQL 中,以下哪个关键字用于在创建表时指定自增列()A. AUTO_INCREMENTB. SELF_INCREMENTC. AUTO_GROWD. SELF_GROW答案:A80. 以下哪个语句用于在SQL 中创建序列()A. CREATE SEQUENCEB. MAKE SEQUENCEC. BUILD SEQUENCED. ESTABLISH SEQUENCE 答案:A81. 要获取序列的下一个值,可以使用以下哪个函数()A. NEXTVAL()B. GET_NEXT()C. NEXT_VALUE()D. FOLLOWING_VALUE()答案:A82. 在SQL 中,以下哪个关键字用于锁定表()A. LOCKB. HOLDC. FREEZED. BLOCK答案:A83. 以下哪种锁类型用于防止其他事务读取或修改数据()A. 共享锁B. 排他锁C. 意向共享锁D. 意向排他锁答案:B84. 共享锁允许其他事务()A. 读取数据B. 修改数据C. 删除数据D. 以上都不行答案:A85. 在SQL 中,以下哪个关键字用于解锁表()A. UNLOCKB. RELEASEC. FREED. UNBIND答案:A86. 以下哪个函数用于计算两个日期之间的天数差()A. DATEDIFF()B. DATE_DIFFERENCE()C. DAY_DIFFERENCE()D. TIME_DIFFERENCE()答案:A87. 在SQL 中,以下哪个关键字用于在查询中使用别名()A. ASB. LIKEC. SAME ASD. EQUALS答案:A88. 以下哪个语句用于在SQL 中创建索引的唯一约束()A. UNIQUE INDEXB. PRIMARY INDEXC. FOREIGN INDEXD. CHECK INDEX答案:A89. 要在SQL 中创建全文索引,应使用()A. FULLTEXT INDEXB. COMPLETE TEXT INDEXC. ALL_TEXT INDEXD. WHOLE_TEXT INDEX 答案:A90. 在SQL 中,以下哪个关键字用于在存储过程中声明变量()A. DECLAREB. DEFINEC. STATED. ANNOUNCE答案:A91. 以下哪个语句用于在SQL 中为变量赋值()A. SETB. ASSIGNC. GIVED. PUT答案:A92. 在SQL 中,以下哪个关键字用于在存储过程中进行条件判断()A. IFB. WHENC. CASED. CHECK答案:A93. 以下哪种语句用于在SQL 中进行循环操作()A. FORB. WHILEC. LOOPD. 以上都是答案:D94. 在SQL 中,用于退出循环的语句是()A. BREAKB. EXITC. STOPD. END答案:A95. 以下哪个函数用于将数字转换为字符串()A. CAST()B. CONVERT()C. TO_STRING()D. NUM_TO_STR()答案:B96. 在SQL 中,用于获取当前会话的用户名称的函数是()A. CURRENT_USERB. SYSTEM_USERC. LOGGED_IN_USERD. SESSION_USER答案:A97. 以下哪个关键字用于在SQL 中创建存储函数()A. CREATE FUNCTIONB. MAKE FUNCTIONC. BUILD FUNCTIOND. ESTABLISH FUNCTION 答案:A98. 要删除存储函数,应使用的语句是()A. DROP FUNCTIONB. DELETE FUNCTIONC. REMOVE FUNCTIOND. CLEAR FUNCTION答案:A99. 在SQL 中,用于获取数据库版本信息的函数是()A. VERSION()B. DB_VERSION()C. DATABASE_VERSION()D. SYSTEM_VERSION()答案:A100. 以下哪个操作可以在SQL 中对表进行重命名()A. RENAME TABLEB. MODIFY TABLE NAMEC. CHANGE TABLE NAMED. UPDATE TABLE NAME答案:A。
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”,否则薪资将更新为该范围内的最小值。
数据库plsql练习

status:=normal;
select count(*) into counter from student where sno=sno1 and class=class1
if counter=0 then
raise not_registered; else update score set degree=100 where sno=sno1 ; end if; return status; exception when not_registeres then raise_application_error(-21003,’student not regodtered for class’); when others then null; end;
4
• declare • record emp%rowtype; • v_tax number(4); cursor emp_cursor is select * from emp; • e exception; • begin • open emp_cursor; • LOOP • fetch emp_cursor into record; • EXIT when emp_cursor%notfound; • if record.ename='ERROR' then • raise e; • end if; •
1、PL/SQL编程:已经有员工档案表emp和部门信息表dept,结构分别为 emp(empno, ename, job, hiredate, sal, comm., deptno)和dept(deptno, dname, loc)。要求编写一个存储过程,当已知一个雇员的姓名时,用于获取该雇员 的工资以及所在的部门名称。如果未找到该雇员,则显示一个例外信息, 提示该雇员姓名不存在。 2、PL/SQL编程:已知有学生信息表student和成绩表score,结构分别为 student(sno,sname,sex,birthday,class)和score(sno,cno,degree),其中cno代表课 程号,degree代表分数。要求编写一个存储过程,当已知一个学生的姓名 时,用于获取该学生的平均成绩(没有成绩的情况,平均成绩为0)。如果 在student表中未找到该学生,则显示一个例外信息,提示该学生不存在。
SQL存储过程试题及答案

--写存储过程及调用存储过程/*1.写出创建分数存储过程用于计算某门课程成绩最高分、最低分、平均分,参数课程号。
*/--2.写出统计某门课选人数的存储过程,输入参数课程号,输出参数人数。
/*3.创建存储过程,要求根据学生姓名查看学生的籍贯.(要求:在存储过程里定义两个参数,第一个接收由调用程序指定的输入值(学生姓名),第二个参数用于将该值返回调用程序)*//*4.程序员工资表:ProWage字段名称数据类型说明ID int 自动编号,主键PName Char(10) 程序员姓名Wage int 工资创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱?例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:请编写T-SQL来实现如下功能:查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。
/*5.编写一个存储过程PR_GET_PASS_RA TE统计某门课程的及格率,其传入参数是课程号P_CNO,传出参数是该课程成绩的及格率P_PASSRATE,及格率的格式形如:86.56%。
6.创建触发器T_1,功能是当向数据表学生添加记录时,显示学生的信息。
create trigger T_1 on 学生after insertas select * from 学生insert into 学生values('3001','李四','男','计本10')7.创建触发器T_2,功能是当向数据表班级添加、修改和删除记录时,显示学生的信息。
SQL 数据库基础考试

SQL 数据库基础考试(答案见尾页)一、选择题1. SQL 中的哪个关键字用于指定查询结果的排序?A. ORDER BYB. GROUP BYC. DISTINCTD. HAVING2. 在 SQL 中,用于计算两个日期之间相差的天数的函数是什么?A. DATEADDB. DATEDIFFC. TIMESTAMPDIFFD. AVG3. SQL 中的哪个操作符用于修改现有数据?A. INSERTB. UPDATEC. DELETED. CREATE4. 在 SQL 中,用于从表中选择所有列的子查询是哪种类型?A. 单行子查询B. 多行子查询C. 子查询D. 嵌套子查询5. SQL 中的哪个关键字用于将查询结果保存到新表中?A. INSERT INTOB. CREATE TABLEC. SELECT INTOD. ALTER TABLE6. 在 SQL 中,用于限制查询结果数量的关键字是什么?A. LIMITB. OFFSETC. FETCHD. ORDER BY7. SQL 中的哪个操作符用于组合多个条件?A. ANDB. ORC. NOTD. BETWEEN8. 在 SQL 中,用于删除表中所有数据的命令是什么?A. DELETEB. DROPC. TRUNCATED. DELETE FROM9. SQL 中的哪个函数用于返回字符串的长度?A. LENGTHB. STRLENC. CHARACTER_LENGTHD. CONCAT10. 在 SQL 中,用于按列对查询结果进行分组的关键字是什么?A. GROUP BYB. ORDER BYC. DISTINCTD.HAVING11. SQL 中的哪一命令可以用来执行查询操作?A. SELECTB. INSERTC. UPDATED. DELETE12. 在 SQL 中,如果要修改表结构,应该使用哪一命令?A. ALTER TABLEB. CREATE TABLEC. DROP TABLED. REPLACE TABLE13. SQL 中的哪一命令可以用来创建一个新的数据表?A. CREATE TABLEB. ALTER TABLEC. DROP TABLED. REPLACE TABLE14. 在 SQL 中,假设你有一个名为 "students" 的表,可以通过哪一命令来查看学生的姓名和年龄?A. SELECT name, age FROM students;B. SELECT * FROM students;C. INSERT INTO students (name, age) VALUES ('张三', 20);D. DELETE FROM students WHERE age > 18;15. 在 SQL 中,如果要删除一个名为 "students" 的表,应该使用哪一命令?A. DROP TABLE students;B. DELETE TABLE students;C. CASCADE TABLE students;D. TRUNCATE TABLE students;16. SQL 中的哪一命令可以用来为表中的某一列设置默认值?A. ALTER TABLEB. CREATE TABLEC. MODIFY TABLED. ALTER COLUMN17. 在 SQL 中,如果要修改一个已存在的表的列名,应该使用哪一命令?A. ALTER TABLEB. CREATE TABLEC. MODIFY TABLED. ALTER COLUMN18. SQL 中的哪一命令可以用来排序查询结果?A. ORDER BYB. GROUP BYC. DISTINCTD. HAVING19. 在 SQL 中,假设你有一个名为 "orders" 的表,可以通过哪一命令来计算订单总金额?A. SELECT SUM(amount) FROM orders;B. SELECT AVG(amount) FROM orders;C. SELECT COUNT(orderID) FROM orders;D. SELECT MAX(amount) FROM orders;20. SQL 中的哪一命令可以用来插入一个新的记录到表中?A. INSERT INTOB. CREATEC. REPLACED. ALTER21. SQL 中的哪个关键字用于指定查询结果的排序方向?A. ORDER BYB. GROUP BYC. HAVINGD. DISTINCT22. 在 SQL 中,用于修改现有数据表结构的命令是?A. CREATE TABLEB. ALTER TABLEC. DELETE TABLED. DROP TABLE23. SQL 中的哪个函数用于返回当前日期和时间?A. NOW()B. CURRENT_DATE()C. LOCALTIME()D. DATE()24. 在 SQL 中,用于条件筛选的运算符是?A. =B. !=C. >D. <=25. SQL 中的哪个语句用于插入新的记录?A. INSERT INTOB. UPDATEC. DELETED. CREATE26. 在 SQL 中,用于删除表中所有记录的命令是?A. DELETE FROMB. DROP TABLEC. TRUNCATE TABLED. DELETE27. SQL 中的哪个运算符用于执行算术运算?A. +B. -C. *D. /28. 在 SQL 中,用于分组查询结果的运算符是?A. ORDER BYB. GROUP BYC. HAVINGD. DISTINCT29. 在 SQL 中,用于连接两个或多个表的运算符是?B. UNIONC. INTERSECTD. EXCEPT30. 在 SQL 中,如果要删除一个表,应该使用哪一命令?A. DROP TABLEB. DELETE TABLEC. TRUNCATE TABLED. DELETE31. SQL 中的哪一命令可以用来查看表的结构?A. DESCRIBE TABLEB. SHOW TABLESC. EXPLAIN TABLED. SELECT * FROM INFORMATION_SCHEMA.TABLES32. 在 SQL 中,如果要修改表中的数据,应该使用哪一命令?A. INSERTB. UPDATEC. DELETED. CREATE33. SQL 中的哪一命令可以用来从一个表复制数据到另一个表?A. INSERT INTO ... SELECTB. CREATE TABLE ... LIKEC. INSERT INTO ... VALUESD. DELETE FROM ... JOIN34. 在 SQL 中,如果要排序查询结果,应该使用哪一命令?A. ORDER BYB. GROUP BYC. HAVINGD. DISTINCT35. SQL 中的哪一命令可以用来限制查询结果的数量?B. OFFSETC. FETCHD. SKIP36. 在 SQL 中,如果要查看当前数据库,应该使用哪一命令?A. SHOW DATABASESB. USE DATABASEC. SELECT * FROM INFORMATION_SCHEMA.DATABASESD. DESCRIBE DATABASES37. SQL 中的哪一命令可以用来从表中检索所有列?A. SELECT *B. SELECT DISTINCT *C. SELECT ALL *D. SELECT *38. 在 SQL 中,哪种数据类型允许存储文本字符串?A. INTB. VARCHARC. DATED. TIME39. SQL 中的哪一命令可以用来修改现有表结构?A. CREATE TABLEB. ALTER TABLEC. DROP TABLED. REPLACE TABLE40. 在 SQL 中,哪种子查询可以在主查询中用作条件?A. 带有 EXISTS 的子查询B. 带有 IN 的子查询C. 带有 ANY 的子查询D. 带有 ALL 的子查询41. SQL 中的哪一命令可以用来删除表中的所有行?A. DELETEB. TRUNCATEC. DROPD. DELETE ALL42. 在 SQL 中,哪种类型的约束可以用来确保字段值不重复?A. 主键约束B. 外键约束C. 唯一约束D. 非空约束43. 在 SQL 中,哪种类型的约束可以用来限制字段值的取值范围?A. 主键约束B. 外键约束C. 唯一约束D. 检查约束44. 在 SQL 中,哪种命令可以用来插入新的记录?A. INSERT INTOB. REPLACE INTOC. DELETED. CREATE二、问答题1. 什么是数据库管理系统(DBMS)?2. 关系数据库模型有哪些类型?3. 什么是SQL语言?4. 什么是数据库事务?为什么事务很重要?5. 什么是数据库索引?索引有什么优点?6. 并发控制:索引有助于提高数据库系统的并发性能,避免多个并发事务之间的冲突。
Oracle PLSQL课参考答案
第一章PL/SQL概述1.3变量声明1、a正确,其余错误2、BEGINDBMS_OUTPUT.PUT_LINE('my first pl/sql block'); END;3、declarev_ename emp.ename%type := 'SCOTT';v_sal emp.sal%type;beginSELECT sal into v_salFROM empWhere ename=v_ename;DBMS_OUTPUT.PUT_LINE('雇员薪水='||v_sal); END;4、variable v_ename varchar2BEGINSELECT ename into :v_enameFROM empWhere empno=&emp_num;END;5、DECLAREmaxDepNo integer;BEGINSELECT MAX(deptno)INTO maxDepNoFROM dept ;dbms_output.put_line(maxDepNo);END;1.5与Oracle的交互1、create table test as select * from emp where 1=2; 2、DECLAREv_sal emp.sal%type;BEGINselect max(sal) into v_sal from emp;insert into test select * from emp where sal=v_sal;END;3、set serveroutput onDECLAREv_sal emp.sal%type;BEGINselect avg(sal) into v_sal from emp;update test set sal=v_sal;dbms_output.put_line(v_sal);END;第二章:编写控制结构2.1条件分支语句1、declarev_empno emp.empno%type := &p_empno;v_sal emp.sal%type;v_var varchar2(20);beginselect sal into v_sal from emp where empno = v_empno;if v_sal<2000 thenv_var := '挣的不多,需努力';elsif v_sal between 2000 and 5000 thenv_var := '收入还可以,还需努力';elsev_var := '挣的挺多了,歇歇吧';end if;dbms_output.put_line(v_sal|| v_var);end;2.2循环语句1、create table message(results varchar2(10));beginfor i in 1..10 loopif i=6 or i=8 thennull;elseinsert into message values(i);end if;end loop;commit;end;beginfor i in 1..10 loopif i<>6 and i<>8 theninsert into message values(i);end if;end loop;commit;end;第三章:复合数据类型3.1复合数据类型第四章:编写游标4.2游标的处理1、declarev_sal emp.sal%type;v_ename emp.ename%type;cursor emp_cursor isselect ename,sal from emp;beginopen emp_cursor;loopfetch emp_cursor into v_ename,v_sal;if(v_sal >3000) thendbms_output.put_line(v_ename||' '||v_sal);exit;end if;end loop;close emp_cursor;end;4.5带参数的游标1、declare--v_ename emp.ename%type;cursor emp_cursor(s_sal number,e_sal number) is select ename from empwhere sal between s_sal and e_sal;beginFOR emp_record IN emp_cursor(0,2000) LOOPdbms_output.put_line('薪水低于2000的用户是:'||emp_record.ename);end loop;dbms_output.put_line('===================================');FOR emp_record IN emp_cursor(2000,4000) LOOPdbms_output.put_line('薪水大于2000,低于4000的用户是:'||emp_record.ename);end loop;dbms_output.put_line('===================================');FOR emp_record IN emp_cursor(4000,1000000) LOOPdbms_output.put_line('薪水大于4000的用户是:'||emp_record.ename);end loop;end;declarev_ename emp.ename%type;cursor emp_cursor(s_sal number,e_sal number) isselect ename from empwhere sal between s_sal and e_sal;beginopen emp_cursor(0,2000);loopfetch emp_cursor into v_ename;exit when emp_cursor%notfound;dbms_output.put_line('薪水低于2000的用户是:'||v_ename);end loop;if emp_cursor%isopen thenclose emp_cursor;end if;open emp_cursor(2000,4000);loopfetch emp_cursor into v_ename;exit when emp_cursor%notfound;dbms_output.put_line('薪水大于2000,低于4000的用户是:'||v_ename);end loop;if emp_cursor%isopen thenclose emp_cursor;end if;open emp_cursor(4000,1000000);loopfetch emp_cursor into v_ename;exit when emp_cursor%notfound;dbms_output.put_line('薪水大于4000的用户是:'||v_ename);end loop;if emp_cursor%isopen thenclose emp_cursor;end if;end;第五章:异常处理1、create table message(result varchar2(100));2、declarev_sal emp.sal%type;v_ename emp.ename%type;v_num number;e_none_sal exception;e_many_sal exception;pragma exception_init(e_none_sal,-20202);v_var varchar2(100);beginv_sal:=&p_sal;select count(sal) into v_numfrom empwhere sal=v_sal;if v_num=1 thenselect ename into v_enamefrom empwhere sal=v_sal;dbms_output.put_line(v_ename||' '||v_sal);elsif v_num=0 thenRaise_Application_Error(-20202,'没有雇员挣'||v_sal||'的薪水');elsif v_num>1 thenraise e_many_sal;end if;exceptionwhen e_none_sal thenv_var := sqlerrm;dbms_output.put_line(v_var );insert into messagevalues(v_var);when e_many_sal thendbms_output.put_line('太多雇员挣sal的薪水'); insert into messagevalues('太多雇员挣sal的薪水');end;3、DECLAREv_empno emp.empno%TYPE := 7369;yearlog INT;BEGINSELECT trunc(months_between(SYSDATE,hiredate)/12)INTO yearlogFROM empWHERE empno = v_empno;dbms_output.put_line(yearlog);EXCEPTIONWHEN NO_DATA_FOUND THENdbms_output.put_line('此员工号不存在');END;4.DECLAREv_name emp.ename%TYPE;v_job emp.job%TYPE;BEGINSELECT e2.ename,e2.jobINTO v_name,v_jobFROM emp e1,emp e2WHERE e1.mgr = e2.empnoAND e1.mgr IS NULL;EXCEPTIONWHEN NO_DATA_FOUND THENdbms_output.put_line('没有最高管理者');WHEN TOO_MANY_ROWS THENdbms_output.put_line('最高管理者人员过多');END;5.declareCURSOR m_cursorISSELECT deptno,AVG(sal) AS avgsalFROM empGROUP BY deptno;e_tohig EXCEPTION;PRAGMA exception_init(e_tohig,-20001);beginFOR r_cur IN m_cursor LOOPIF r_cur.avgsal >= 15000 THENRaise_Application_Error(-20001,'该部门的平均工资过高'); END IF;END LOOP;EXCEPTIONWHEN e_tohig THENRaise_Application_Error(-20001,'该部门的平均工资过高'); end;第六章:创建存储过程6.2存储过程处理6.2.1过程的参数1、Create or replace procedure sal_proc(p_sal in emp.sal%type,p_mes out varchar2)isv_sal emp.sal%type;beginselect avg(sal) into v_sal from emp;if v_sal < p_sal thenp_mes := '薪水太高了' ;elsep_mes := '薪水正常' ;end if;end;2、Create or replace procedure testisp_mes varchar2(20);beginsal_proc(4000,p_mes);dbms_output.put_line(p_mes);end;6.2.2传递参数的方法1、Create or replace procedure raise_sal(p_deptno in emp.deptno%type default 20,p_hiredate in date default to_date('2006-01-01','yyyy-mm-dd'), p_sal in emp.sal%type,p_count out number)isbeginupdate empset sal = sal + p_salwhere deptno = p_deptno and hiredate<p_hiredate;p_count := SQL%rowcount;end raise_sal;2、Create or replace procedure testisv_sal emp.sal%type;v_count number(10);beginv_sal := 200;raise_sal(30,to_date(‘1999-01-01’,‘yyyy-mm-dd’),v_sal,v_count ); --按照位置方式传递值--raise_sal(p_sal=>v_sal,p_count=>v_count); --按照指定方式传递值--raise_sal(30,p_count=>v_count,p_sal=>v_sal); --按照组合方式传递值dbms_output.put_line(v_count);end;第七章:创建函数7.2函数处理1、create or replace function func(v_empno in emp.empno%type)return varchar2isv_ename emp.ename%type;beginselect ename into v_enamefrom empwhere empno= v_empno;return v_ename;end;VARIABLE g_ename varchar2EXEC :g_ename := func(7369)Print g_ename2、create or replace function func(v_deptno in emp.deptno%type)return numberisv_sal emp.sal%type;beginselect max(sal) into v_salfrom empwhere deptno = v_deptno;return v_sal;end;create or replace procedure sal_procisv_sal emp.sal%type;e_many_sal EXCEPTION;v_message varchar2(20);cursor emp_cursor isselect deptno,dname from dept;beginfor emp_record in emp_cursor loopv_sal := func(emp_record.deptno);if v_sal > 4000 thenv_message := emp_record.dname;raise e_many_sal;end if;end loop;exceptionwhen e_many_sal thendbms_output.put_line(v_message||'部门的薪水太高了'); end;第八章:创建包8.1包的基础1、create table test(empno number(2) constraint emp_pk primary key, ename varchar2(10),sal number(7,2));2、create or replace package test_pakisPROCEDURE add_user(p_empno in number,p_ename in varchar2,p_sal in number);PROCEDURE del_user(p_empno in number);function add_sal(p_empno in number,p_sal in number)return number;end test_pak;3、create or replace package body test_pakisPROCEDURE add_user(p_empno in number,p_ename in varchar2,p_sal in number)isbegininsert into testvalues(p_empno,p_ename,p_sal);commit;end add_user;PROCEDURE del_user(p_empno in number)isbegindelete from test where empno=p_empno;commit;end del_user;function add_sal(p_empno in number,p_sal in number)return numberisv_sal number(10);beginupdate testset sal=sal+p_salwhere empno=p_empno;commit;select sal into v_salfrom testwhere empno=p_empno;return v_sal;end add_sal;end test_pak;4、exec test_pak.add_user(1,'ljs',1000);declarev_sal number(7,2);beginv_sal:=test_pak.add_sal(1,500);dbms_output.put_line(v_sal);end;exec test_pak.del_user(1);第九章:触发器9.2DML触发器9.2.1DML语句触发器1、CREATE OR REPLACE PROCEDURE secure_dmlISBEGINIF (TO_CHAR(SYSDATE, 'DY') in ('星期六','星期日')) or(TO_CHAR (SYSDATE, 'HH24:MI') NOT BETWEEN '08:45' AND '17:30') THEN RAISE_APPLICATION_ERROR (-20205, '你只能在正常的办公时间改变数据');END IF;END secure_dml;1)、CREATE OR REPLACE TRIGGER secure_prod BEFORE INSERT OR UPDATE OR DELETE ON deptBEGINsecure_dml;END secure_prod;2)、INSERT INTO dept VALUES (50,’dep50’,’shenyang’);9.2.2DML行触发器1、Create table tmp_table(Empno number(4),Ename varchar2(10),Sal_old number(7,2),Sal_new number(7,2),Job varchar2(10));2、Create or replace trigger sal_empafter update on empfor each rowBeginif(:new.sal <:old.sal) theninsert into tmp_table values(:old.empno,:old.ename,:old.sal,:new.sal,:old.job);end if;End;update emp set sal=2000;。
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 由执行函数时输入。
存储过程语法练习题
存储过程语法练习题存储过程语法练习题存储过程是数据库中一种非常重要的对象,它可以用来封装一系列的SQL语句,实现特定的功能。
通过存储过程,我们可以提高数据库的性能,简化复杂的业务逻辑,并且可以实现一些数据库本身不支持的功能。
本文将通过一些练习题来帮助读者加深对存储过程语法的理解和应用。
练习一:创建一个简单的存储过程假设有一个学生表student,包含字段id、name和age。
请编写一个存储过程,用于查询年龄大于等于18岁的学生信息,并按照年龄降序排序。
解答:```sqlCREATE PROCEDURE GetAdultStudentsASBEGINSELECT id, name, ageFROM studentWHERE age >= 18ORDER BY age DESCEND```练习二:带参数的存储过程在练习一的基础上,假设需要根据学生的姓名查询学生信息。
请修改存储过程,使其可以接受一个姓名参数,并根据姓名查询学生信息。
解答:```sqlCREATE PROCEDURE GetStudentByName@name NVARCHAR(50)ASBEGINSELECT id, name, ageFROM studentWHERE name = @nameEND```练习三:带输出参数的存储过程假设有一个学生表student,包含字段id、name和age。
请编写一个存储过程,用于查询年龄大于等于18岁的学生数量,并将结果输出。
解答:```sqlCREATE PROCEDURE GetAdultStudentCount@count INT OUTPUTASBEGINSELECT @count = COUNT(*)FROM studentWHERE age >= 18END```练习四:带返回值的存储过程在练习三的基础上,假设需要查询年龄大于等于18岁的学生数量,并返回结果。
请修改存储过程,使其可以返回学生数量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一阶段Q.编写一个PL/SQL程序块以显示所给出雇员编号的雇员的详细信息。
A.DECLAREerec emp%ROWTYPE;BEGINSELECT * INTO erec FROM emp WHERE empno=&雇员编号;DBMS_OUTPUT.PUT_LINE('EmpNo' || ' ' || 'Ename' || ' '|| 'Job' || ' ' || 'Manager' || ' ' || 'HireDate' || ' ' || 'Salary' || ' ' || 'Commision' || ' ' || 'DeptNo');DBMS_OUTPUT.PUT_LINE(erec.ename || ' ' || erec.job || ' ' || erec.mgr || ' ' ||erec.hiredate || ' ' || erec.sal || ' ' || m || ' ' || erec.deptno);END;/Q.编写一个PL/SQL程序块以计算某个雇员的年度薪水总额。
A.DECLAREesal NUMBER;eename emp.ename%TYPE;BEGINSELECT (NVL(sal,0)+NVL(comm,0))*12,ename INTO esal,eename FROM emp WHERE empno=&雇员编号;DBMS_OUTPUT.PUT_LINE(eename || '''s Years Salary is ' || esal);END;/Q.按下列加薪比执行:Deptno Raise(%age)10 5%20 10%30 15%40 20%加薪的百分比是以他们现有的薪水为根据的。
写一PL/SQL以对指定雇员加薪。
A.DECLAREvcounter NUMBER:=10;vraise NUMBER;BEGINLOOPEXIT WHEN vcounter>40;UPDATE emp set sal=NVL(sal,0)+NVL(sal,0)*0.05 WHERE deptno=vcounter;vcounter:=vcounter+10;END LOOP;END;/Q.编写一PL/SQL以向"emp"表添加10个新雇员编号。
(提示:如果当前最大的雇员编号为7900,则新雇员编号将为7901到7910)A.DECLAREvcounter NUMBER;BEGINSELECT MAX(empno) INTO vcounter FROM emp;FOR i IN 1..10LOOPvcounter:=vcounter+1;INSERT INTO emp(empno) V ALUES(vcounter);END LOOP;END;/Q.只使用一个变量来解决实验课作业4。
ADECLAREerec emp%ROWTYPE;-- vraise NUMBER;BEGINSELECT * INTO erecFROM empWHERE ename='&ename';IF erec.job='CLERK' THENUPDATE emp SET sal=sal+500 WHERE empno=erec.empno;ELSIF erec.job='SALESMAN' THENUPDATE emp SET sal=sal+1000 WHERE empno=erec.empno;ELSIF erec.job='ANAL YST' THENUPDATE emp SET sal=sal+1500 WHERE empno=erec.empno;ELSEUPDATE emp SET sal=sal+2000 WHERE empno=erec.empno;END IF;-- UPDATE emp SET sal=sal+vraise WHERE empno=erec.empno;-- DBMS_OUTPUT.PUT_LINE(vraise);END;/Q.接受两个数相除并且显示结果。
如果第二个数为0,则显示消息"DIVIDE BY ZERO"。
A.DECLAREnum1 NUMBER;num2 NUMBER;BEGINnum1:=#num2:=#DBMS_OUTPUT.PUT_LINE(num1 || '/' || num2 || ' is ' || num1/num2);EXCEPTIONWHEN ZERO_DIVIDE THENDBMS_OUTPUT.PUT_LINE('Didn''t your teacher tell you not to DIVIDE BY ZERO?'); END;/第二阶段Q.编写一个PL/SQL程序块,对名字以"A"或"S"开始的所有雇员按他们的基本薪水的10%加薪。
A.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;/Q.编写一PL/SQL,对所有的"销售员"(SALESMAN)增加佣金500.A.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;/Q.编写一PL/SQL,以提升两个资格最老的"职员"为"高级职员"。
(工作时间越长,优先级越高)A.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;/Q.编写一PL/SQL,对所有雇员按他们基本薪水的10%加薪,如果所增加的薪水大于5000,则取消加薪。
A.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 WHERE CURRENT OF c1;DBMS_OUTPUT.PUT_LINE(i.sal);END IF;END LOOP;END;/Q.显示EMP中的第四条记录。
A.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.HIREDA TE || ' ' || i.SAL || ' ' || M || ' ' || i.DEPTNO);EXIT;END IF;END LOOP;END;/第三阶段Q.使用REF游标显示"EMP"表中的值。
A.DECLARETYPE emprectyp IS RECORD(EMPNO emp.empno%TYPE,ENAME emp.ename%TYPE,JOB emp.job%TYPE,MGR emp.mgr%TYPE,HIREDATE emp.hiredate%TYPE,SAL emp.sal%TYPE,COMM m%TYPE,DEPTNO emp.deptno%TYPE);TYPE emp_cursor IS REF CURSOR RETURN emp%ROWTYPE;vemp_cur EMP_CURSOR;vemp_rec EMPRECTYP;BEGINOPEN vemp_cur FOR SELECT * FROM emp;LOOPFETCH vemp_cur INTO vemp_rec;EXIT WHEN vemp_cur%NOTFOUND;DBMS_OUTPUT.PUT(vemp_rec.empno||' '||vemp_rec.ename||' '||vemp_rec.job);DBMS_OUTPUT.PUT(vemp_rec.mgr||' '||vemp_rec.hiredate||' '||vemp_rec.sal);DBMS_OUTPUT.PUT_line(vemp_m||' '||vemp_rec.deptno);END LOOP;CLOSE vemp_cur;END;/Q.从"EMP"中获得值送到PL/SQL表,将PL/SQL表中的薪水值增加500,并向用户显示增加的薪水及其他详细信息。