存储过程练习
我给你出个题:
输入学号,查询他选修课程的最高分,最低分和平均分并输出
Ⅱ 创建存储过程,使用OUT类型参数获得雇员经理名,怎么做,
--一共两个想法,你看看哪个你喜欢
--第一个想法是传一个编号,返回一个值
--过程
create or replace procere wangsc_pro(
p_number in number,
p_name out varchar2
)
as
cursor cur_emp is
select m.ename from emp w join emp m on w.mgr=m.empno and w.empno=p_number;
begin
open cur_emp;
loop
fetch cur_emp into p_name;
exit when cur_emp%notfound;
end loop;
close cur_emp;
end;
--调用
declare
v_empno emp.empno%type:=7369;
v_ename emp.ename%type;
begin
wangsc_pro(v_empno,v_ename);
dbms_output.put_line('雇员:'||v_empno||'--经理:'||v_ename);
end;
--第二个想法是不传参数,返回记录集
--定义一个包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--过程
create or replace procere wangsc_pro(
p_cursor out testpackage.test_cursor
)
as
v_sql varchar2(1000);
begin
v_sql := 'select w.ename,m.ename from emp w join emp m on w.mgr=m.empno';
open p_cursor for v_sql;
end;
--调用
declare
v_wename emp.ename%type;
v_mename emp.ename%type;
pp_cursor testpackage.test_cursor;
begin
wangsc_pro(pp_cursor);
loop
fetch pp_cursor into v_wename,v_mename;
exit when pp_cursor%notfound;
dbms_output.put_line('雇员:'||v_wename||'-经理:'||v_mename);
end loop;
close pp_cursor;
end;
Ⅲ 什么是存储过程,要学习存储过程要看些什么书
存储过程(Stored Procere)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
通俗的讲存储过程就是一组SQL语句的集合,来实现特定功能,类似于系统函数一样。
你要学习存储过程必须掌握基本的SQL语法,学习存储过程需要多练习,至于书籍的话任何一本数据库书应该都有吧。
希望可以帮助到你。
Ⅳ 数据库题习题创建带输入参数的存储过程P_ cust_credit_level,根据输入参数更新
mysql存储
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `p_EventTest`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_EventTest`(
in v_code varchar(255)
)
BEGIN
/*定义异常标示符*/
declare t_status int default 0 ;
declare continue handler for sqlstate '23000' set t_status = 1;
declare continue handler for sqlexception set t_status = 2;
/*开启事物*/
start transaction ;
update 表名 set 字段名=v_code where 条件 ;
if t_status <> 0 then
rollback ;
else
commit ;
end if ;
END$$
DELIMITER ;
Ⅳ 写SQL的存储过程语句有什么好的学习方法吗 说仔细一点
说实话你这个问题很大,并且很多人都想走捷径,还是那句话,书山有路勤为径。
沧海一粟 的说法我认为是很对的,我在总结一下不知道对你有没有帮助。
1、当你了解T-SQL后,你得了解你所使用的关系数据库,不同的关系数据库会有一些区别。
2、多试着练习,从简单到难。当然你可以多看例子,如果是初学者建议使用SQL server的,因为在它的查询分析器的语法提示要准确得多,并且会提示出错在那行,这样修起来要简单得多。
3、关于创建存储过程的 例子在sql server中也很多,象sp_who,sp_who2等都是系统存储过程可以打开来看看学一下语法,和技巧。
4、关于技巧那你就得慢来累计了,比如:在过程中能不用游标就不要用,游标容易造成死锁并且执行速度不是很快,多使用临时表,可以用临时表的自增列来做为循环的序号替换游标。对于大数据的临时表也要创建索引,创建索引可以提示检索速度。
5、如果要说规范当然按书上说的规范来写是不会错的,比如你写了begin 那你得 换行写上end 然后在begin与end中写你的语句。这样你就不容易忘掉了,呵呵。
Ⅵ 数据库存储过程的习题
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[book_total]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[book_total]
GO
CREATE procere book_total (@allvalue int output)
as
begin
select @allvalue = Sum(价格) from book
end
GO
Ⅶ 怎样学习存储过程比较好
首先要学习一下相关的数据语言了解各种语言的结构,参照样例尝试学习各类操作以实践为主这样学习比较实用一些
Ⅷ 谁有ORACLE关于存储过程和触发器的上机练习题极代码呀能帮忙发一份么,有几个例题也行,本人乃初
oracle 存储过程 ,触发器练习
/*
以下代码是对emp表进行显示宽度设置
*/
col empno for 9999;
col ename for a10;
col job for a10;
col mgr for 9999;
col hiredate for a12;
col sal for 9999;
col comm for 9999;
col deptno for 99;
col tname for a12;
set pagesize 50;
//------------------------------------------------------------------------------------------------------
使用loop循环显示1-10【loop循环】
declare
--声明变量
i number(2);
begin
i := 1;
--以下代码是循环
loop
exit when i>10;
dbms_output.put_line(i);
i := i+1;
end loop;
end;
/
使用while循环显示10-20【while循环】
declare
i number(2) := 10;
begin
while i<=20
loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;
/
使用for循环显示20-30【for循环】
declare
i number;
begin
for i in 20..30
loop
dbms_output.put_line(i);
end loop;
end;
/
使用无参光标cursor,查询所有员工的姓名和工资【如果需要保存多行记录时,使用光标cursor】
declare
--定义一个cursor,里面装多条记录
cursor cemp is select ename,sal from emp;
--声明二个普通变量
pename emp.ename%type;
psal emp.sal%type;
begin
--打开cursor
open cemp;
--循环
loop
--将cursor下移,将用户名和工资存入二个自定义普通变量中
fetch cemp into pename,psal;
--判断是否该退出循环,切记
exit when cemp%notfound;
--显示
dbms_output.put_line(pename||'的工资是'||psal);
end loop;
--关闭cursor
close cemp;
end;
/
使用无参光标,给员工涨工资,ANALYST涨1000,MANAGER涨800,其它涨400【编号,姓名,职位,薪水】
declare
cursor cemp is select empno,ename,job,sal from emp;
pempno emp.empno%type;
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
open cemp;
loop
fetch cemp into pempno,pename,pjob,psal;
exit when cemp%notfound;
--if是PLSQL
if pjob='ANALYST' then
--update是SQL
update emp set sal=sal+1000 where empno=pempno;
elsif pjob='MANAGER' then
update emp set sal=sal+800 where empno=pempno;
else
update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
commit;
close cemp;
end;
/
使用带参光标,查询20号部门的员工姓名和工资,工资都加800
declare
--定义一个带参cursor
cursor cemp(pdeptno number) is select empno,ename,sal from emp where deptno=pdeptno;
pename emp.ename%type;
psal emp.sal%type;
pempno emp.empno%type;
begin
--打开光标,同时传入实际参数
open cemp(20);
loop
fetch cemp into pempno,pename,psal;
exit when cemp%notfound;
update emp set sal=sal+800 where empno=pempno;
end loop;
--关闭光标
close cemp;
end;
/
oracle系统内置例外,被0除异常【zero_divide】
declare
i number;
s number;
begin
i := 10;
s := i/0;
exception
when zero_divide then
dbms_output.put_line('自已捕获系统内置例外');
end;
/
用户自定义例外,没有找到员工例外【no_emp_found】
declare
cursor cemp(pempno number) is select ename from emp where empno=pempno;
pename emp.ename%type;
--声明自定义例外
no_emp_found exception;
begin
open cemp(1111);
loop
fetch cemp into pename;
--如果没有找到员工
if cemp%notfound then
--抛例外
raise no_emp_found;
end if;
end loop;
close cemp;
exception
when no_emp_found then
dbms_output.put_line('查无此员工');
end;
/
//------------------------------------------------------------------------------------------------------
创建无参存储过程hello,无返回值
create or replace procere hello
as
begin
dbms_output.put_line('这就是存储过程');
end;
/
删除存储过程hello
drop procere hello;
调用存储过程方式一【exec 存储过程名】
exec hello;
调用存储过程方式二【PLSQL程序】
begin
--调用存储过程
hello;
end;
/
调用存储过程方式三【JDBC】
CallableStatement
创建有参存储过程raiseSalary(编号),为7369号员工涨10%的工资,并显示出涨前和涨后的工资【演示in的用法,默认in】
create or replace procere raiseSalary(pempno number)
as
--as看作declare,但不能出现declare,声明变量
psal emp.sal%type;
begin
--查询编码为7369号员工的工资
select sal into psal from emp where empno=pempno;
--显示
dbms_output.put_line('7369号员工涨前工资'||psal);
dbms_output.put_line('7369号员工涨后工资'||psal*1.1);
end;
/
exec raiseSalary(7369);
创建无参存储函数myshow,有返回值
create or replace function myshow return varchar2
as
begin
return '哈哈';
end;
/
删除存储函数myshow
drop function myshow;
调用存储函数方式一【PLSQL程序】
declare
value varchar2(6);
begin
value := myshow();
--value := myshow;可以
dbms_output.put_line(value);
end;
/
调用存储函数方式二【JDBC】
CallableStatement
创建有参存储函数findEmpIncome(编号),查询7369号员工的年收入【演示in的用法,默认in】
create or replace function findEmpIncome(pempno in number) return number
as
--年收入
income number;
begin
select sal*12+NVL2(comm,comm,0) into income from emp where empno=pempno;
--返回年收入
return income;
end;
/
declare
income number;
begin
income := findEmpIncome(7369);
dbms_output.put_line('年收入是'||income);
end;
/
创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,【返回多个值,演示out的用法】
当返回2个或多个值,必须使用out符号
当返回1个值,就无需out符号
create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return number
as
psal emp.sal%type;
begin
select ename,sal into pename,psal from emp where empno=pempno;
--返回月薪
return psal;
end;
/
---------------------------------------相互转值
declare
psal emp.sal%type;
pename emp.ename%type;
begin
psal := findEmpNameAndSal(7902,pename);
dbms_output.put_line('7902号员工的姓名'||pename||',薪水是'||psal);
end;
/
创建有参存储过程findEmpNameAndSalAndJob(编号),查询7902号员工的的姓名,职位,月薪【演示out的用法】
create or replace procere
findEmpNameAndSalAndJob(pempno in number,pename out varchar2,pjob out varchar2,psal out number)
as
begin
select ename,job,sal into pename,pjob,psal from emp where empno=pempno;
end;
/
declare
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
findEmpNameAndSalAndJob(7902,pename,pjob,psal);
dbms_output.put_line('7902号员工的姓名是'||pename||':'||pjob||':'||psal);
end;
/
什么情况下使用存储过程?什么情况下使用存储函数?
项目中的原则:
A)如果只有一个返回值:用函数
B)如果无返回值,或超过1个以上的返回值,用过程
创建语句级触发器insertEmpTrigger,当对emp表进行insert操作前,显示"hello world"
create or replace trigger insertEmpTrigger
before
insert
on emp
begin
dbms_output.put_line('插入记录之前执行');
end;
/
删除触发器insertEmpTrigger
drop trigger insertEmpTrigger;
使用insert语句操纵表,引起触发器工作
insert into emp(empno,ename,job,sal) values(1122,'JACK','IT',5000);
insert into emp
select *
from new_emp;
创建语句级触发器deleteEmpTrigger,当对emp表进行delete操作后,显示"world hello"
create or replace trigger deleteEmpTrigger
after
delete
on emp
begin
dbms_output.put_line('删除记录之后执行');
end;
/
周一到周五,且9-17点能向数据库插入数据,否则【raise_application_error('-20000','例外原因')】
分析:
A)周六,周日 不管何时 不能插入数据
B)周一到周五 9-17之外,不包括9和17点,不能插入数据
create or replace trigger securityEmpTrigger
before
insert
on emp
declare
pday varchar2(9);
phour number(2);
begin
select to_char(sysdate,'day') into pday from al;
--隐式将varchar2转成number
select to_char(sysdate,'hh24') into phour from al;
--判断
if (pday in ('星期六','星期日')) or (phour not between 9 and 17) then
--抛例外,该例是系统的
raise_application_error('-20999','不是工作时间,不能操作数据库');
end if;
end;
/
创建行级触发器,涨后工资这一列,确保大于涨前工资【for each row/:new.sal/:old.sal】
create or replace trigger checkSalaryTrigger
after
update of sal
on emp
for each row
begin
--如果更新后的值<更新前的值
if :new.sal < :old.sal then
--抛例外
raise_application_error('-20888','工资不能越涨越低');
end if;
end;
/
Ⅸ sql server存储过程要怎么练啊,我是做.NET的,不知道要怎么练才会比较快上手,感觉每次写存储过程都笨笨的
只有一法:
多练习,多写代码,有不会的发出来。
别无捷径可走。