存储过程与游标练习

合集下载

Oralce PLSQL 存储过程 之 游标 实践!

Oralce PLSQL 存储过程 之 游标 实践!

声明:本文中的所有代码均是实战敲出来的!杜绝copy!代码是以游标的编写、调用、为目的。

从简单到复杂,用迭代的思想不断丰富例子功能。

希望对各位同学有所帮助。

------------单纯的一个声明,然后输入一个数,打印输出declare v_salemp.sal%type ;beginselect sal into v_sal from empwhere emp.empno=&no;dbms_output.put_line(v_sal||'Oralce存储过程实践!我是可以实现的!');end;-----------声明一个游标,遍历游标,处理游标的值/不输入参数的形式declarecursor v_sal_cursor isselect sal from emp ;var_salemp.sal%type;beginopen v_sal_cursor;loopfetch v_sal_cursor into var_sal ;exitwhen v_sal_cursor%notfound;dbms_output.put_line(var_sal ||'--------我就要成功了!!') ;dbms_output.put_line('当前游标状态:');endloop;close v_sal_cursor;end;----------声明一个游标,遍历游标,对话框输入一个参数,打印输出declarecursor v_sal_cursor isselect sal from emp where emp.empno=&no ;var_salemp.sal%type;beginopen v_sal_cursor;loopfetch v_sal_cursor into var_sal ;exitwhen v_sal_cursor%notfound;dbms_output.put_line(var_sal ||'--------我就要成功了!!') ;dbms_output.put_line('当前游标状态:');endloop;close v_sal_cursor;end;---------在这里没有用循环,所以只会取出一个结果,也就是一行记录declarecursor v_sal_cursor isselect emp.sal from emp ;var_salemp.sal%type;open v_sal_cursor;fetch v_sal_cursor into var_sal;if v_sal_cursor%foundthendbms_output.put_line('我是XXX,高级JAVA软件工程师!'|| var_sal); endif;close v_sal_cursor;end;-----用if else 判断语句,另外加上循环进行遍历的方法。

MySQL中的游标操作与存储过程使用方法

MySQL中的游标操作与存储过程使用方法

MySQL中的游标操作与存储过程使用方法引言对于开发者来说,数据操作是一个非常重要的任务。

在MySQL中,游标操作和存储过程是两个非常常见的功能,它们可以帮助我们更高效、更灵活地操作和管理数据。

本文将介绍MySQL中的游标操作和存储过程的使用方法,帮助读者更好地应用这些功能。

第一部分:游标操作什么是游标?游标是一种数据库对象,它用于处理数据集。

通过游标,我们可以逐行处理查询结果,而不是一次性地将所有结果返回。

这对于处理大量数据或者需要在结果集上进行逐行处理的情况非常有用。

游标的基本使用方法在MySQL中,使用DECLARE语句声明游标,使用FETCH语句获取游标的下一行数据,使用CLOSE语句关闭游标。

下面是一个简单的示例:```DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROMtable_name;OPEN cursor_name;FETCH cursor_name INTO variable1, variable2;CLOSE cursor_name;```在这个示例中,我们首先声明了一个名为"cursor_name"的游标,然后打开游标并获取第一行数据到变量"variable1"和"variable2"中,最后关闭游标。

游标的类型MySQL支持两种类型的游标:FORWARD_ONLY和SCROLL。

FORWARD_ONLY游标只能向前遍历结果集,而SCROLL游标可以以任何顺序遍历结果集,包括向前、向后和随机访问。

使用游标实现分页查询游标非常适合实现分页查询功能。

通过游标,我们可以在一个较大的结果集中,按照一定的页大小逐页取出数据,而不需要一次性将所有数据加载到内存中。

下面是一个使用游标实现分页查询的示例:```DECLARE page_cursor SCROLL CURSOR FOR SELECT column1, column2 FROM table_name LIMIT start_index, page_size;OPEN page_cursor;FETCH page_cursor INTO variable1, variable2;WHILE NOT done DO-- 处理当前行数据...FETCH page_cursor INTO variable1, variable2;-- 判断是否还有下一页数据IF no_more_data THENSET done = TRUE;END IF;END WHILE;CLOSE page_cursor;```在这个示例中,我们使用了SCROLL游标,并通过LIMIT子句指定了查询的起始位置和页大小。

