您的位置:首页 > 数据库 > Oracle

oracle笔记2-程序包,过程,游标

2016-06-15 16:11 423 查看
一、程序包

程序包介绍:程序包(PACKAGE,简称包)是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来标识包。它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于c#和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。

一个包由两个分开的部分组成:

包说明(PACKAGE):包说明部分声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。

create or replace package PKG_DDXX_DATA IS
procedure P_DDXX_INS(v_sid         in varchar2,
v_xmid        in varchar2,
v_ddmc        in varchar2,
v_i           out number);
-------------------------------------
procedure P_MKGXXX_INS(v_xmid       VARCHAR2,
v_ddid       VARCHAR2,
v_creater    VARCHAR2,
v_valid_flag VARCHAR2,
v_i          out number);
------------------------------------------
procedure P_JDGXXX_INS(v_gllx        varchar2,
v_glid        varchar2,
v_i          out number);

procedure P_MAIN;
END;  --定义包头


create or replace package body PKG_DDXX_DATA is
begin
procedure P_DDXX_INS(v_sid         in varchar2,
v_xmid        in varchar2,
v_ddmc        in varchar2,
v_i           out number) is
begin
end;
procedure P_MKGXXX_INS() is
begin
end;
procedure P_MAIN() is
begin
end;
end;--定义包体,包体中有多个子过程。


包体中的主过程中可以调用包体中的子过程。

调用-call PKG_DDXX_DATA.P_MAIN();

二、过程

存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

create or replace procedure P_MKGXXX_INS(
v_xmid   VARCHAR2,
v_ddid       VARCHAR2,
v_creater    VARCHAR2,
v_valid_flag VARCHAR2,
v_i          out number) is
--定义一个游标数据类型
TYPE ddxx_cursor_type IS REF CURSOR;
c4             DDXX_CURSOR_TYPE;
--定义变量
V_INS_MGMX_SQL VARCHAR2(3000);
v_mkid         varchar2(200);
v_ins_mk_num   NUMBER;
BEGIN
--给变量赋值
v_i := 0;
--插入语句
V_INS_MGMX_SQL := 'insert into b_scpt_gzl_ddmkgx (   ddid,   mkid,   creater, valid_flag)
values (:v_ddid,:v_mkid,:v_creater,:v_valid_flag)';
--begin end;为一组语句块
begin
open c4 for
select gg.node_sid
from b_scpt_gzl_xmxx xm
left join (select *
from b_scpt_gzl_xm_gx
where node_type = 'SYSTEM'
and VALID_FLAG = '1') gx
on gx.node_parent_sid = xm.sid
left join (select *
from b_scpt_gzl_xm_gx
where node_type = 'MODULE'
and VALID_FLAG = '1') gg
on gg.node_parent_sid = gx.node_sid
where xm.valid_flag = '1'
and xm.sid = v_xmid;
loop
fetch c4
into v_mkid;
EXIT WHEN c4%NOTFOUND;
if (v_mkid is not null) then
begin
execute immediate V_INS_MGMX_SQL
using v_ddid, v_mkid, v_creater, v_valid_flag;
v_i := v_i + sql%rowcount; ---插入记录
commit;
end;
end if;
end loop;
close c4;
end;

END;


2.1、 P_MKGXXX_INS为定义的过程名,v_xmid VARCHAR2,定义的过程参数和类型,

2.2、 TYPE ddxx_cursor_type IS REF CURSOR;定义了一个游标类型,在过程中多次使用游标则 c4 ddxx_cursor_type;

c1 ddxx_cursor_type;

2.3 循环游标

begin–语句块开始

open c4 for (所要循环的查询语句);–打开游标

loop –开始循环

fetch c4

into v_mkid;–将循环的值给变更赋值

EXIT WHEN c4%NOTFOUND;

begin

如上的代码块,处理业务

end;

end loop;–结束循环

close c4;–关闭游标

end;–语句块结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 过程-程序包