oracle程序包的原理和使用

程序包

程序包的定义:



     程序包是对相关过程、函数、变量、游标和异常等对象的封装

程序包由规范和主体两部分组成

优点:



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

创建包头包体的基本操作如下:


create or replace package pack1 --创建包头/规范

is

aa number := 1 ; --在包头声明的为公有变量

procedure update_student (update_row in student %rowtype ); --声明一个更新过程

procedure insert_student (insert_row in student %rowtype ); --声明一个插入过程

end pack1 ; --结束包头

--Package created

create or replace package body pack1 --创建包体/主体

is

bb number := 2 ; --在包体声明的变量类私有变量

procedure insert_student (insert_row in student %rowtype ) --创建过程主体

as

begin

insert into student( id, name, age) values (insert_row.id ,insert_row.name ,insert_row.age );

dbms_output.put_line (‘bb = ‘ ||bb ||‘aa = ‘ || aa );

end insert_student; --结束过程主体

procedure update_student( update_row in student% rowtype) --创建过程主体

as

begin

update student s set s.name = ‘赵北‘ where s.id = update_row.id ;

end update_student ;--结束过程主体

end pack1 ;--结束主体/包体

--Warning: Package body created with compilation errors

SQL > show error; --查询错误

Errors for PACKAGE BODY HR.PACK1 :

LINE/ COL ERROR

----------------------------------------------------------------------------

5 /1       PLS -00103 : 出现符号
"BEGIN"在需要下列之一时:   ; is with authid as

cluster order using external deterministic parallel_enable

pipelined result_cache  符号 ";" 被替换为 "BEGIN" 后继续。

10 /3      PLS -00103 : 出现符号
"PROCEDURE"

11 /5      PLS -00103 : 出现符号
"BEGIN"在需要下列之一时:   ; is with authid as

cluster order using external deterministic parallel_enable

pipelined result_cache  符号 ";" 被替换为 "BEGIN" 后继续。

SQL >

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

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

--Package body created

SQL > set serverout on; --打开输出开关

SQL > execute dbms_output.put_line (pack1.aa ); --包中的公共变量被输出

1

PL /SQL procedure successfully completed

SQL > execute dbms_output.put_line (pack1.bb ); --包中的私有变量不被输出

begin dbms_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 /SQL procedure successfully completed

SQL > select * from student ;

ID NAME                    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 /SQL procedure successfully completed

SQL > select * from student ;

ID NAME                    AGE

----------- -------------------- -----------

1 张三                        20

2 李四                        25

3 王五                        30

4 麻子                        30

5 赵北                        60  

程序包中的游标:


q游标的定义分为游标规范和游标主体两部分

q在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型

qRETURN子句指定的数据类型可以是:

q用 %ROWTYPE 属性引用表定义的记录类型

q程序员定义的记录类型,例如 TYPE EMPRECTYP IS RECORD(emp_id INTEGER,salaryREAL)来定义的。

q不可以是number, varchar2, %TYPE等类型。


-----------------------------在程序包中创建显示游标---------------

create or replace package pack2 --创建包头

is

cursor student_cursor return student %rowtype ; --声明显示游标,但是不能跟is
select子句

procedure student_pro ; --声明过程

end pack2 ;

create or replace package body pack2 --创建包体

is

cursor student_cursor return student %rowtype is select *   from student ; --指定游标所关联的select

procedure student_pro

is

student_row student %rowtype ;

begin

open student_cursor ;

fetch student_cursor into student_row ;

while student_cursor %found

loop

dbms_output.put_line (‘学号 = ‘ || student_row.id || ‘姓名 = ‘ || student_row.name);

fetch student_cursor into student_row ;

end loop;

close student_cursor ;

end student_pro ;

end pack2 ;

/

SQL > execute pack2.student_pro ;

学号 = 1姓名 = 张三

学号 = 2姓名 = 李四

学号 = 3姓名 = 王五

学号 = 4姓名 = 麻子

学号 = 5姓名 = 赵北

PL /SQL procedure successfully completed

SQL >

-----------------------------在程序包中创建ref游标---------------

create or replace package pack3

is

type ref_cursor is ref cursor; --声明一个ref游标类型

procedure ref_student_pro ;

end pack3 ;

--Package created

create or replace package body pack3

is

procedure ref_student_pro

is

student_row student %rowtype ;

student_ref_cursor ref_cursor ;--声明一个ref游标类型的变量

begin

open student_ref_cursor for select * from student ;

fetch student_ref_cursor into student_row ;

while student_ref_cursor %found

loop

dbms_output.put_line (‘学号 = ‘ || student_row.id || ‘姓名 = ‘ || student_row.name);

fetch student_ref_cursor into student_row ;

end loop;

close student_ref_cursor ;

end ref_student_pro ;

end pack3 ;

--Package body created

SQL > execute pack3.ref_student_pro ;

学号 = 1姓名 = 张三

学号 = 2姓名 = 李四

学号 = 3姓名 = 王五

学号 = 4姓名 = 麻子

学号 = 5姓名 = 赵北

PL /SQL procedure successfully completed

SQL >

系统内置程序包:



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

create table test_job (date_sign date);

create or replace procedure pro_test

is

begin

insert into test_job values (sysdate );

end ;

SQL >   variable job1 number;

SQL >

SQL >  begin

2     dbms_job.submit (:job1 ,‘pro_test;‘ ,sysdate ,‘sysdate
+ 1/1440‘); --Submit()过程,工作被正常地计划好。

3     end ;

4   /

PL /SQL procedure successfully completed

job1

---------

23

SQL >

SQL > begin

