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

本文详细介绍了PL/SQL中的程序包概念及其组成部分——包说明与包主体,并通过实例展示了如何创建及调用包内的过程。此外,还阐述了存储过程的优势,包括提升数据库执行效率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、程序包

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值