实验6 游标与存储过程

实验6 游标与存储过程

实验6:游标与存储过程6.1 实验目的与要求(1) 掌握游标的定义和使用方法。

(2) 掌握存储过程的定义、执行和调用方法。

(3) 掌握游标和存储过程的综合应用方法。

6.2 实验案例下面以简单实例介绍游标的具体用法。

[例6.1] 利用游标选取业务科员工的编号、姓名、性别、部门和薪水字段,并逐行显示游标中的信息。

DECLARE SCROLL cur_emp CURSOR FORSELECT employeeno, employeename, sex, department, salaryFROM employeeWHERE department='业务科'ORDER BY employeeno /*定义游标*/OPEN cur_emp /*打开游标*/SELECT 'CURSOR内数据条数'=@@cursor_rows /*显示游标内记录的个数*/FETCH NEXT FROM cur_emp /*逐行提取游标中的记录*/WHILE (@@FETCH_status<>-1) /*判断FETCH语句是否执行成功*/BEGINSELECT 'cursor读取状态'=@@FETCH_status/*显示游标的读取状态*/FETCH NEXT FROM cur_emp/*提取游标下一行信息*/ENDCLOSE cur_emp/*关闭游标*/DEALLOCATE cur_emp/*释放游标*/本例中,@@cursor_rows是返回连接上最后打开的游标中当前存在的合格行的数量。

具体参数信息见表6-1所示。

@@FETCH_status是返回被FETCH语句执行的最后,而不是任何当前被连接打开的游标的状态。

具体参数见表6-2所示。

表6-2 @@FETCH_status参数返回值的描述表[例6.2] 利用游标选取业务科员工的编号、姓名、性别、部门和薪水字段,并以格式化的方式输出游标中的信息。

SQL存储过程试题及答案

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,功能是当向数据表班级添加、修改和删除记录时,显示学生的信息。

oracle 存储过程 游标的写法

oracle 存储过程 游标的写法

在 Oracle 数据库中,游标(Cursor)是用于从结果集中逐行检索数据的数据库对象。

下面是一个使用游标的基本存储过程的示例:sqlCREATE OR REPLACE PROCEDURE fetch_employee_data AS-- 声明游标CURSOR employee_cursor ISSELECT employee_id, first_name, last_name, salaryFROM employees;-- 声明变量来存储从游标中检索的数据v_employee_id employees.employee_id%TYPE;v_first_name employees.first_name%TYPE;v_last_name st_name%TYPE;v_salary employees.salary%TYPE;BEGIN-- 打开游标OPEN employee_cursor;-- 循环遍历游标中的每一行数据LOOP-- 从游标中检索数据到变量中FETCH employee_cursor INTO v_employee_id, v_first_name, v_last_name, v_salary;-- 退出循环如果游标中没有更多的数据EXIT WHEN employee_cursor%NOTFOUND;-- 在此处处理每一行数据,例如打印或执行其他操作DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Name: ' || v_first_name || ' ' || v_last_name || ', Salary: ' || v_salary);END LOOP;-- 关闭游标CLOSE employee_cursor;EXCEPTIONWHEN OTHERS THEN-- 处理异常情况,例如打印错误消息DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);END fetch_employee_data;/上面的存储过程名为 fetch_employee_data,它声明了一个名为 employee_cursor 的游标,用于从 employees 表中检索员工的 ID、姓名和薪水。

MySql存储过程和游标的使用实例

MySql存储过程和游标的使用实例

MySql存储过程和游标的使⽤实例⽬录前⾔1.创建存储过程。

2.查看存储过程名称3.调⽤存储过程4.删除存储过程总结前⾔这⾥存储过程和游标的定义和作⽤就不介绍了,⽹上挺多的,只通过简单的介绍,然后⽤个案例让⼤家快速了解。

实例中会具体说明变量的定义,赋值,游标的使⽤,控制语句,循环语句的介绍。

1.创建存储过程。

CREATE PROCEDURE myproc(OUT s int)BEGINSELECT COUNT(*) INTO s FROM students;END存储过程根据需要可能会有输⼊、输出、输⼊输出参数,如果有多个参数⽤","分割开。

MySQL存储过程的参数⽤在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:IN参数的值必须在调⽤存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT:该值可在存储过程内部被改变,并可返回INOUT:调⽤时指定,并且可被改变和返回2.查看存储过程名称SELECT routine_name FROM information_schema.routines WHERE routine_schema='数据库名称';3.调⽤存储过程CALL myproc()4.删除存储过程DROP PROCEDURE IF EXISTS myproc;因为mysql中游标只能在存储过程和⽅法中使⽤,所以就直接通过案例介绍游标。

案例:该案例采⽤⽆参存储过程,有参的也挺简单,根据上⾯的介绍,对应实现就⾏,该存储过程主要就创建⼀个存储过程,⽤它做查询修改等操作。

#检查该存储过程是否存在存在就删除了再创建DROP PROCEDURE IF EXISTS processnames ;#创建存储过程CREATE PROCEDURE processnames()#BEGIN END 存储过程中的sql逻辑写在BEGIN 和END 中BEGIN#定义变量DECLARE var_name VARCHAR(300);DECLARE var_uuid VARCHAR(300);DECLARE count int DEFAULT 0 ;DECLARE i int DEFAULT 0 ;DECLARE done INT;#定义游标DECLARE nameCursor CURSOR FOR SELECT ParentId FROM datadictionary GROUP BY ParentId;#该sql语句作⽤是在你遍历游标的时候游标循环结束就会执⾏这句话,并给done赋值为1 然后循环就会停⽌但该语句不适⽤WHILE 循环语句。

MySQL视图存储过程练习题

MySQL视图存储过程练习题

一、编程题
创建数据库为: test_db
数据库中有以下表:
班级表(clazz)
学生表(student)
课程表(course)
选课表(selection)
操作题
1、创建一个视图,视图实现的是查询每个学生的年龄,性别。

2、创建一个视图,视图实现的是查询每个学生的姓名,所在的班级以及班
主任的姓名。

3、创建测试用户test,密码root。

并分配mysql数据库中的所有权限。

4、创建一个存储过程,用于查询课程表中所有信息。

并调用该存储过程。

5、创建一个存储过程,用于查询课程表中学分绩点在某个范围内的课程名
称,课程简介。

6、统计课程表中的课程数量,如果小于6插入两条课程信息,否则删除id
大于6课程信息。

7、创建存储过程,使用游标循环获取班级表中第3结果的班级名称,任
课老师的信息该存储过程。

8、创建存储过程,使用游标循环获取班级表中所有结果的班级名称。

并调用该存储过程。

(使用repeat循环方式)
9、创建存储过程,使用游标循环获取学生表中所有结果的学生姓名和年龄。

并调用该存储过程。

(使用while循环方式)。

存储过程游标有用

存储过程游标有用

