重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
-- 第一个题目,我的表叫stu,你别忘了改成你的表名
创新互联建站拥有10多年成都网站建设工作经验,为各大企业提供成都做网站、网站设计服务,对于网页设计、PC网站建设(电脑版网站建设)、成都App定制开发、wap网站建设(手机版网站建设)、程序开发、网站优化(SEO优化)、微网站、国际域名空间等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了很多网站制作、网站设计、网络营销经验,集策划、开发、设计、营销、管理等网站化运作于一体,具备承接各种规模类型的网站建设项目的能力。
create or replace procedure pro7
as
cursor c_emp1 is select ename,sal from stu;
vename stu.ename%type;
vsal stu.sal%type;
vnewsal stu.sal%type;
vfd number := 0;
begin
open c_emp1;
loop
fetch c_emp1 into vename,vsal;
exit when c_emp1%notfound;
vfd := vsal*0.2;
if vfd = 300
then update stu set sal = sal+vfd where ename=vename;
vnewsal := vsal+vfd;
dbms_output.put_line('员工' || vename || '涨了' || vnewsal || '工资');
end if;
end loop;
close c_emp1;
end;
--创建存储
程
CREATE
OR
REPLACE
PROCEDURE
xxxxxxxxxxx_p
(
--参数IN表示输入参数
OUT表示输入参数
类型
使用任意Oracle
合
类型
is_ym
IN
CHAR
)
AS
--定义变量
vs_msg
VARCHAR2(4000);
--错误信息变量
vs_ym_beg
CHAR(6);
--起始月份
vs_ym_end
CHAR(6);
--终止月份
vs_ym_sn_beg
CHAR(6);
--同期起始月份
vs_ym_sn_end
CHAR(6);
--同期终止月份
--定义游标(简单
说
遍历
结
集)
CURSOR
cur_1
IS
SELECT
area_code,CMCODE,SUM(rmb_amt)/10000
rmb_amt_sn,SUM(usd_amt)/10000
usd_amt_sn
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
=
vs_ym_sn_beg
AND
ym
=
vs_ym_sn_end
GROUP
BY
area_code,CMCODE;BEGIN
--用输入参数给变量赋初值
用
Oralce
SUBSTR
TO_CHAR
ADD_MONTHS
TO_DATE
等
用
函数
vs_ym_beg
:=
SUBSTR(is_ym,1,6);
vs_ym_end
:=
SUBSTR(is_ym,7,6);
vs_ym_sn_beg
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'),
-12),'yyyymm');
vs_ym_sn_end
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'),
-12),'yyyymm');
--先删除表
特定条件
数据
DELETE
FROM
xxxxxxxxxxx_T
WHERE
ym
=
is_ym;
--
用内置
DBMS_OUTPUT
象
put_line
打印
影响
记录行数
其
用
系统变量SQL%rowcount
DBMS_OUTPUT.put_line('del
月记录='||SQL%rowcount||'条');
INSERT
INTO
xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT
area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
=
vs_ym_beg
AND
ym
=
vs_ym_end
GROUP
BY
area_code,CMCODE;
DBMS_OUTPUT.put_line('ins
月记录='||SQL%rowcount||'条');
--遍历游标处理
更新
表
遍历游标
几种
用for语句
其
比较直观
种
FOR
rec
IN
cur_1
LOOP
UPDATE
xxxxxxxxxxx_T
SET
rmb_amt_sn
=
rec.rmb_amt_sn,usd_amt_sn
=
rec.usd_amt_sn
WHERE
area_code
=
rec.area_code
AND
CMCODE
=
rec.CMCODE
AND
ym
=
is_ym;
END
LOOP;
COMMIT;
--错误处理部
OTHERS表示除
声明外
任意错误
SQLERRM
系统内置变量保存
前错误
详细信息
EXCEPTION
WHEN
OTHERS
THEN
vs_msg
:=
'ERROR
IN
xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--
前错误记录进
志表
INSERT
INTO
LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;
首先编写存储过程的整体结构,如下:
create or replace procedure test_proc is
v_date date; --变量定义
begin
select sysdate into v_date from dual;
end test_proc;
2
定义游标:
create or replace procedure test_proc is
v_date date; --定义变量
cursor cur is select * from ldcode; --定义游标
begin
select sysdate into v_date from dual;
end test_proc;
3
编写for循环:
create or replace procedure test_proc is
v_date date; --定义变量
cursor cur is select * from ldcode where rownum10; --定义游标
begin
select sysdate into v_date from dual;
--游标for循环开始
for temp in cur loop --temp为临时变量名,自己任意起
Dbms_Output.put_line(temp.Code); --输出某个字段,使用"变量名.列名"即可。
end loop;
--游标for循环结束
end test_proc;
4
测试运行,点击【DBMS Output】标签页查看结果如下图:
END
二、带参数的游标for循环
1
定义带参数的游标:
cursor cur(v_codetype ldcode.Codetype%TYPE) is
select * from ldcode where codetype = v_codetype; --定义游标
定义游标格式:
cursor 游标名称(变量定义) is 查询语句;
注意:
where条件中的变量名v_codetype要与游标定义cur(v_codetype ldcode.Codetype%TYPE)中的一致。
2
编写for循环部分:
--游标for循环开始
for temp in cur('llmedfeetype') loop
--temp为临时变量名,自己任意起
--cur('llmedfeetype')为"游标名称(传入的变量)"
Dbms_Output.put_line(temp.Code); --输出某个字段,使用"变量名.列名"即可。
end loop;
--游标for循环结束
3
测试运行,点击【DBMS Output】标签页查看结果如下图: