`
1enny
  • 浏览: 70372 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

oracle程序包的原理和使用

 
阅读更多

程序包

程序包的定义:

程序包是对相关过程、函数、变量、游标和异常等对象的封装
程序包由规范和主体两部分组成



优点:

模块化、更轻松的应用程序设计、信息隐藏、新增功能、性能更佳。

创建包头包体的基本操作如下:
createorreplacepackagepack1--创建包头/规范
is
aanumber:=1;--在包头声明的为公有变量
procedureupdate_student(update_rowinstudent%rowtype);--声明一个更新过程
procedureinsert_student(insert_rowinstudent%rowtype);--声明一个插入过程
endpack1;--结束包头

--Package created

createorreplacepackagebodypack1--创建包体/主体
is
bbnumber:=2;--在包体声明的变量类私有变量
procedureinsert_student(insert_rowinstudent%rowtype)--创建过程主体
as
begin
insertintostudent(id,name,age)values(insert_row.id,insert_row.name,insert_row.age);
dbms_output.put_line('bb = '||bb||'aa = '||aa);
endinsert_student;--结束过程主体
procedureupdate_student(update_rowinstudent%rowtype)--创建过程主体
as
begin
updatestudent ssets.name='赵北'wheres.id=update_row.id;
endupdate_student;--结束过程主体
endpack1;--结束主体/包体

--Warning: Package body created with compilation errors

SQL>showerror;--查询错误
ErrorsforPACKAGEBODYHR.PACK1:
LINE/COLERROR
----------------------------------------------------------------------------
5/1PLS-00103:出现符号 "BEGIN"在需要下列之一时:;iswithauthidas
clusterorderusingexternaldeterministicparallel_enable
pipelinedresult_cache 符号 ";" 被替换为 "BEGIN" 后继续。
10/3PLS-00103:出现符号 "PROCEDURE"
11/5PLS-00103:出现符号 "BEGIN"在需要下列之一时:;iswithauthidas
clusterorderusingexternaldeterministicparallel_enable
pipelinedresult_cache 符号 ";" 被替换为 "BEGIN" 后继续。

SQL>
SQL>ed--修改上次执行的代码块
SQL>/--执行修改的代码块

--Package body created

SQL>setserverouton;--打开输出开关
SQL>executedbms_output.put_line(pack1.aa);--包中的公共变量被输出
1
PL/SQLproceduresuccessfully completed

SQL>executedbms_output.put_line(pack1.bb);--包中的私有变量不被输出
begindbms_output.put_line(pack1.bb);end;
--ORA-06550: 第 1 行, 第 34 列:
--PLS-00302: 必须声明 'BB' 组件
--ORA-06550: 第 1 行, 第 7 列:
--PL/SQL: Statement ignored
declare
row_student student%rowtype;--声明行级变量
begin
row_student.id:=5;
row_student.name:='张飞';
row_student.age:=60;
pack1.insert_student(row_student);--调用包中的过程
end;
/
bb=2aa=1
PL/SQLproceduresuccessfully completed

SQL>select*fromstudent;
IDNAME AGE
----------- -------------------- -----------
1张三20
2李四25
3王五30
4麻子30
5张飞60

SQL>
declare
row_student student%rowtype;--声明行级变量
begin
row_student.id:=5;
row_student.name:='关羽';
row_student.age:=60;
pack1.update_student(row_student);--调用包中的过程
end;
/
PL/SQLproceduresuccessfully completed

SQL>select*fromstudent;
IDNAME AGE
----------- -------------------- -----------
1张三20
2李四25
3王五30
4麻子30
5赵北60

程序包中的游标:

q游标的定义分为游标规范和游标主体两部分
q在包规范中声明游标规范时必须使用RETURN子句指定游标的返回类型
qRETURN子句指定的数据类型可以是:
q用%ROWTYPE属性引用表定义的记录类型
q程序员定义的记录类型,例如TYPE EMPRECTYP IS RECORD(emp_idINTEGER,salaryREAL)来定义的。
q不可以是number, varchar2,%TYPE等类型。
-----------------------------在程序包中创建显示游标---------------
createorreplacepackagepack2--创建包头
is
cursorstudent_cursorreturnstudent%rowtype;--声明显示游标,但是不能跟is select子句
procedurestudent_pro;--声明过程
endpack2;

createorreplacepackagebodypack2--创建包体
is
cursorstudent_cursorreturnstudent%rowtypeisselect*fromstudent;--指定游标所关联的select
procedurestudent_pro
is
student_row student%rowtype;
begin
openstudent_cursor;
fetchstudent_cursorintostudent_row;
whilestudent_cursor%found
loop
dbms_output.put_line('学号 = '||student_row.id||'姓名 = '||student_row.name);
fetchstudent_cursorintostudent_row;
endloop;
closestudent_cursor;
endstudent_pro;
endpack2;
/

SQL>executepack2.student_pro;
学号=1姓名=张三
学号=2姓名=李四
学号=3姓名=王五
学号=4姓名=麻子
学号=5姓名=赵北
PL/SQLproceduresuccessfully completed

SQL>

-----------------------------在程序包中创建ref游标---------------
createorreplacepackagepack3
is
typeref_cursorisrefcursor;--声明一个ref游标类型
procedureref_student_pro;
endpack3;
--Package created

createorreplacepackagebodypack3
is
procedureref_student_pro
is
student_row student%rowtype;
student_ref_cursor ref_cursor;--声明一个ref游标类型的变量
begin
openstudent_ref_cursorforselect*fromstudent;
fetchstudent_ref_cursorintostudent_row;
whilestudent_ref_cursor%found
loop
dbms_output.put_line('学号 = '||student_row.id||'姓名 = '||student_row.name);
fetchstudent_ref_cursorintostudent_row;
endloop;
closestudent_ref_cursor;
endref_student_pro;
endpack3;

--Package body created

SQL>executepack3.ref_student_pro;
学号=1姓名=张三
学号=2姓名=李四
学号=3姓名=王五
学号=4姓名=麻子
学号=5姓名=赵北
PL/SQLproceduresuccessfully completed

SQL>

系统内置程序包:

--------------------------------DBMS_job包的使用方法:------------------------------------
createtabletest_job(date_signdate);

createorreplaceprocedurepro_test
is
begin
insertintotest_jobvalues(sysdate);
end;
SQL>variablejob1number;
SQL>
SQL>begin
2 dbms_job.submit(:job1,'pro_test;',sysdate,'sysdate + 1/1440');--Submit()过程,工作被正常地计划好。
3end;
4/
PL/SQLproceduresuccessfully completed
job1
---------
23

SQL>
SQL>begin
2 dbms_job.run(:job1);-- Run()过程用来立即执行一个指定的工作。这个过
程只接收一个参数。

3end;
4/
PL/SQLproceduresuccessfully completed
job1
---------
23

SQL>select*fromtest_job;
DATE_SIGN
-----------
19-1-1523

SQL>select*fromtest_job;
DATE_SIGN
-----------
19-1-1523

SQL>
SQL>begin
2 dbms_job.remove(:job1);--过程来删除一个已计划运行的工作。这个过程接收一个参数。

3end;
4/
PL/SQLproceduresuccessfully completed
job1
---------
23

SQL>

--------------------------------UTL_FILE包的使用方法:------------------------------------

createdirectorydir_utl_fileas'/u01/app/oracle/pl_sql_pacakge/test_utl_file';--创建目录
grantread,writeondirectorydir_utl_filetohr;--给用户赋予权限

createorreplaceprocedurepro_utl_file(path_fileinvarchar2,name_fileinvarchar2)
is
utl_file_contentsvarchar2(2000);--定义内存变量
utl_file_type utl_file.file_type;--定义文件类型变量
begin
utl_file_type:=utl_file.fopen(path_file,name_file,'r',2000);--打开文件
loop
utl_file.get_line(utl_file_type,utl_file_contents);--读取文件内容到内存变量中
dbms_output.put_line(utl_file_contents);--,并打印
endloop;
exception--异常处理部分
whenno_data_found
then
utl_file.fclose(utl_file_type);
end;

Procedurecreated

SQL>setserverouton
SQL>executepro_utl_file('DIR_UTL_FILE','utl_file');
DECLARE
V1VARCHAR2(32767);
F1 UTL_FILE.FILE_TYPE;
BEGIN
-- In this example MAX_LINESIZE is less than GET_LINE's length request
-- so the number of bytes returned will be 256 or less if a line terminator is seen.
F1:=UTL_FILE.FOPEN('MYDIR','MYFILE','R',256);
UTL_FILE.GET_LINE(F1,V1,32767);
UTL_FILE.FCLOSE(F1);

-- In this example, FOPEN's MAX_LINESIZE is NULL and defaults to 1024,
-- so the number of bytes returned will be 1024 or less if a line terminator is seen.
F1:=UTL_FILE.FOPEN('MYDIR','MYFILE','R');
UTL_FILE.GET_LINE(F1,V1,32767);
UTL_FILE.FCLOSE(F1);

-- In this example, GET_LINE doesn't specify a number of bytes, so it defaults to
-- the same value as FOPEN's MAX_LINESIZE which is NULL in this case and defaults to 1024.
-- So the number of bytes returned will be 1024 or less if a line terminator is seen.
F1:=UTL_FILE.FOPEN('MYDIR','MYFILE','R');
UTL_FILE.GET_LINE(F1,V1);
UTL_FILE.FCLOSE(F1);
END;

PL/SQLproceduresuccessfully completed

SQL>

dbms_random的使用:
返回某年内的随机日期,分两步:
1,SELECTTO_CHAR(TO_DATE('01/01/03','mm/dd/yy'),'J')FROMDUAL;
2,SELECTTO_DATE(TRUNC(DBMS_RANDOM.VALUE(2452641,2452641+364)),'J')FROMDUAL;










分享到:
评论

相关推荐

    Oracle数据库中物化视图的原理剖析

    在 10g 中,新的 DBMS_ADVISOR 程序包中的一个名为 TUNE_MVIEW 的过程使得这项工作变得非常容易:您利用 IN 参数来调用程序包,这构造了物化视图创建脚本的全部内容。该过程创建一个顾问程序任务 (Advisor Task),它...

    Oracle分层管理器的技术原理及应用

    分层管理器应用程序需要进行许多设置和准备。主要步骤汇总如下:获取多层逐层细化图层时要使用的各个表的数据。创建一个包含特殊列和特殊元数据的新的空逐层细化表。元数据为每个组件表指定一个层名,同时标识组件表...

    oracle 11g——4

    从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用开发基础,并通过两个完整案例来介绍基于Java开发包和Oracle数据库...

    Oracle11g从入门到精通2

    4.5 程序包 4.5.1 基本原理 4.5.2 创建包 4.5.3 调用包 4.5.4 删除包 4.6 触发器 4.6.1 触发器的基本原理 4.6.2 创建触发器 4.6.3 执行触发器 4.6.4 删除触发器 第5章 熟悉SQL*Plus-Oracle...

    oracle 11g

    从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用开发基础,并通过两个完整案例来介绍基于Java开发包和Oracle数据库...

    oracle 11g -5

    从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用开发基础,并通过两个完整案例来介绍基于Java开发包和Oracle数据库...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

    从基本原理、理论提高、实际操作、经验策略、应用开发等方面,结合命令行方式、开发工具的使用、管理工具的使用、Oracle与Windows之间的关系等知识点,按照学习、理解、应用、管理的需要全面描述了Oracle11g的特征和...

    Oracle11g从入门到精通

    4.5 程序包 4.5.1 基本原理 4.5.2 创建包 4.5.3 调用包 4.5.4 删除包 4.6 触发器 4.6.1 触发器的基本原理 4.6.2 创建触发器 4.6.3 执行触发器 4.6.4 删除触发器 第5章 熟悉SQL*Plus-Oracle数据库环境 ...

    Oracle 11g 从入门到精通(2)

    从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用开发基础,并通过两个完整案例来介绍基于Java开发包和Oracle数据库...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    2.5.9安装cvuqdisk包 2.5.10 CVU验证安装环境 2.6创建ASM磁盘 2.6.1安装ASMLib驱动 2.6.2创建ASMLib磁盘 2.7部署RAC 2.7.1安装Grid Infrastructure 2.7.2安装Database DBMS 2.7.3创建ASM磁盘组 2.7.4创建...

    Oracle Database 11g初学者指南--详细书签版

    7.1 Oracle备份和恢复基本原理 178 7.1.1 从何处着手 178 7.1.2 备份的体系结构 179 7.1.3 Oracle 二进制文件 179 7.1.4 参数文件 179 7.1.5 控制文件 180 7.1.6 重做日志 180 7.1.7 撤消段 180 7.1.8 检查...

    Oracle_11g从入门到精通.rar

    从实际角度出发,系统地介绍了数据库和oracle的相关概念和原理、oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及oracle的应用开发基础,并通过两个完整案例来介绍基于java开发包和oracle数据库...

    Oracle.11g.从入门到精通 (2/2)

    4.5 程序包 4.5.1 基本原理 4.5.2 创建包 4.5.3 调用包 4.5.4 删除包 4.6 触发器 4.6.1 触发器的基本原理 4.6.2 创建触发器 4.6.3 执行触发器 4.6.4 删除触发器 第5章 熟悉SQL*Plus-Oracle数据库环境 5.1 进入和...

    Oracle从基础到熟练(太实用了)

    子程序[proc,udf],自主事务处理和程序包 ①:存储过程 ②:函数 ③:自主事务处理 ④:包规范|包主体 十一.触发器|内置包 ①:触发器类型 ②:触发器原理 ③:new和old 两个行类型变量 ④:递归 ⑤:内置包 十二....

    oracle10g课堂练习II(1)

    DBMS_REPAIR 程序包 7-16 使用 DBMS_REPAIR 7-17 块介质恢复 (BMR) 7-21 BLOCKRECOVER 命令 7-22 使用 BLOCKRECOVER 的示例 7-23 RMAN BMR 接口 7-25 可以采用的替代操作 7-26 小结 7-27 练习概览:执行块...

    Oracle.11g.从入门到精通 (1/2)

    4.5 程序包 4.5.1 基本原理 4.5.2 创建包 4.5.3 调用包 4.5.4 删除包 4.6 触发器 4.6.1 触发器的基本原理 4.6.2 创建触发器 4.6.3 执行触发器 4.6.4 删除触发器 第5章 熟悉SQL*Plus-Oracle数据库环境 5.1 进入和...

    oracle 12c 数据库 教程

    (五)使用 oracle-database-server-12cR2-preinstall 包 25 三、管理数据库实例 27 (一)管理工具 27 (二)初始化参数 27 (三)数据库启动的过程 29 (四)数据库的关闭 29 四、配置 Oracle 的网络环境 31 (一...

Global site tag (gtag.js) - Google Analytics