存储过程游标有⽤-- 语法/*create [or replace] procedure 存储过程名称(参数名1 in|out 数据类型,参数名2 in|out 数据类型,...) as|is-- 声明变量begin-- 过程化语句end;*/--- 根据员⼯编号得到员⼯的年薪create or replace procedure getYearSal(eno in number , yearsal out number)asbeginselect sal * 12 + nvl(comm,0) into yearsal from emp where empno = eno;end;-- 访问存储过程declareys number;begingetYearSal(7788, ys);dbms_output.put_line('年薪'||ys);end;--- 给某员⼯涨⼯资(打印涨前的⼯资和涨后的⼯资)create or replace procedure updateSal(eno in number ,psal in number)isoldsal number;newsal number;begin-- 打印涨前的⼯资select sal into oldsal from emp where empno = eno;dbms_output.put_line('涨前的⼯资:'||oldsal);-- 涨⼯资update emp set sal = sal + psal where empno = eno;commit;-- 打印涨后的⼯资select sal into newsal from emp where empno = eno;dbms_output.put_line('涨后的⼯资:'||newsal);end;-- 访问只有输⼊参数的存储过程call updateSal(7788,100);---- 举例:返回游标的存储过程-- 得到某部门所有的员⼯信息create or replace procedure getEmps(dno in number ,emps out sys_refcursor)asbegin-- 给动态的游标赋值open emps for select * from emp where deptno = dno;end;-- 访问带有输出参数为游标的存储过程declareemps sys_refcursor;prow emp%rowtype;begingetEmps(20, emps);loopfetch emps into prow;exit when emps%notfound;dbms_output.put_line(prow.empno||','||prow.ename);end loop;close emps;end;游标## 四、游标&例外```--- 游标(集合): ⽤来处理返回多⾏记录的问题-- select into 语句只能解决返回⼀⾏记录的问题declarepname emp.ename%type;beginselect ename into pname from emp where deptno = 40; dbms_output.put_line(pname);end;--- 声明游标-- cursor 游标名 is sql查询语句;-- 遍历游标的过程-- 打开游标-- 提取游标中的⼀⾏内容: fetch 游标名 into 变量名;-- 循环语句, exit when 游标名%notfound;-- 关闭游标-- 举例:使⽤游标打印20号部门的员⼯姓名和⼯作declarecursor cur is select ename ,job from emp where deptno = 20; pname emp.ename%type;pjob emp.job%type;begin-- 打开游标open cur;loopfetch cur into pname,pjob;-- 当游标中没有记录时退出exit when cur%notfound;dbms_output.put_line(pname || ','|| pjob);end loop;-- 关闭游标close cur;end;-- 举例-- 使⽤游标对20号部门的员⼯涨⼯资(100)-- 找出20号部门的员⼯编号,更新⼯资declarecursor cur is select empno from emp where deptno = 20; begin-- for 循环:⾃动打开,关闭游标for c in cur loopupdate emp set sal = sal + 100 where empno = c.empno; end loop;end;update emp set sal = sal +100 where deptno = 20;### ⼋、触发器```---- 触发器(监听器): 监听表中的数据是否发⽣了改变/*create or replace trigger 触发器名称before |after -- 改变之前执⾏触发器还是之后执⾏insert|update|deleteon 表 -- 修改的是哪⼀张表[触发器的级别:表级的触发器,⾏级触发器]declarebeginend;*/-- 举例:添加⼀条记录(打印添加了⼀条记录)create or replace trigger insertEmpafterinserton empdeclarebegindbms_output.put_line('添加了⼀条记录');end;insert into emp(empno ,ename) values(1002,'zhangfei');-- 不能给员⼯降薪create or replace trigger notUpdateLowerSalbeforeupdateon empfor each row -- ⾏级的触发器:只要使⽤new,old 就必须使⽤⾏级触发器declarebeginif :new.sal < :old.sal then-- raise_application_error(p1,p2)-- p1 : 错误的编号:- 20001 ~ -20999-- p2 :错误的信息raise_application_error(-20001 , '不能给员⼯降薪');end if;end;update emp set sal = sal - 1 where empno = 7788;-- 使⽤触发器来模拟mysql中⾃增的效果create sequence tseq;create or replace trigger autoIncrementbeforeinserton empfor each rowdeclarebeginselect tseq.nextval into :new.empno from dual;end;insert into emp(empno,ename) values(100,'lisi');select * from emp;```。

实验07 游标,存储过程,触发器

实验07 游标,存储过程,触发器

实验七游标,存储过程,触发器Sqlplus /nologconn scott/tigerdeclarecursor mycur isselect * from emp;myrecord emp%ROWTYPE;beginopen mycur;fetch mycur into myrecord;while mycur%FOUND loopdbms_output.put_line(myrecord.empno||’,’||myrecord.ename); fetch mycur into myrecord;end loop;close mycur;end;/save c:\plsql_cursor01.txt带参数的游标,%NOTFOUND属性declarecursor cur_para(id varchar2) isselect ename from emp where empno=id;t_name emp.ename%TYPE;beginopen cur_para(‘7369’);loopfetch cur_para into t_name;exit when cur_para%NOTFOUND;dbms_output.put_line(t_name);end loop;close cur_para;end;/用FOR循环实现declarecursor cur_para(id varchar2) isselect ename from emp where empno=id;begindbms_output.put_line(‘*******结果*************’);for cur in cur_para(‘7369’) loopdbms_output.put_line(cur.ename);end loop;end;/%ISOPEN属性declaret_name emp.ename%TYPE;cursor cur(id varchar2) isselect ename from emp where empno=id;beginif cur%ISOPEN thendbms_output.put_line(‘游标已打开’);elseopen cur(‘7369’);end if;fetch cur into t_name;close cur;dbms_output.put_line(t_name);end;/%ROWCOUNT属性declaret_name varchar2(10);cursor mycur isselect dname from dept;beginopen mycur;loopfetch mycur into t_name; --一开始可以不要这句试下,然后要这一句试下。

存储过程语法练习题

存储过程语法练习题

存储过程语法练习题存储过程语法练习题存储过程是数据库中一种非常重要的对象,它可以用来封装一系列的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岁的学生数量,并返回结果。

请修改存储过程,使其可以返回学生数量。

MySQL中的游标与存储过程调用

MySQL中的游标与存储过程调用

MySQL中的游标与存储过程调用MySQL是一种广泛使用的关系型数据库管理系统,它提供了丰富的功能和灵活的操作方式,使得开发者可以更好地处理和存储数据。

在MySQL中,游标和存储过程是两个重要的概念,它们可以帮助开发者更好地管理和操作数据。

本文将重点介绍MySQL中的游标和存储过程调用,并探讨它们的用途和优势。

一、游标的概念与用途游标是一个指向查询结果集中特定位置的数据指针,可以通过游标来逐行访问查询结果集。

在MySQL中,游标提供了对查询结果的灵活处理方式,尤其适用于需要逐行处理数据的情况,如数据分析、数据报表等。

通过游标,开发者可以逐条检索、更新和删除查询结果。

在使用游标之前,我们首先需要创建游标,并将其与查询结果绑定。

下面是一个简单示例:DECLARE cur CURSOR FOR SELECT * FROM students;在以上示例中,我们声明了一个名为cur的游标,并绑定了查询语句"SELECT * FROM students"。

创建游标后,我们可以通过FETCH语句逐行获取查询结果,并对数据进行处理。

例如:FETCH cur INTO @id, @name, @age;通过以上FETCH语句,我们将查询结果的每一行数据分别存储到变量@id、@name和@age中,然后可以对这些变量进行后续操作。

除了逐行获取查询结果,游标还可以用于循环处理数据。

例如,我们可以使用WHILE语句结合游标实现遍历查询结果的功能。

示例如下:WHILE (condition) DO...FETCH cur INTO ......END WHILE;通过以上WHILE语句与FETCH语句的组合,我们可以在循环中逐行处理查询结果,实现对数据的灵活操作。

二、存储过程调用的概念与用途存储过程是一组预定义的SQL语句集合,用于实现特定的功能。

与常规的SQL语句相比,存储过程具有以下优势:1. 重用性:存储过程可以在多个地方调用,减少了重复编写代码的工作量。

游标练习题

游标练习题

一、基础操作题1. 如何将游标移动到表的第一条记录?2. 如何将游标移动到表的一条记录?3. 如何将游标向前移动一条记录?4. 如何将游标向后移动一条记录?5. 如何将游标移动到指定记录的位置?6. 如何判断游标是否指向表的第一条记录?7. 如何判断游标是否指向表的一条记录?8. 如何判断游标是否指向当前记录?9. 如何将游标移动到当前记录的前一条记录?10. 如何将游标移动到当前记录的后一条记录?二、条件操作题三、循环操作题19. 遍历表中的所有记录,打印每条记录的ID字段。

20. 遍历表中的所有记录,如果年龄大于30,则打印该记录的姓名和年龄。

21. 遍历表中的所有记录,如果性别为“女”,则打印该记录的姓名和性别。

22. 遍历表中的所有记录,更新年龄大于40的记录的年龄值。

23. 遍历表中的所有记录,删除年龄小于20的记录。

24. 遍历表中的所有记录,如果姓名包含“张”,则打印该记录的所有字段。

25. 遍历表中的所有记录,如果性别为“男”,则将年龄加1。

四、高级操作题26. 实现一个函数,根据输入的ID值,将游标移动到对应的记录。

27. 实现一个函数,根据输入的条件,查找并返回符合条件的记录。

28. 实现一个函数,根据输入的ID值,删除对应的记录。

29. 实现一个函数,根据输入的姓名,更新对应的记录的年龄字段。

30. 实现一个函数,根据输入的条件,批量更新符合条件的记录的字段值。

五、游标与SQL语句结合题31. 使用游标遍历表,并将每条记录的ID和姓名插入到另一个表中。

32. 使用游标查找年龄大于30的记录,并将这些记录的ID和姓名更新到另一个表中。

