当前位置:文档之家› ORACLE系统包简介

ORACLE系统包简介

ORACLE系统包简介
ORACLE系统包简介

oracle子程序和包

实验: 子程序和包 实验目的 (1)掌握函数和子程序的创建和使用。 (2)掌握带参数的子程序的使用。 (3)掌握包的创建和使用。 实验内容 1、编写一个包emp_package,用来对emp表进行操作。其中应包含以上几个功能: (1)编写一个不带参数的过程dept_pro,功能是输出每个部门名称和部门人数,建议使用游标。 SQL> ed 已写入file afiedt.buf 1 create procedure emp_pro 2 is 3 CURSOR dept_cur IS select dname,count(empno)人数from emp,dept 4 where emp.deptno=dept.deptno group by dname; 5 begin 6 for v_dept in dept_cur loop 7 dbms_output.put_line(v_dept.dname||' '||v_dept.人数); 8 end loop; 9* end; SQL> / 过程已创建。 (2)输入职工编号,得到职工姓名的存储过程或函数emp_pro或emp_fun CREATE OR REPLACE PROCEDURE emp_pro ( p_name OUT emp.ename%type, p_sal OUT emp.sal%type, p_eno IN emp.empno%type )

IS begin -- Test statements here select ename,sal into p_name,p_sal from emp where empno=p_eno; end; CREATE OR REPLACE FUNCTION emp_fun(p_eno emp.empno%type) RETURN emp.ename%type IS v_ename emp.ename%type; begin -- Test statements here select ename into v_ename from emp where empno=p_eno; return v_ename; end; (3)编写一个函数dept_fun,向函数传递一个部门号,如果dept表中不包含这个部门号,则返回”无此部门。 SQL> ed 已写入file afiedt.buf 1 CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno) 2 RETURN dept.dname%type 3 IS 4 v_dname dept.dname%type; 5 begin 6 -- Test statements here 7 select dname into v_dname 8 from dept where deptno=v_deptno; 9 return v_dname; 10 EXCEPTION 11 WHEN NO_DA TA_FOUND THEN 12 DBMS_OUTPUT.PUT_LINE('无此部门'); 13* end; SQL> / 输入deptno 的值: 10 原值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno) 新值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=10) 函数已创建。

Oracle子程序存储过程

Oracle_子程序_存储过程 select user from dual; set serveroutput on --存储过程 CREATE OR REPLACE PROCEDURE proce_Test --创建过程 is --局部变量 BEGIN dbms_output.put_line('大家好' ); END proce_Test; --执行存储过程建议按f5 执行存储过程 execute proce_test; begin proce_test; end; --------------------------------------------------------------------------------------- ----------------------------------------------- -- 此处说明定义存储过程时不能给形参施加限制(大小),存储过程创建出错,也会保留在服务器上------------------------------------------------ ------错误问题说明 Create procedure Sp_Test1(a varchar2,b out varchar2) -- 此处不能加size,执行存储过程会出错.但该存储过程依然保存在数据库中,此名字已经被占用,当修改正确后,再执行时会抱该对象已经存在的异常,所以建议使用or replace is Begin b :=a; End Sp_Test1; drop procedure sp_Test1 --create or replace procedure --test(a varchar2,b out varchar2) is --begin

ORACLE系统包介绍

