举例回答:
创新互联服务项目包括札达网站建设、札达网站制作、札达网页制作以及札达网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,札达网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到札达省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
案例:
--For 循环游标
--(1)定义游标
--(2)定义游标变量
--(3)使用for循环来使用这个游标
declare
--类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
c_row c_job%rowtype;
begin
for c_row in c_job loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
end;
-- 第一个题目,我的表叫stu,你别忘了改成你的表名
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;
你这种, 表名字是是参数的情况下, 需要使用 动态 sql 来处理了。
你需要先定义一个变量, 来存储你的 sql 语句。
然后 OPEN v_cursor FOR 那个 sql 语句的字符串
下面是一个例子:
SQL DECLARE
2 TYPE refcursor IS REF CURSOR;
3 v_cursor REFCURSOR;
4 v_Sql VARCHAR(200);
5 v_name VARCHAR(10);
6 BEGIN
7 -- 动态SQL
8 v_Sql := 'SELECT name FROM test_dysql';
9 -- 打开游标.
10 OPEN v_cursor FOR v_SQL;
11 -- 循环处理.
12 LOOP
13 -- 填充数据.
14 FETCH v_cursor INTO v_name;
15 -- 无数据时 退出循环.
16 EXIT WHEN v_cursor%NOTFOUND;
17 -- 输出.
18 dbms_output.put_line(v_name);
19 END LOOP;
20 -- 关闭游标.
21 CLOSE v_cursor;
22 EXCEPTION
23 WHEN OTHERS THEN
24 -- 发生异常时,如果游标还打开,那么关闭掉.
25 IF (v_cursor%isopen) THEN
26 CLOSE v_cursor;
27 END IF;
28 RAISE;
29 END;
30 /
A
B
C
D
E
PL/SQL procedure successfully completed.