33. 使用游标遍历表,如果记录的性别为“男”,则将性别更新为“先生”。

34. 使用游标遍历表,将所有年龄小于20的记录的年龄值增加5。

35. 使用游标遍历表,删除所有姓名为空或长度小于2的记录。

六、游标与事务题36. 使用游标和事务,实现将一个表中的记录批量移动到另一个表中。

存储过程练习题

存储过程练习题

存储过程练习题存储过程练习题存储过程是数据库中一种重要的对象,它可以将一系列的SQL语句封装起来,形成一个可重复使用的代码块。

通过使用存储过程,我们可以提高数据库的性能和安全性,同时也能减少代码的冗余。

为了更好地理解和运用存储过程,下面将给出一些练习题,帮助读者加深对存储过程的理解和应用。

1. 创建一个名为"GetEmployeeName"的存储过程,输入参数为员工的ID,输出参数为员工的姓名。

请写出相应的存储过程代码。

2. 创建一个名为"UpdateEmployeeSalary"的存储过程,输入参数为员工的ID和新的薪水,将指定员工的薪水更新为新的薪水。

请写出相应的存储过程代码。

3. 创建一个名为"GetDepartmentEmployees"的存储过程,输入参数为部门的ID,返回该部门中所有员工的信息。

请写出相应的存储过程代码。

4. 创建一个名为"DeleteInactiveEmployees"的存储过程,删除所有未激活的员工(即状态为"Inactive"的员工)。

请写出相应的存储过程代码。

5. 创建一个名为"GetEmployeeCountByDepartment"的存储过程,输入参数为部门的ID,返回该部门中员工的数量。

请写出相应的存储过程代码。

6. 创建一个名为"GetEmployeeBonus"的存储过程,输入参数为员工的ID,输出参数为员工的奖金。

奖金的计算规则为:如果员工的薪水大于5000,则奖金为薪水的10%;否则奖金为薪水的5%。

请写出相应的存储过程代码。

7. 创建一个名为"GetTopPaidEmployees"的存储过程,输入参数为返回的员工数量N,返回薪水排名前N的员工信息。

请写出相应的存储过程代码。

8. 创建一个名为"GetEmployeeAverageSalary"的存储过程,返回所有员工的平均薪水。

数据库系统原理实验: 存储过程与游标

数据库系统原理实验: 存储过程与游标

实验七 T-SQL程序设计与游标设计一、实验目的1.掌握Transact-SQL语言极其程序设计的方法;2.掌握T-SQL游标的使用方法。

二、实验内容与要求1.T-SQL程序设计逻辑Transact-SQL是SQL Server对标准SQL语言的扩充。

Transact-SQL是SQL Server对标准sQI.语言的扩充。

它引入了程序设计的思想,增加了程序的流程控制语句。

Transact-SQL语言最主要的用途是设计服务器端的能够在后台执行的程序块,如存储过程、触发器等。

(1)变量Transact-SQL中可以使用两种变量:局部变量和全局变量。

局部变量。

局部变量是用户可自行定义的变量,它的作用范围是在程序内部,一般用来存储从表中查询到的数据,或作为程序执行过程中的暂存变量。

局部变量必须以@开头,且必须先用DECLARE命令加以说明后才可使用。

全局变量。

全局变量是SQL Server系统内部使用的变量,其作用范围并不局限于某一程序,而是所有程序都可随时调用。

全局变量通常存储一些SQL Server的配置设定值和效能统计数据。

引用全局变量必须以@@开头。

(2)流程控制命令BEGIN…ENDIF…ELSE…CASEWHILE…CONTINUE…BREAKWAITFORGOTORETURN(3)其他命令BACKUP.CHECKPOINT.DBCC.DECLARE.EXECUTE.KILL.PRINT.RAISERROR.READTEXT.RESTORE.SELECT.SET.SHUTDOWi\l.WRITETEXT.USE.(4)常用函数统计函数算术函数字符串函数数据类型转换函数日期函数TEXT函数和IMAGE函数用户自定义函数1.1计算1—100之间所有能被3整除的数的个数和总和(1)启动SSMS。

