存储过程11114
带输入参数的存储过程
注意:
带参数要指明是输入参数还是输出参数(返回值)
一般不在存储过程或者函数提交或者回滚事务,而是交给调用者去操作事务
例子(建立存储过程,然后用pl/sql程序调用):
---给学号加100
create or replace procedure STU(v_name in varchar) as
p_stu_id pm_stu.stu_id%type;
begin
select stu_id into p_stu_id from pm_stu where stu_name= v_name;
update pm_stu set stu_id = stu_id + 100 where stu_name = v_name;
dbms_output.put_line('涨前:' || p_stu_id || '涨后: ' || (p_stu_id + 100));
end;
select t.*,rowid from zhaozy.pm_stu t;
BEGIN
STU('李四');
rollback;
STU('张三');
commit;
END;
--创建一个带参数的存储过程:
--给指定的员工涨100块钱的工资,并且打印涨前和涨后的薪水
--eno是传入的员工号
/*
如何调用:
begin
raisesalary(7839);
raisesalary(7566);
commit;
end;
*/
create or replace procedure raisesalary(eno in number)
as
--定义一个变量保存涨前的薪水
psal emp.sal%type;
begin
--得到员工涨前的薪水
select sal into psal from emp where empno=eno;
--给该员工涨100
update emp set all=sal+100 where empno=eno;
--需不需要commit?
--注意:一般不在存储过程或者存储函数中,commit和rollback。
--打印
dbms_output.put_line('涨前:'||psall||'涨后:'||(psal+100));
end;
算是看明白的了,不就是写个自动程序吗,存储过程
带参数的存储过程
创建和使用带参数的存储过程
举例:为指定员工,涨100块钱的工资;并且打印涨前和涨后的薪水。
注意:存储过程和存储函数的参数需要标明该参数是输入参数还是输出参数。这里需要的是输入参数,也就是需要输入员工号。
注意:这里已经对数据库记录做出了更改,一般不在存储过程中提交事物,因为这样不能保证在调用存储过程的代码在一个事物中。也就是哪里调用存储过程,哪里提交事物。
证明:oracle中执行完插入,需要commit,否则查看不到。这是oracle数据库的隔离级别导致的。
带参数存储过程创建:
带参数存储过程调用:像如图中这种情况,就可以保证这两个操作在同一事物中。
注意:存储过程的参数声明时,只能声明类型,不可以指定长度。
--带参数的存储过程
--举例:为指定的员工涨100元的工资,打印涨前和涨后的工资
--如果带参,需要指定是输入参数还是输出参数
create or replace procedure raisesalary(eno in number)
as
---定义一个变量保存涨前的薪水(引用emp表sal的数据类型)
psal emp.sal%type;
begin
---得到员工涨前的薪水
select sal into psal from emp where empno=eno;
---给该员工涨100
update emp set sal=sal+100 where empno=eno;
---需不需要commit?
---注意:一般不在存储过程或者存储函数中 commit和rollback
---打印涨前和涨后的工资
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+100));
end;
/
--一般在调用存储过程或者函数的时候再commit,这样可以保证所有执行是在同一个事务中进行的
--如:
begin
raisesalary(7839);
raisesalary(7566);
commit;
end;
/
一般不在存储过程或者存储函数中,commit和rollback
带参数的存储过程
输入参数 in 输出参数out
在存储过程中可以卸commit和rollcax,但是存储过程作为子程序,一般不在其中写,调用时统一提交或回滚
带参数的存储过程
举例:为指定的员工涨100元的工资,打印涨前和涨后的工资
如果带参,需要指定是输入参数还是输出参数
create or replace procedure raisesalary(eno number)
as
---定义一个变量保存涨前的薪水
psal emp.sal%type;
begin
---得到员工涨前的薪水
select sal into psal from emp where empno=eno;
---给该员工涨100
update emp set sal=sal+100 where empno=eno;
---需不需要commit?
---注意:一般不在存储过程或者存储函数中 commit和rollback
---打印涨前和涨后的工资
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+100));
end;
/
一般在调用存储过程或者函数的时候再commit,这样可以保证所有执行是在同一个事物中进行的
如:
begin
raisesalary(7839);
raisesalary(7566);
commit;
end;
/
一般不在存储过程中commit或者rollback,而是在调用存储过程之后再提交或回滚,这样能把存储过程封装到一个事务中。
创建一个带参数的存储过程:
--带参存储过程
create or replace procedure raisesalary(eno in number) --in 代表输入
as
--定义一个变量保存涨前的薪水
psal emp.sal%type --变量 psal 参数类型emp表的sal字段的类型
begin
select sal into psal from emp where empno = eno; --查询emp的sal字段 into(赋值)给psal
update emp set sal = sal+100 where empno=eno;
--打印
dbms_output.pun_line(psal);
end;
不在存储过程提交,回归。保证事务一致性
带参数的存储过程
如果存储过程有参数,
需要指定是输入参数还是输出参数 in out
Desc dbms_output --查看dbms_output程序包的参数是输入参数还是输出参数
引用型变量 psal emp.sal%type --采用员工表中的sal变量的类型作为psal的类型
Begin和end中间就是程序段
1、创建带参数的存储过程(如果是存储函数需要指出参数是输入还是输出)
create or replace procedure raisesalary(empNo IN number)
as
--说明部分
psal emp.salary%type;
begin
select salary into psal from emp where no = empNo;
updatte emp set salary = salary + 100 where no = empNo;
dbms_output.put_line("涨前:"+‘||psal||’+“涨后”+‘||(psal+100)’)
end;
/
带参数的存储过程
1、创建带参数的存储过程(如果是存储函数需要指出参数是输入还是输出)
create or replace procedure raisesalary(empNo IN number)
as
--说明部分
psal emp.salary%type;
begin
select salary into psal from emp where no = empNo;
updatte emp set salary = salary + 100 where no = empNo;
dbms_output.put_line("涨前:"+‘||psal||’+“涨后”+‘||(psal+100)’)
end;
/
2、执行
begin
raisesalary();
raisesalary();
comment();
end;
/
3、plsql查询帮助
desc dbms_output
4、存储过程是子程序,一般不需要提交和回滚,但是可以允许
一般不在过程中对表内更改做commit
基本存储过程
--创建一个带参数的存储过程: --给指定的员工涨100块钱的工资,并且打印涨前和涨后的薪水 /* 如何调用 begin raisesalary(7839); raisesalary(7566); commit; end; / */ create or replace procedure raisesalary(eno in number) as --定义一个变量保存涨前的薪水 psal emp.sal%type; begin --得到员工涨前的薪水 select sal into psal from emp where empno=eno; --给员工涨100元 update emp set sal=sal+100 where empno=eno; --打印 dbms_output.put_line('涨前:'||psal||' 涨后:'||(psal+100)); end; /