存储过程:
1 create or replace procedure 存储过程名(param1 in type,param2 out type)
--如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。
--存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复, 参数传递方式:IN, OUT, IN OUT
--类型使用任意Oracle中的合法类型。
2 as(is)
3 major1 varchar2(100); --变量1 类型(值范围)
major2 student.major%type; --变量2声明一个变量和指定表的column一样的数据类型
变量2 类型(值范围); --student_info student%rowtype; --类型是表或者游标student中的一行数据类型
4 BEGIN --表明PL/SQL体的开始
5 PL/SQL体或者NULL;
6 END; ----表明PL/SQL体的结束
存储过程创建语法:
CREATE OR REPLACE PROCEDURE student_info
(
--定义参数
id IN VARCHAR2(12),
major IN CHAR(6),
the_count OUT NUMBER,
)
AS
--定义变量
student_id VARCHAR2(12);
start_time CHAR(6);
end_time CHAR(6);
--定义游标(简单的说就是一个可以遍历的结果集,相当于数据结构的list<map>)
CURSOR score_info IS
SELECT ...
FROM ...
WHERE ...
GROUP BY ...;
BEGIN
--用输入参数给变量赋初值
student_id := id;
--在判断语句前最好先用count(*)函数判断是否存在该条操作记录
--select ... into ... 给变量赋值
Select count(1) into the_count from 数据库表 where 列名 = major;
--先删除表中特定条件的数据。
DELETE FROM 表名 WHERE score > 60;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line('成绩统计记录='||SQL%rowcount||'条');
INSERT INTO 表名(student_id, time, score, sex)
SELECT student_id, time, score, sex
FROM XX_XX_INFO
WHERE time >= start_time
AND time <= end_time
GROUP BY student_id;
DBMS_OUTPUT.put_line('成绩查询记录='||SQL%rowcount||'条');
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是最快速的一种。
--游标循环loop,while和for的性能比较可以参考博客, http://blog.sina.com.cn/s/blog_62defbef0101ogxr.html。
--隐含打开游标
FOR var IN score_info
LOOP
--隐含执行FETCH语句
UPDATE 表名
SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE student_id = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
--隐含监测 score_info%NOTFOUND
END LOOP;
--隐含关闭游标
COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
--错误处理语句块
error_info := SQLERRM;
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(xxxxx, error_info, date)
VALUES('xxxxxxxxxxx', error_info, SYSDATE);
COMMIT;
END;
1 create or replace procedure 存储过程名(param1 in type,param2 out type)
--如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。
--存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复, 参数传递方式:IN, OUT, IN OUT
--类型使用任意Oracle中的合法类型。
2 as(is)
3 major1 varchar2(100); --变量1 类型(值范围)
major2 student.major%type; --变量2声明一个变量和指定表的column一样的数据类型
变量2 类型(值范围); --student_info student%rowtype; --类型是表或者游标student中的一行数据类型
4 BEGIN --表明PL/SQL体的开始
5 PL/SQL体或者NULL;
6 END; ----表明PL/SQL体的结束
存储过程创建语法:
CREATE OR REPLACE PROCEDURE student_info
(
--定义参数
id IN VARCHAR2(12),
major IN CHAR(6),
the_count OUT NUMBER,
)
AS
--定义变量
student_id VARCHAR2(12);
start_time CHAR(6);
end_time CHAR(6);
--定义游标(简单的说就是一个可以遍历的结果集,相当于数据结构的list<map>)
CURSOR score_info IS
SELECT ...
FROM ...
WHERE ...
GROUP BY ...;
BEGIN
--用输入参数给变量赋初值
student_id := id;
--在判断语句前最好先用count(*)函数判断是否存在该条操作记录
--select ... into ... 给变量赋值
Select count(1) into the_count from 数据库表 where 列名 = major;
--先删除表中特定条件的数据。
DELETE FROM 表名 WHERE score > 60;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line('成绩统计记录='||SQL%rowcount||'条');
INSERT INTO 表名(student_id, time, score, sex)
SELECT student_id, time, score, sex
FROM XX_XX_INFO
WHERE time >= start_time
AND time <= end_time
GROUP BY student_id;
DBMS_OUTPUT.put_line('成绩查询记录='||SQL%rowcount||'条');
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是最快速的一种。
--游标循环loop,while和for的性能比较可以参考博客, http://blog.sina.com.cn/s/blog_62defbef0101ogxr.html。
--隐含打开游标
FOR var IN score_info
LOOP
--隐含执行FETCH语句
UPDATE 表名
SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE student_id = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
--隐含监测 score_info%NOTFOUND
END LOOP;
--隐含关闭游标
COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
--错误处理语句块
error_info := SQLERRM;
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(xxxxx, error_info, date)
VALUES('xxxxxxxxxxx', error_info, SYSDATE);
COMMIT;
END;