(2)创建T-SQL程序:在查询编辑器窗口中输入下列程序:DECLARE @SUM SMALLINT, @I SMALLINT, @NUMS SMALLINTSET @SUM=0SET @I=1SET @NUMS=0WHILE (@I<=100)BEGINIF (@I%3=0 )BEGINSET @SUM=@SUM+@ISET @NUMS=@NUMS+1ENDSET @I=@I+1ENDPRINT '总和是:' + STR( @SUM )PRINT '个数是:' + STR( @NUMS )(3)执行T-SQL,执行结果如图1-1所示。

SQL-server上机练习题-何

SQL-server上机练习题-何

含触发器、存储过程、游标一、触发器练习1==========示例说明inserted,deleted表的作用。

程序清单如下:create table sc(sno char(10),cno char(2),score real)GoCREATE TRIGGER tr1ON scFOR INSERT, UPDATE, DELETEASPRINT ‘inserted表:’Select * from insertedPRINT ‘deleted表:’Select * from deletedGo2========创建一个触发器,在s 表上创建一个插入、更新类型的触发器。

程序清单如下:CREATE TRIGGER tr_sON sFOR INSERT, UPDATEASBeginDECLARE @bh varchar(6)SELECT @bh =inserted.sno FROM inserted /*获取插入或更新操作时的新值(学号)*/ End3===============使用INSERT触发器INSERT触发器通常被用来更新时间标记字段,或者验证被触发器监控的字段中数据满足要求的标准,以确保数据的完整性。

例9-3建立一个触发器,当向sc表中添加数据时,如果添加的数据与s表中的数据不匹配(没有对应的学号),则将此数据删除。

程序清单如下:CREATE TRIGGER sc_ins ON scFOR INSERTASBEGINDECLARE @bh char(5)Select @bh=Inserted.sno from InsertedIf not exists(select sno from s where s.sno=@bh)Delete sc where sno=@bhEND二、存储过程练习1=========创建一个带有SELECT语句的简单过程,该存储过程返回所有员工姓名,Email地址,电话等。

数据库实验八存储过程和游标

数据库实验八存储过程和游标

数据库实验八存储过程和游标一、实验目的1.了解存储过程和游标的基本概念和用法;2.掌握存储过程的创建与调用;3.掌握游标的创建、打开、关闭和使用。

二、实验内容本实验涉及两个部分,第一部分是存储过程的创建与调用,第二部分是游标的创建、打开、关闭和使用。

三、实验步骤1.存储过程的创建与调用首先,创建一个学生表(student),包含字段(id, name, age),并插入一些测试数据。

```sqlCREATE TABLE studentid INT PRIMARY KEY,name VARCHAR(20) NOT NULL,age INT NOT NULLINSERT INTO student (id, name, age) VALUES (1, 'Tom', 18);INSERT INTO student (id, name, age) VALUES (2, 'Jerry', 20);INSERT INTO student (id, name, age) VALUES (3, 'Alice', 19);INSERT INTO student (id, name, age) VALUES (4, 'Bob', 22);```然后,创建一个存储过程(get_student_list),用于查询年龄小于等于指定值的学生列表,并按照年龄降序排序。

```sqlDELIMITER//CREATE PROCEDURE get_student_list(IN max_age INT)BEGINSELECT id, name, age FROM student WHERE age <= max_age ORDER BY age DESC;END//DELIMITER;```存储过程创建完成后,可以使用CALL语句调用存储过程,并传入参数。

```sqlCALL get_student_list(20);```2.游标的创建、打开、关闭和使用首先,创建一个存储过程(get_student_name),用于查询年龄小于等于指定值的学生姓名,并输出到结果集。

navicat中创建存储过程、触发器和使用游标的简单实例(图文)

navicat中创建存储过程、触发器和使用游标的简单实例(图文)

navicat中创建存储过程、触发器和使⽤游标的简单实例(图⽂)1、建表⾸先先建两张表(users表和number表),具体设计如下图:2、存储过程写⼀个存储过程,往users表中插⼊数据,创建过程如下:代码如下BEGIN#Routine body goes here...declare n bigint;set n = 201121029684;while n <= 201121029694doinsert into users(student_ID) values(n);set n = n + 1;end while;END执⾏存储过程后可以看到users表中的数据如下:整个存储过程的编写就完成了,当然这只是⼀个极为简单的例⼦,仅供⼊门参考。