Oracle 系统包 DBMS_OUTPUT a)启用 i. dbms_output.enable(buffer_size in integer default 20000); ii. set serveroutput on; b)禁用 i. dbms_output.disable; c)PUT和PUT_LINE i. PUT:所有信息显示在同一行 ii. PUT_LINE信息显示后,自动换行 d)NEW_LINE用于在行的尾部追加行结束符,一般用PUT同时使用 e)GET_LINE和GET_LINES i. DBMS_OUTPUT.GET_LINE(li ne 0UTVARCHAR2,status OUT INTEGER)用于取缓冲区的单行 信息 ii. DBMS_OUTPUT.GET_LINES(lines OUT chararr,numlies IN OUT INTEGER) 用于取得缓冲区的多行信息 DBMS_JOB a)SUBMIT用于建立一个新作业 语法 DBMS_JOB.SUBMIT( job OUT BINARY_INTEGER, what IN VARCHAR2, next_date IN DATE DEFATULT SYSDATE, interval IN VARCHAR2 DEFAULT ' NULL' , no_parse IN BOOLEAN DEFAULT FALSE, instance IN BINARY_INTEGER DEFAULT any_instance, force IN DEFAULT FALSE); 例子 VAR jobno NUMBER; BEGIN DBMS_JOB.SUBMI( :jobno, 'pro_hrs101d0_ins_hrs101t0', sysdate, ‘sysdate+1 '); b)REMOVE!于删除作业队列中的特定作业 语法:DBMS_JOB.REMOVE(jov IN BINARY_INTEGER); 例子:DBMS_JOB.REMOVE(10);--删除JOB号为10 的JOB c)CHANGE用于改变与作业相关的所有信息

内置包Oracle

内置程序包 Oracle提供了许多内置程序包,它们用于扩展数据库的功能。在开发应用程序时,可以利 用这些程序包。数据库用户SYS拥有Oracle提供的所有程序包。它们被定义为公有同义词, 并将执行权限授予了PUBLIC用户组,任何用户都可以访问它们。 Oracle提供的程序包的部分列表见表8.1。 续表 下面简单介绍几个常用的内置程序包。 8.2.1 DBMS_OUTPUT DBMS—OUTPUT程序包允许显示PL/SQL块和子程序的输出结果,这样便于测试和调试它们。 PUT和PUT_LINE过程将信息输出到SGA中的缓冲区。通过调用过程GET_LINE或通过 SET SERVEROUTPUT ON,可以显示缓冲区中的信息。 默认缓冲区大小是2000字节。最小值是2000,最大值是1,000,000。DBMS一OUTPUT包 有以下常用过程。 ENABLE

ENABLE过程用来启用对PUT、PUT_ LINE和NEW_LINE等过程的调用,它只有一个输入参数, 即缓冲区大小(BUFFER_SIZE)。缓冲区大小的输入值用于设置默认缓存的信息量。调用 ENABLE将清除任何已废弃会话中缓存的数据。 DISABLE DISABLE没有输入和输出。DISABLE用于禁用对PUT、PUT_LINE和NEW_LINE的所有调用。 调用DISABLE过程还可清除缓冲区中的任何剩余信息。 PUT PUT有一个输入参数,此参数被重载以接受VARCHAR2、NUMBER和DATE值。PUT用于在缓冲 区中存储一条信息。TO_CHAR将使用默认格式设置格式化这些项。 PUT_ LINE PUT_ LINE有一个输入参数,此参数被重载以接受VARCHAR2、NUMBER和DATE值。如果这些 值是要混合使用,则必须显式使用TO_CHAR函数。PUT_LINE过程用于将一条信息存储在缓 冲区中,后接一个行结束标记。 NEW_LINE NEW_LINE没有参数。它用于向缓冲区中添加换行符。换行符充当行结束标记。对 PUT_LINE 或NEW_LINE的每次调用都将产生一行。 例13演示了DBMS_OUTPUT包的用法。 例13: 例13的输出结果如下所示。 8.2.2DBIVIS_LOB

oracle包以及简单操作样例

一、包的概念 PL/SQL为了满足程序模块化的需要,除了块(block)和子程序结构外,还引入了包的构造。 (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。 (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 (3)与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL 程序访问,而私有元素只能被包内的函数和过程序所访问。 (4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开,在这种情况下,将过程放置在一个包中,可隐蔽实现的细节。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。

(5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。如果ORACLE具有Procedure选件,包可以编译、存贮在ORACLE数据库中,其内容可为许多应用共享。 二、包的作用 包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器。将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量。 三、包定义: (1)一个包由两个分开的部分组成: (2)包定义(PACKAGE):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

ORACLE程序包的创建与应用

ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) 本篇主要内容如下: 第七章程序包的创建和应用 7.1 程序包简介 7.2 程序包的定义 7.3 包的开发步骤 7.4 包定义的说明 7.5 子程序重载 7.6 加密实用程序 7.7 删除包 7.8 包的管理 7.1 程序包简介 程序包(PACKAGE,简称包)是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来标识包。它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于c#和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 与高级语言中的类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程序所访问。 当然,对于不包含在程序包中的过程、函数是独立存在的。一般是先编写独立的过程与函数,待其较为完善或经过充分验证无误后,再按逻辑相关性组织为程序包。 程序包的优点 简化应用程序设计:程序包的说明部分和包体部分可以分别创建各编译。主要体现在 以下三个方面: 1)可以在设计一个应用程序时,只创建各编译程序包的说明部分,然后再编写引用该程序 包的PL/SQL块。 2)当完成整个应用程序的整体框架后,再回头来定义包体部分。只要不改变包的说明部分, 就可以单独调试、增加或替换包体的内容,这不会影响其他的应用程序。 3)更新包的说明后必须重新编译引用包的应用程序,但更新包体,则不需重新编译引用包 的应用程序,以快速进行应用程序的原形开发。

Oracle 程序包主体

Oracle 程序包主体 程序包主体包含了在规范中声明的过程和函数的实现代码,程序包主体的名称必须与规范的名称相同,这个相同的名称将规范与主体结合在一起组成程序包。另外,程序包主体中定义的过程和函数的名称、参数和返回值等必须与规范中声明的完全区配。创建程序包主体使用CREATE PACKAGE BODY语句如下: create [or replace] package body package_name is [pragma serially_reusable;] [collection_type_definition ...] [record_type_definition ...] [subtype_definition ...] [collection_declaration ...] [constant_declaration ...] [exception_declaration ...] [object_declaration ...] [record_declaration ...] [variable_declaration ...] [cursor_body ...] [function_spec ...] [procedure_spec ...] [call_spec ...] [begin sequence_of_statements] end [package_name] 包主体中的内容是私有的,它实现了包规范部分定义的细节内容,并且对调用者是不可见的。在包主体中有一个比较特殊的部分,即BEGIN表示的一个可选的初始化部分,它用于初始化包中的变量等。 在了解创建程序包主体的语法后,下面将为SCOTT_EMP_PKG包创建主体,实现过程UPDATE_SAL()和一个函数SELECT_NAME()。代码如下: SQL> create or replace package body scott_emp_pkg is 2 procedure update_sal(deptno_param number,sal_param number) is 3 begin 4 update emp 5 set sal=sal+sal_param 6 where deptno=deptno_param; 7 end update_sal; 8 9 function select_name(empno_param number) return varchar2 is 10 e_ename varchar2(20); 11 begin 12 select ename 13 into e_ename

第十章子程序与程序包

子程序与程序包
1. 子程序概述
? 什么是子程序? 一个命名的 PL/SQL 块,编译并存储在数据库中。 ? 为什么要使用子程序? 在第八,九章,我们学习了 PL/SQL 块和游标,可以在一个代码块中解 决复杂的业务逻辑,但是我们也发现,我们的代码块是临时的,只能使 用一次,如果这个业务我们需要再次使用,我们需要重新编写。基于此, 我们将要重用的业务块进行命名,存储在数据库中,这就是子程序。 ? 子程序的构成? 子程序的结构和普通的 PL/SQL 块是一致的,也包括如下部分: 声明部分 可执行部分 异常处理部分(可选) ? 子程序的分类? 存储过程 函数 ? 子程序的优点? 模块化【将程序分解为逻辑模块】 可重用性【可以被任意数目的程序调用】 可维护性【简化维护操作】 安全性【通过设置权限,使数据更安全】
2. 存储过程
过程是用于完成特定任务的子程序, 通过使用过程不仅可以简化客户端应用 程序的开发和维护,而且还可以提高应用程序的运行性能。 1) 创建存储过程的语法如下: CREATE [OR REPLACE] PROCEDURE [()]--创建过程, 可指定运行过程需传递 的参数 IS|AS --可以声明变量 BEGIN --包括在过程中要执行的语句 [EXCEPTION ] --处理异常 END; [注]过程体内不能使用查询语句,只能用于赋值(SQL 语句块都如此) 如果过程体语句有错误也能创建成功 没有参数就不写,不用()

第5章 PLSQL开发子程序和包

第5章开发子程序和包 5.1子程序简介 子程序是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用中多次调用。PL/SQL有两种类型的子程序:过程和函数。其中,过程用于执行特定操作,而函数则用于返回特定数据。通过将商业逻辑和企业规则集成到PL/SQL子程序中,可以简化客户端应用的开发和维护,提高应用的性能。 5.2过程 5.2.1创建过程 过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程。 语法: 上述语法中,procedure_name用于指定过程名称,argument1、argument2等则用于指定过程的参数,IS或AS用于开始一个PL/SQL块。当指定参数数据类型时,不能指定其长度。另外,创建过程时,既可以指定输入参数(IN),又可以指定输出参数(OUT)及输入输出参数(IN OUT)。通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分。通过使用输出参数,可以将执行部分的数据传递到应用环境。定义子程序参数时,如果不指定参数模式,则默认输入参数;如果需要定义输出参数,则必须指定OUT关键字;如果需要定义输入输出参数,则必须指定IN OUT关键字。以下通过示例说明创建过程和使用各种参数模式的方法。接下来我们看一下过程的创建。

1.创建无参过程 以下通过删除表中重复记录为例,说明创建该种过程的方法。 假设表tb_test中的数据如图4.1.1 创建一个无参函数,完成删除此表中重复记录的操作,如图5.1.2所示 图5.1.2 创建无参过程 过程pro_update_rec创建之后可以进行调用,在sql plus环境中可以使用call或者exec 两个命令。如果不使用exec或者call命令的话,我们也可以使用pl/sql块的方式来调用。 无参过程的调用如图5.1.2所示。

Oracle PlSql包(package)

Oracl e PL/SQL包(package) 目录 Oracle PL/SQL包(package) (1) 一、什么是PL/SQL包 (2) 1、PL/SQL包举例 (3) 二、PL/SQL包的优点 (5) 三、理解包说明 (5) 四、理解包体 (7) 五、包特性的例子 (8) 六、包中私有项和公有项 (14) 七、重载包级子程序 (14) 八、包STANDARD是如何定义PL/SQL环境的 (15) 九、系统包一览 (15) 1、关于DBMS_ALERT包 (15) 2、关于DBMS_OUTPUT包 (16) 3、关于DBMS_PIPE包 (16) 4、关于UTL_FILE包 (16) 5、关于UTL_HTTP包 (17) 十、包编写准则 (17)

一、什么是PL/SQL包 包就是一个把各种逻辑相关的类型、常量、变量、异常和子程序组合在一起的模式对象。包通常由两个部分组成:包说明和包体,但有时包体是不需要的。包说明(简写为spec)是应用程序接口;它声明了可用的类型、变量、常量、异常、游标和子程序,包体(Body)部分完全定义游标和子程序,并对说明中的内容加以实现。 如下例所示,我们可以认为说明部分是一个可选接口,而包体是一个"黑盒"。我们可以调试、增强或替换一个包体而不同改变接口(包说明)。 我们可以从SQL*Plus中使用CREATE PACKAGE语句来创建一个包。语法如下: CREATE [OR REPLACE] PACKAGE package_name [AUTHID {CURRENT_USER | DEFINER}] {IS | AS} [PRAGMA SERIALLY_REUSABLE;] [collection_type_definition ...] [record_type_definition ...] [subtype_definition ...] [collection_declaration ...] [constant_declaration ...] [exception_declaration ...] [object_declaration ...] [record_declaration ...] [variable_declaration ...] [cursor_spec ...] [function_spec ...] [procedure_spec ...] [call_spec ...] [PRAGMA RESTRICT_REFERENCES(assertions) ...] END [package_name]; [CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS} [PRAGMA SERIALLY_REUSABLE;]

Oracle函数,包和plsql块编程实用实例

Oracle函数,包和pl/sql块编程实例 一:函数是用于返回特定的数据。 函数案例1:输入雇员姓名,返回该雇员的年薪。 create function sp_fun2(spname varchar2) return number is yearsal number(7,2);--返回一个number类型值,具体大小是number(7,2),名字是yearsal,具体类型值。 begin select sal*12+nvl(comm,0)*12 into yearsal from emp//防止为空。 where ename=spname; return yearSal; end; 函数调用: (1)SQL>var income number;--定义变量; (2)SQL>call sp_fun2('SCOTT') into :income;--调用函数into给这个值 (3)SQL>print income;--打印一下。 二:包:包用于逻辑上组合过程和函数,他有包规范和包体两部分组成。(1)创建包规范: create package sp_package is procedure update_sal (name varchar2,newsal number); function annual_income(name varchar2) return number; end; / 注释:创建一个包,声明该包包含一个sp_pro2过程和一个sp_fun2函数。 包规范只包含函数和过程的说明。但是没有过程和函数的实现代码,包体用于实现包规范中的过程和函数。 组合: . (2)创建包体:给包sp_package实现包体。 如下: create or replace package body sp_package is procedure update_sal(name varchar2,newsal number) is begin update emp set sal=newsal where ename=name; end; function annual_income(name varchar2) return number is

ORACLE 包和包体的创建和使用

create or replace package pack_one as --包头的声明 type cur is ref cursor; --定义一个动态游标,也只能是动态 type v_record is record( -- 定义一个记录类型(集合的一种) v_name emp.ename%type, v_sal emp.sal%type, v_dname dept.dname%type ); function my_fun(v_job varchar2) return cur; --定义一个方法 procedure my_pro(v_job in varchar2,my_cur2 out cur);--定义一个存储过种 end pack_one;--包头结束 create or replace package body pack_one as--创建一个包体 function my_fun(v_job varchar2) return cur--对方法的实现,注意是在包体的声明部分里操作 is my_cur cur;--声明游标,因为还是在包的部分,所以直接声明即可 sql_cur varchar2(200); begin sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||'''';--拼接SQL语句,重要注意引号的使用 dbms_output.put_line(sql_cur);--可以通过输出为调试拼接好的SQL语句 open my_cur for sql_cur;--打开游标 return(my_cur);--方法有返回值,要牢记 end my_fun;--方法的实现结束 procedure my_pro(v_job in varchar2,my_cur2 out cur)--对存储过程的实现 as sql_cur varchar2(200); begin sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||''''; open my_cur2 for sql_cur;--打开游标,注意,打开的是传进来的参数,即我们把游标通过参数传出给调用环境因为是out end my_pro; begin null; end pack_one;--存储实现的结束 declare--下面是对包的调用调用其中的方法 v_cur pack_one.cur;--注意这里游标类型声明的方式 my_record pack_one.v_record;--同上,注意声明方式 begin v_cur:=pack_one.my_fun('CLERK');--通过参数调过方法,传进的参数,会被接收因为是

Oracle Form属性、内置子程序、触发器、系统变量简介

Oracle Form属性、内置子程序、触发器、系统变量精解 Oracle Form属性、内置子程序、触发器、系统变量精解 属性 1 1.1 通用属性 名称(Name) 子类信息(Subclass Information) 备注(Comments) 标题(Title) 方向(Direction) 字体名称(Font Name) 字体大小(Font Size) 字体粗细(Font Weight) 字体风格(Font Style) 字体间距(Font Spacing) 前景色(Foreground) 背景色(Background) 填充图案(Fill Pattern) 字符模式逻辑属性(Character Mode Logical Attribute) 黑底白字(White on Black) 视觉属性组(Visual Attribute Group) 当前记录视觉属性组(Current Record Visual Attribute Group?/div> 宽度(Width) 高度(Height) 立体(Bevel) 显示水平滚动条(Show Horizontal Scroll Bar) 显示垂直滚动条(Show Vertical Scroll Bar) 可见(Visible) X轴坐标(X Position) Y轴坐标(Y Position) 启用(Enabled) 标签文本(Label) 允许查询(Query Allowed) 允许插入(Insert Allowed) 允许更新(Update Allowed) 显示滚动条(Show Scroll Bar) 带滚动条画布(Scroll Bar Canvas) 滚动条标签页(Scroll Bar Tab Page) 滚动条方向(Scroll Bar Orientation) 滚动条的X轴坐标(Scroll Bar X Position) 滚动条的Y轴坐标(Scroll Bar Y Position) 滚动条的宽度(Scroll Bar Width) 滚动条的高度(Scroll Bar Height) 反转方向(Reverse Direction)

Oracle 程序包规范

Oracle 程序包规范 对于程序包,规范就像一个说明书,它说明了在程序包中哪些过程或函数可以使用,如何使用。程序包规范必需的,并且必须在程序包主体之前创建。 创建程序包规范的语法形式如下: create [or replace] package package_name is [public_variable_declarations…] [public_type_declarations…] [public_exception_declarations…] [public_cursor _declarations…] [function_declarations…] [procedure_specifications…] end [package_name] 从上面的语法规则可以看出,在程序包规范中可以包含过程、函数、变量、异常、游标和类型的声明。过程和函数的声明只包含其头部信息,而不包含过程和函数体,过程和函数体则被包含在程序包主体中。 在下面的示例中,定义了一个程序包SCOTT_EMP_PKG ,并在程序包规范中定义了一个过程UPDATE_SAL()和一个函数SELECT_NAME()。 SQL> create or replace package scott_emp_pkg is 2 procedure update_sal(deptno_param number,sal_param number);--过程 3 function select_name(empno_param number) return varchar2;--函数 4 end scott_emp_pkg; 5 / 程序包已创建。 在上面的程序包规范中没为提供任何实际的代码,只是简单定义了过程和函数的名称和参数,而过程和函数体则被排除在外。在程序包规范中仅显示了程序包中包含哪些内容,而具体的实现则包含在程序包的主体部分。 调用程序包内的过程与调用独立的过程相似,惟一的不同之处在于调用程序包内的过程时,还需要引用程序包名加以限定。如果现在试图调用SCOTT_EMP_PKG 包内的过程,则会导致如下所示的错误: SQL> declare 2 var_dno number; 3 var_eno number; 4 var_sal number; 5 var_name varchar2(20); 6 begin 7 var_dno:=10; 注 意 需要注意规范中声明的各项目(过程、函数和变量等)顺序。如果各项目之间 是无关的,那么项目之间的顺序是无关紧要的。但如果一个项目被另一个项目 引用,那么必须在程序包规范中先声明被引用的项目。

ORACLE 过程、函数、包的区别与联系

一、过程与函数区别 1.过程可以有0~N个返回参数,通过OUT or IN OUT参数返回;函数有且仅有1个返回值,通过return 语句返回。 2.调用过程时,可做为单独的语句执行;调用函数时,函数必须把返回结果赋值给一个变量。 3.在SQL语句中,可以不能调用过程;在SQL语句中,可以直接调用函数。 二、过程与函数 过程[procedure]及函数[function]这两种方案对象均由SQL 语句及PL/SQL 语言构件组合而成,存储于数据库中,运行时作为一个整体,用于解决某个问题,或完成一组相关的操作。调用者可以在调用过程及函数时为其提供参数,参数可以专用于输入值,专用于输出值,或同时用于输入及输出值。在过程与函数中,用户既可以发挥SQL 的灵活性与易用性,也能够发挥结构化编成语言的过程控制能力。过程与函数基本类似,唯一区别在于函数总会向调用者返回一个值,而过程无此特性。 三、存储过程在以下方面具有优势: 1.利用定义者权限过程[definer's rights procedure]确保数据安全 使用存储过程有助于确保数据安全。具备数据库对象访问权限的用户可以定义存储过程或函数,其他用户通过已定义的过程访问数据,从而达到限制用户对数据库操作的目的。 例如,现有一个过程能够更新某数据表,管理员不必授予用户直接访问数据表的权限,而是授予用户访问此过程的权限。当用户调用此过程时,过程以其拥有者的权限运行。具备执行此过程权限(但不具备查询,更新,及删除底层表数据权限)的用户可以调用过程对表进行操作,但不能以其他方式操作表数据。 2.通过调用者权限过程[invoker's rights procedure]使用调用者的权限及方案上下文 调用者权限过程可以继承其调用者的权限及方案上下文。即调用者权限过程不与特定的用户或方案绑定,每次执行时利用当前用户的权限操作当前用户的方案对象。应用程序开发者可以通过调用者权限过程使应用逻辑集中化,即便底层数据分散于不同的用户方案中。 例如,以经理身份登录的用户运行针对employees表的更新过程时可以修改薪水数据,而以职员身份登录的用户运行同样的的更新过程时只能修改地址数据。 3.提升性能

OraclePLSQL之子程序和包

第5章使用子程序和包 在上一章中,我们讨论了创建过程,函数和包的细节。在本章中,我们介绍这些部件的功能,存储子程序和本地子程序的区别,存储子程序与数据字典的交互方式及如何从S Q L语句中调用存储子程序。除此之外,我们还要介绍O r a c l e8i存储子程序的新增特性。 5.1 子程序位置 我们已在前几章中演示了可以存储在数据字典中的子程序和包。子程序首次是用命令 C R E A TE OR REPLACE创建的,接着,我们可以从其他P L/S Q L块中调用已创建的子程序。除此之外,子程序可以在块的声明部分定义,以这种方式定义的子程序叫做本地子程序。包则必须存储在数据字典中,而不能在本地定义存储。 5.1.1 存储子程序和数据字典 当使用命令C R E A TE OR REPLACE创建子程序时,该子程序就存储在数据字典中。除去子程序中的源文本外,该子程序是以编译后的中间代码形式存储的,这种中间代码叫做p -c o d e。中间代码中带有子程序中经计算得到的所有引用参数,子程序的源代码也被转换为P L/S Q L引擎易读的格式。当调用子程序时,就将中间代码从磁盘读入并启动执行。一旦从磁盘读入中间代码,系统就将其存储在系统全局工作区(S G A)的共享缓冲区部分,以便由多个用户同时进行访问。与缓冲区的所有内容一样,根据系统采用的最近最少使用的算法,过期的中间代码将被从共享缓冲区中清除。 中间代码类似于由3 G L语言生成的对象代码,或者类似于可由J a v a运行时使用的J a v a字节码。由于中间代码带有经计算得到的子程序中的所有对象引用(属于前联编的属性),所以,执行中间代码的效率非常高。 子程序的信息可以通过各种数据字典视图来访问。视图u s e r_o b j e c t s包括了当前用户拥有的所有对象的信息。该信息包括了对象的创建以及最后修改的时间,对象类型(表,序列,函数等)和对象的有效性。视图u s e r_s o u r c e包括了对象的源程序代码。而视图u s e r_e r r o r s则包括了编译错误信息。 请看下面的简单过程: CREATE OR REPLACE PROCEDURE Simple AS v_Counter NUMBER; BEGIN v_Counter := 7; END Simple; 创建该过程后,视图u s e r_o b j e c t s显示该过程是合法的,视图u s e r_s o u r c e则包括了该过程的源代码。由于该过程已经编译成功,所以视图u s e r_e r r o r s没有显示错误。图5 -1的窗口显示了上

Oracle包应用详解

包(Package) --一路向北 一、包的概念 PL/SQL为了满足程序模块化的需要,除了块(block)和子程序结构外,还引入了包的构造。 (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。 (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 (3)与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程序所访问。 (4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开,在这种情况下,将过程放置在一个包中,可隐蔽实现的细节。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。 (5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。如果ORACLE具有Procedure选件,包可以编译、存贮在ORACLE数据库中,其内容可为许多应用共享。 二、包的作用 包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器。将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量。 三、包定义: (1)一个包由两个分开的部分组成: (2)包定义(PACKAGE):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。 (3)包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。 ---如果在包主体中的游标或子程序没有在包并没有在包头中定义,那么这个游标或子程序是私有的。 (4)包定义和包主体分开编译,并作为两部分分开的对象存放在数据库字典中。 (包定义一定要在包主体前面,包主体可以没有,但包定义一定要有) 包定义格式: CREATE [OR REPLACE] PACKAGE package_name {IS | AS}

相关主题
文本预览
相关文档 最新文档