oracle笔记2-程序包,过程,游标
2016-06-15 16:11
423 查看
一、程序包
程序包介绍:程序包(PACKAGE,简称包)是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来标识包。它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于c#和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。
一个包由两个分开的部分组成:
包说明(PACKAGE):包说明部分声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。
包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。
包体中的主过程中可以调用包体中的子过程。
调用-call PKG_DDXX_DATA.P_MAIN();
二、过程
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
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;–语句块结束
程序包介绍:程序包(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;–语句块结束
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ORACLE LATERAL-SQL-INJECTION 个人见解