3、触发器在写触发器之前,我们先把users的数据清空truncate table users;现在我们有两个表,我要做的事情就是,当我往users中插⼊数据后,number中也相应变化:例如,number表中有⼀条初始数据,id=1,num=0;当我往users中插⼊⼀条数据后,就触发number表中的num字段就加1,也就是记录⽤户数。

下⾯我们来实现这个⼩⼩的功能。

右击users表,选择设计表选择触发器选项beginupdate numberset num = (select count(*) from users) ;end保存后,再往users表中添加新数据,再查看⼀下number中的数据,你会神奇的发现,number表中的数据也变了,⾃⼰动⼿试⼀下吧!ps:存储过程需要程序员⾃⼰去执⾏,触发器,顾名思义,⾃动触发。

4、游标使⽤我现在想做的是将student_ID字段都加上100,通过这个例⼦简单展⽰⼀下游标的使⽤。

创建⼀个存储过程,创建⽅式参考上⾯步骤。

存储过程代码如下:BEGIN#Routine body goes here...declare tmp bigint default 0;declare cur CURSOR FOR SELECT student_ID FROM users; -- 定义游标/*02000 发⽣下述异常之⼀:SELECT INTO 语句或 INSERT 语句的⼦查询的结果为空表。

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

创建三个表:学生(学号,姓名)、课程(课程号,课程名)、成绩(学号、课程号、分数),然后在三个表中分别添加记录。

按照输入的课程名称打印此门课程的成绩报表(如不给定课程名称则打印SQL课程的成绩),输出结果按照分数降序排列:
例如:
《SQL》成绩表
****************************************************
名次学号姓名成绩
1 0508044126 李军95
2 0508044124 李明85
3 0508044125 王刚75
****************************************************
*/
use pubs
IF EXISTS (SELECT NAME FROM sysobjects
WHERE NAME = '学生')
DROP table 学生
GO
IF EXISTS (SELECT NAME FROM sysobjects
WHERE NAME = '课程')
DROP table 课程
GO
IF EXISTS (SELECT NAME FROM sysobjects
WHERE NAME = '成绩')
DROP table 成绩
GO
create table 学生(学号char(10) primary key
constraint xh_chk check (学号like '0508044[1-4][0-3][0-9]'),姓名nvarchar(10) not null) create table 课程(课程号char(6) primary key,课程名称nvarchar(40))
create table 成绩(学号char(10) not null,课程号char(6) not null,分数numeric(4,1))
insert 学生values('0508044124','李明')
insert 学生values('0508044125','王刚')
insert 学生values('0508044126','李军')
insert 课程values('080101','SQL')
insert 课程values('080204','D S')
insert 成绩values('0508044124','080101',85)
insert 成绩values('0508044124','080204',95)
insert 成绩values('0508044125','080101',75)
insert 成绩values('0508044125','080204',86)
insert 成绩values('0508044126','080101',95)
go
if exists(select * from sysobjects where name='cj_proc' and xtype='p')
drop proc cj_proc
GO
create proc cj_proc @KCM nvarchar(40)=’SQL’
as
SET NOCOUNT ON
DECLARE @XH char(10),@XM nvarchar(10),@kch nvarchar(6),
@CJ numeric(4,1),@message nvarchar(80),@mc int
if not exists(select 课程.课程号from 课程inner join 成绩on 课程.课程号=成绩.课程号and 课程.课程名称=@kcm)
print '无此课程成绩'
else
begin
select @kch=课程.课程号from 课程where 课程.课程名称=@kcm
print ' 《'+@kcm+'》成绩表'
print REPLICATE('*',48)
print '名次学号姓名成绩'
declare xhcj_cursor cursor scroll
for select 学生.学号,姓名,分数from 学生,成绩
where 成绩.学号=学生.学号and 课程号=@kch
order by 分数desc
open xhcj_cursor
fetch next from xhcj_cursor into @xh,@xm,@cj
set @mc=1
while @@fetch_status=0
begin
set
@message=ltrim(str(@mc))+space(10)+@xh+space(7)+@xm+space(12)+ltrim(str(@CJ)) PRINT @message
fetch next from xhcj_cursor into @xh,@xm,@CJ
set @mc=@mc+1
end
print REPLICATE('*',48)
CLOSE xhcj_cursor
DEALLOCATE xhcj_cursor
end
go。

相关文档
最新文档