Oracle存储过程学习
存储过程创建语法:
create or replace procedure 存储过程名(param1 in type,param2 out type)
as
cursor cur1 isselect area_code,cmcode ,sum(rmb_amt) /10000 reb_amt_sn,
sum(used_amt)/1000 usd_amt_sn
from bgd_area_cm_m-base_t
where ym>= vs_ym_sn_bg
and ym<=vs_ym_sn_end
group by area_code,cmcode;
begin
for rec in cur1 Loop
updae user_t
set rem_amt_code= rec.rem_ant_sn,used_amt_sn=rec.usd_amt_sn
where area_code = rec.area_code
and cmcode = rec.cmcode
and yum=is_ym;
end Loop
---------------------------------
--显示cursor的处理
declare
--声明cursor,创建和命名一个sql工作区
cursor cursor_name is
select real_name from accont_hcz;
v_realname varchar2(20);
begin
--打开cursor,执行sql语句产生的结果集
open cursor_name;
--提取cursor,提取结果集中的记录
dbms_output.put_line(v_realname)
--关闭cursor
close cursor_name;
----------------
存储过程的创建语法:
create or replace procedure 存储过程名(param1 in tyype.param2 out type)
as
变量1 类型 (值范围);
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where 列名=param1
if(判断条件){
Select 列名 into 变量2 from 表A where 列名=param1
Dbms_output.putline('打印信息');
elsif()then
bems_output.put_line ('打字信息')
Rase 异常名(no_data_found);
End if;
Exception
when others then
rollback;
End
}
注意事项
1,存储过程参数不能带取值范围,in表示传入,out表示输出
2,变量取值范围后面接分号
3,在判断语句前最好先用count(*)函数判断是否存在盖头按操作记录
4,用select 。。。into。。。给变量赋值
5,在代码中抛出异常用rase+异常名
-------------------------------------
Oracle存储过程的基本语法
1基本结构
Crate or Replace prceduref存储过程名字
(
参数1 IN NUMBER
参数2 IN NUMBER
)IS
变量1 INETER:=0;
变量2 DATE;
BEGIN
END存储过程名字
---------------------------------------------
2.select into statement
将查询出的结果存入变量中,可以同时将多个列存储多个变量中,必须有一条记录,
否则跑出异常(如果没有记录跑出NO_DaTA_FOUND)
例子:
BENGIN
Select col1,col2 into 变量1,变量2 FROM TYPESTruct where xxx;
exception
WHEN NO_DATA_FOUND THEN
XXXX
END;
3.IF判断
IF V_TEST = 1 LOOP
BENGIN
XXXX
END
END;
END LOOP;
5.变量赋值
V_Test :=123;
6.for in 使用cursor
...
IS
CURSOR cur IS SELCECT * FROM XXX
BEGIN
V_SUM:=cur_result.列名1+cur_result.列名2
end;
end LOOP
END;
----------------------------------------
带参数的cursor
cursor user(C_ID NUMBER)IS SELECT NAEM FROM USER WEHRE TYPEID = C_ID;
OPEN C_USER(变量值);
exit fetch C_user%notfound;
do something
end loop;
close c_user;
------------------------------------------------------
关于Oracle存储过程的问题备忘
1,在存储过程中,select摸一个字段时,后面必须紧跟关键字into,
如果select整个记录,利用游标就另当别论了。
例子:
select af.keynode into kn from app ap where ap.appid = aid and af.foudationid= fid--有into,正确编译。
select af.keynode from app ap where ap.appid = aid and af.foudationid= fid--没有into,不能正确编译。
后续: