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

来源:互联网 发布:多样性指数分析软件 编辑:程序博客网 时间:2024/05/22 06:18

一、程序包

程序包介绍:程序包(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 isbegin 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;–语句块结束

0 0
原创粉丝点击