2     dbms_job.run (:job1 );--    Run()过程用来立即执行一个指定的工作。这个过

程只接收一个参数。

3     end ;

4   /

PL /SQL procedure successfully completed

job1

---------

23

SQL > select * from test_job ;

DATE_SIGN

-----------

19 -1 月- 15 23

SQL > select * from test_job ;

DATE_SIGN

-----------

19 -1 月- 15 23

SQL >

SQL > begin

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

3     end ;

4   /

PL /SQL procedure successfully completed

job1

---------

23

SQL >

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

create directory dir_utl_file  as ‘/u01/app/oracle/pl_sql_pacakge/test_utl_file‘ ; --创建目录

grant read, write on directory dir_utl_file to hr ; --给用户赋予权限

create or replace procedure pro_utl_file (path_file in varchar2, name_file in varchar2 )

is

utl_file_contents varchar2( 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 );--,并打印

end loop;

exception--异常处理部分

when no_data_found

then

utl_file.fclose (utl_file_type );

end ;

Procedure created

SQL > set serverout on

SQL > execute pro_utl_file (‘DIR_UTL_FILE‘ ,‘utl_file‘ );

DECLARE

V1 VARCHAR2 (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 /SQL procedure successfully completed

SQL >

dbms_random的使用:

返回某年内的随机日期,分两步:

1,    SELECT TO_CHAR( TO_DATE( ‘01/01/03‘, ‘mm/dd/yy‘), ‘J‘) FROM DUAL;

2,   SELECT TO_DATE( TRUNC( DBMS_RANDOM.VALUE( 2452641, 2452641+ 364)), ‘J‘)      FROM DUAL ;

时间: 2024-10-12 14:03:29

oracle程序包的原理和使用的相关文章

oracle程序包

create or replace package my_package as function getTableCount(table_name varchar2) return number; procedure addbook(bookName in varchar2,bookTypeId in number,n1 out number);end my_package; create or replace package body my_package as procedure addbo

Linux程序包管理--rpm和yum的原理和基本用法

Linux中的程序包主要分为两类: 二进制可执行安装包和源代码程序文件包. 本文主要讲解使用rpm程序包管理器和yum管理器前端工具来实现对二进制可执行安装包的安装, 查询, 升级和卸载等相关操作. Linux中在二进制可执行安装程序包安装上会涉及多个文件的操作, 操作过程就会比较复杂, 为简化该过程就使用程序安装包管理器来管理程序包的安装过程, 大大简化了程序包安装过程. Linux根据发行版本不同, 使用不同的程序包管理器实现对程序包的管理, 在这里主要介绍两大分支: debian: 使用d

[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) ——通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)            [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之

Oracle实践--PL/SQL基础之触发器和程序包

PL/SQL基础之触发器和程序包  程序包 /* 程序包:对相关存储过程,函数,变量,游标和异常等对象的封装 有声明和主体组成 优点:1.模块化:2.更轻松的应用程序设计;3.信息隐藏;4.性能更佳 */ --程序包的声明:关键字:package is end create or replace package my_pack as procedure packageTest(v_num number); end my_pack;--也可以是 end; --程序包的主体 create or re

ORACLE的程序包1-程序包的基础

程序包简析 oracle中的程序包简析    一 程序包的基本概念     程序包可将若干函数或者存储过程组织起来,作为一个对象进行存储.程序包通常由两部分构成,规范(specification)和主体(body). 程序包也可以包含常量和变量,包中的所有函数和存储过程都可以使用这些变量或者常量. 程序包是对相关过程.函数.变量.游标和异常等对象的封装 程序包由规范和主体两部分组成 二 规范     1 创建规范(SQL窗口)     create or replace package pkg_

ORACLE的程序包不该忽视的东西

1.程序包就相当于JAVA中的类 2.程序包效率高的原因是:当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高. 3.包有两部分组成 (1).包说明(规范)(PACKAGE SPECIFICATION):包说明部分声明包内数据类型.变量.常量.游标.子程序和异常错误处理等元素,这些元素为包的公有元素. (2).包体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定

Linux程序包管理--源码编译的原理和基本方法

Linux中使用rpm格式的程序文件包来安装是比较方便的方法, 但是有一部分程序文件包没有rpm包格式, 这时就需要用户自己手工编译源码包来进行安装. 文本主要讲解源码编译的原理和基本操作过程. 源码包命名方式 name - VERSION . tar . gz 其中: VERSION = major . minor . release major表示主版本号, 经过比较大的改进 minor表示次版本号, 改进比较小 release表示对一些bug进行修复 源码包编译过程 源码包是指经过程序员编

Oracle数据库程序包全局变量的应用

1 前言  在程序实现过程中,经常用遇到一些全局变量或常数.在程序开发过程中,往往会将该变量或常数存储于临时表或前台程序的全局变量中,由此带来运行效率降低<频繁读取临时表>或安全隐患<存于前台程序变量,可跟踪内存变量获得>.  本文主要论述将全局变量或常数存取程序包的优点和实现方法.   2 优点  2.1 执行效率比存储于临时表高,不需要频率存取临时表  2.2 将全局变量藏于最后防线<数据库>,安全性较高  2.3 在视图中可以调用程序包的变量,实现动态视图   3

Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包

子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中. 子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 - 执行操作并返回值 子程序的优点: 模块化 将程序分解为逻辑模块 可重用性 可以被任意数目的程序调用 可维护性 简化维护操作 安全性 通过设置权限,使数据更安全 存储过程 过程是用于完成特定任务的子程序. 例如: 一个购票过程可以分为很多个子过程,分别完成. 创建存储过程 创建过程的语法: CREAT