Orale,编写zune程序包包,此zune程序包包有两个过程和一个函数,第一个过程根据职员编号打印职员姓名

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
oracle 过程、函数、包的区别与联系
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
oracle 过程、函数、包的区别与联系
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口编写Oracle包、过程或者函数,返回结果集,并且编写另一个过程或函数接收这个结果集并且输出;谁能提供思_百度知道
编写Oracle包、过程或者函数,返回结果集,并且编写另一个过程或函数接收这个结果集并且输出;谁能提供思
最好是给程序
我有更好的答案
--&测试表数据。select&*&from&test_&&&&&&&&ID&VALUE----------&--------------------&&&&&&&&&1&ONE&&&&&&&&&3&THREE&&&&&&&&&2&TWO--&返回结果集的函数.CREATE&OR&REPLACE&FUNCTION&Get_Test_Main_AllRETURN&SYS_REFCURSORIS&&return_cursor&SYS_REFCURSOR;BEGIN&&OPEN&return_cursor&FOR&'SELECT&*&FROM&test_main';&&RETURN&return_END;/--&普通的查询,来查看结果.SELECT&Get_Test_Main_All()&FROM&GET_TEST_MAIN_ALL()--------------------CURSOR&STATEMENT&:&1CURSOR&STATEMENT&:&1&&&&&&&&ID&VALUE----------&--------------------&&&&&&&&&1&ONE&&&&&&&&&3&THREE&&&&&&&&&2&TWO--&存储过程调用,&来获取结果.DECLARE&&&--&调用函数的返回值.&&testCursor&SYS_REFCURSOR;&&--&存储单行数据.&&testRec&&test_main%ROWTYPE;BEGIN&&--&调用返回结果集的函数.&&testCursor&:=&Get_Test_Main_All();&&--&循环,遍历结果.&&LOOP&&&&--&游标向前.&&&&FETCH&testCursor&INTO&testR&&&&--&无数据的情况下,退出循环. EXIT&WHEN&testCursor%NOTFOUND;&&&&--&输出调试信息.&&&&dbms_output.put_line(&TO_CHAR(testRec.id)&||&'&'&||&testRec.value);&&END&LOOP;END;/1&ONE3&THREE2&TWOPL/SQL&过程已成功完成。
如果要返回多个值,可考虑用存储过程实现
先编写一个函数返回结果集,再另外编写一个过程调用此函数并返回就好了。
我根据网上提供的办法,返回结果集了,请问另一个过程调用怎么实现呢,不会啊,最好给个例子,谢谢啊
为您推荐:
其他类似问题
oracle的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&&&1.2 参数传递Oracle stored procedure的参数有3种类型如下:参数类型&&&&&&&&&&
说明IN&&&&&&&&&&&&&&&&&&&&&& 定义1个输入参数变量,用于传递参数给stored procedureOUT&&&&&&&&&&&&&&&&&&& 定义1个输出参数变量,用于从stored procedure中获取数据IN OUT&&&&&&&&&&&&&& 定义1个输入输出参数,同上拥有以上两个功能。用法如下:&&&&& PM_name IN DATA_type DEFAULT default_value;&&&&&& 定义1个输入参数变量,用于传递参数给stored procedure.在调用sp时,主程序的实际参数可以是常量,有值变量或表达式等。Default关键字为可选项,用来设定参数的默认值。如果在调用stored procedure时不指明参数,则该参数变量取默认值。 在存储过程中,输入变量用于接受主程序传递的值,但不能对其进行赋值。&&&&& PM_name OUT DATA_type;&&&&&& 定义1个输出参数变量,用于从stored procedure中获取数据,即变量从存储过程中返回值给程序。&&&&&& 在调用sp时,主程序传给sp的输出参数只能是1个变量,不能是常量或者表达式。 在sp中,参数变量只能被赋值,而不能将其的值赋予其他对象,在sp中必须给输出变量赋值1次。&&&&&&& PM_name IN OUT DATA_type DEFAULT default_value;&&&&&&& 定义1个输入输出变量,同时具有以上功能。在调用sp时,主程序传给sp的实际参数只能是变量,而不能是常量或表达式。Default关键字同样是可选项,用来设定参数的默认值。 在sp内,变量接受主程序传递的值,同时可以参加赋值运算,也可以对其赋值。在sp内至少对其赋值 一次。&如果省略IN,OUT 或 IN OUT关键字,则默认是IN.例3:编写1个给员工增加工资的stored procedure CHANGE_SALARY& 通过对IN类型的参数传递 要增加工资的雇员编号和增加的工资额。步骤1: 编写sp如下图:&步骤2: 执行sp如下图可以见到7788的工资由3000 变成3020参数传递的个数和顺序应该与定义的一致,如果顺序不一致也可以采用如下方法:EXECUTE USP_CHANGE_SALARY(p_raise=&20, p_empno=&7788);&例4:使用OUT类型参数返回stored procedure的结果。步骤1: 分别编写两个sp, 其中USP_GET_EMP_COUNT通过使用OUT类型参数,将值传给另1个sp USP_SHOW_EMP_COUNT.&&步骤2:执行sp&说明: 在存储过程中定义了OUT类型的参数P_TOTAL, 在主程序调用该存储过程时,传递了参数v_empcount. 在存储过程的select .. into ...语句中对p_total进行赋值。赋值结果有v_empcount变量带回给主程序显示。例5: 使用IN OUT类型的参数,给电话号码增加区码。步骤1:编写并编译如下存储过程:&步骤2:输入以下命令执行该存储过程:&可以见到下面输出了加了区号的电话号码。注1: Oracle 语句不区分大小写注2 :赋值语句请用:=&&& 而不能用=.1.3 创建和删除存储函数&&&&& 创建函数,需要CREATE PROCEDURE 或 CREATE ANY PROCEDURE的系统权限。&&&&& CREATE [OR REPLACE] FUNCTION func_name[(para_name para_type...)]&&&&& RETURN Data_type&&&&& IS&&&& & & && [declare part]&&&&& Begin&&&&&&&&&&& main part&&&&&&&&&&& RETURN (expression)&&&&& [EXCEPTION&&&&&&&&&&&&& errors handle part]&&&&& END [func_name];&&&&&& 其中,参数是可选的,但是只能是IN类型(IN关键字一般被忽略)。&&&&&& 在定义部分的RETURN 数据类型,用来表示函数的数据类型,也就是返回值的数据类型,不可忽略。&&&&&& 在可执行部分的Return(表达式),用来生成函数的返回值,其表达式的类型必须跟定义部分说明的函数类型一致。在函数的执行部分可以有多个Return语句,但只有1个会被执行,一旦执行了return语句,则函数结束并返回调用环境。&&&&&& 一个存储函数在不需要时可以换删除,但删除的人应该是函数的创建者或者是拥有DROP ANY PROCEDURE系统权限的人,其语法如下:& & && & & && DROP FUNCTION func_&&&&&&& 重新编译一个存储函数时,编译的人应该是函数的创建者或者拥有ALTER ANY PROCEDURE系统权限的人,重新编译一个存储函数的语法如下:&&&&&&& ALTER PROCEDURE func_name COMPILE;&&&&&&&& 函数的调用者应该是函数的创建者或者拥有EXECUTE ANY PROCEDURE系统权限的人,或者是被函数的拥有者授予了函数执行权限的用户,函数的引用和存储过程不同,函数需要出现在程序体重,可以参加表达式的运算和单独出现在表达式中,其形式如下:&&&&& &&&&&&&& Varible_name := func_name(para...);例6:&&&&&&& 创建1个通过雇员编号返回雇员名称的函数GET_EMP_NAME.&&&&&&& 步骤1:&&&&&&&&&&&&&&&&& 编写并编译如下存储过程&&&&&& 步骤2: 测试:会见到如果输入的数据在数据库不存在, 函数会捕捉错误信息。1.5 存储过程和函数的查看&&&&&& 可以通过对数据字典的访问来查询存储过程或函数的有关信息,如果要查询当前用户的存储过程或函数的源代码,可以通过对USER_SOURCE数据字典视图查询得到。USER_SOURCE的结构如下:说明: 里面按行存放着过程或函数的脚步,name 是名字, Type表示类型(SP or function),line是行号,Text为对应行的脚本。&例7: 查询过程USP_EMPCOUNT的代码。&例8: 查询函数GET_EMP_NAME的参数&例9: 查询USP_EMP_LIST 存储过程是否可用&说明: 这里要从视图user_objects里查询,VALID表示该存储过程有效(即是通过了编译),INVALID表示无效或未通过编译。当Oracle调用1个无效的存储过程或函数时,首先试图对其进行编译,如果编译成功则将状态status设置成valid并执行,否则给出错误信息。&&&&& 当1个存储过程编译成功,状态变成valid,会不会在某些情况下变成invalid呢,结论是完成可能的,比如1个存储过程里面哟你道的1张表被update或删除了。存储过过程就会变成无效invalid,所以要注意存储过程和函数与其他对象的依赖关系。&&&&& 如果要检查stored procs和function的依赖性,可以通过查询数据字典USER_DEPENDENCIES来确定,& & & 该视图结构如下: &&& &&&&&&& 说明:&&&&&&&&& Name为对象名,&&&&&&&&& Type为对象类型,&&&&&&&&& referenced_owner 为涉及到的(被依赖的)对象的拥有者账户,&&&&&&&&& referenced_name&& 被依赖的对象名&&&&&&&&& referenced_type&&& 被依赖的对象的类型&&&&&&&&& 参考下图:&&&&&&&&&&& 还有一种情况需要注意,如果1个用户A被授予执行属于用户B的一个存储过程,在用户B的存储过后层访问到用户C的表,用户B被授予访问用户C表的权限,但用户A没有授予访问用户C的表的权限,那么用户A调用用户B的存储过程是失败的还是成功的呢?答案是成功的,可以自己实际测试下。2.包 (Package)2.1 包的概念和组成&&&&&&&&& 包是用来存储相关程序结构的对象,他存储与数据字典中,包由两个分离的部分组成,包头(Package)和包体(Package body).包头是包的说明部分, 是对外的操作接口,对应用是可见的,包体是包的代码的实验部分,对应用来说是不可见的黑盒。2.2 包中包含的程序结构&&&&&&&&&&&& 包中可以包含的程序结构如下面这张表所示。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 包中包含的程序结构&&&&&&&&&&&&& 程序结构&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 说明&&&&&&&&&&&&& 过程(Procedure)&&&&&&&&&&&&&&&&&&& 带参数的命名的程序模块&&&&&&&&&&&&& 函数(Function)&&&&&&&&&&&&&&&&&&&&& 带参数,具有返回值的命名程序模块&&&&&&&&&&&&& 变量(Variable)&&&&&&&&&&&&&&&&&&&&&& 存储变化的量的存储单元&&&&&&&&&&&&& 常量(Constant)&&&&&&&&&&&&&&&&&&&&& 存储不变的量的存储单元&&&&&&&&&&&&& 游标(Cursor)&&&&&&&&&&&&&&&&&&&&&&&&& 用户定义的数据操作缓存去,可以在执行部分使用。&&&&&&&&&&&&& 类型(Type)&&&&&&&&&&&&&&&&&&&&&&&&&&& 用户定义的新的结构类型&&&&&&&&&&&&& 异常(Exception)&&&&&&&&&&&&&&&&&&&& 在标准包中定义或由用户自定义,用户处理程序错误。&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& 2.3 包中元素的性质&&&
说明部分可以出现在包的三个不同部分,出现在包头中的称为共有元素,出现在包体中的称为私有元素,出现在包体的过程或函数中的称为局部变量。 他们的性质有所不同,如下表中表示&&&&&&&&&&& &&&&&&&&&& 在包体中出现的过程或函数,如果需要对外公用,就必须在包头中说明,包头中的说明应该和包体中的说明一致。&&&&&&&&& 包有以下优点:&&&&&&&&& * 包可以方便地将存储过程和函数组织到一起,每个包又是相互独立的. 在不同的包中,过程,函数都可以重名,这解决了同1个用户环境中命名的冲突问题&&&&&&&&&& *包增强了对存储过程和函数的安全管理,对整个包的访问权只需要一次授予.&&&&&&&&&& *在同1个会话中,公用变量的值将被保留,知道会话结束.&&&&&&&&&& * 区分了共有过程和私有过程,包的私有过程增强了过程和函数的保密性.&&&&&&&&&&& * 包在被首次调用时,就作为1个整体被全部调入内存,减少了多次访问过程或函数的I/O次数.2.4 创建包和包体&&&&&&&&&& &&&&&&&&&&& 包由包头和包体两部分组成, 包的创建应该先创建包头部分, 然后再创建包体部分. 创建, 删除和编译包的权限同创建,删除和编译存储过程的权限相同.创建包头命令如下:CREATE [OR REPLACE] PACKAGE PK_NAMEIS共有变量定义共有类型定义共有游标定义共有异常定义函数说明过程说明END;&&&&&&&&&&&&&&&&&&&&& 创建包体命令如下:CREATE [OR REPLACE] PACKAGE BODY PK_NAMEIS私有变量定义私有类型定义私有游标定义私有异常定义函数定义过程定义END;& 删除包头:Drop Package PKNAME删除包头:Drop Package body PKNAME重新编译包头:Alter Package PKNAME COMPILE PACKAGE&重新编译包体:Alter Package PKNAME COMPILE PACKAGE BODY在包头说明的对象可以在包外调用,调用的方法和调用单独的过程或函数方法基本相同, 唯一的区别就是要在调用的过程或函数名子前加上包的名字(中间要用".")分隔.& 但要注意.不同的session将单独对包的公用变量进行初始化,所以不同的session会对包的调用属于不同的应用.2.5 系统包&&&&&& Oracle预定义了很多标准的系统包, 这些包可以在应用中直接使用,比如在例子中我们使用的DBMS_OUTPUT包,就是其中1个系统包,而PUT_LINE是该包的一个函数. 常用的系统包如下面表所示:&2.6 包的应用&&&&& 在sql*plus环境下,包和包体可以分别编译,也可以一齐编译. 如果分别编译,则要先编译包头,再编译包体,如果一齐编译,则包头写在前,包体在后,中间用"/"分隔.&&&&& 可以将已经存在的SP或function添加到包中,犯法是去掉过程或函数的创建语句CREATE OR REPLACE部分, 将存储过程或函数复制到包体中,然后重新编译即可.&&&&&& 如果需要将私有过程或函数变成共有过程或函数的话, 将过程或函数说明部分复制到到包头说明部分,然后重新编译就可以了.&&&&&&& &&&&&&& 例10: 创建管理雇员信息的包PAK_EMP, 它具有从EMP表获得雇员信息,修改雇员名称,修改雇员工资和写回EMP表的功能.步骤1:编写如下代码并编译.包头部分:包体部分:声明部分及 SHOW_DETAIL:&&GET_EMP:SAVE_EMP:&CHANGE NAME及 CHANGE_SAL:&步骤2:获取雇员7788的信息:&步骤3: 显示雇员信息:步骤4: 修改雇员工资: &注意此时 修改是变量emp_row 也就是员工7788的工资.而且未写入数据库.步骤5: 将雇员信息写入emp表:&说明: row_emp作为包PAK_EMP的私有变量,只能被包里面的对象所访问.&
阅读(...) 评论()博客访问: 521183
博文数量: 111
博客积分: 4135
博客等级: 上校
技术积分: 1167
注册时间:
分类: Oracle 15:27:30
过程,函数,程序包
之前学习的PL/SQL块是匿名的,不能将其存储到数据库中。我们可以命名我们的PL/SQL块,并为他们确定参数,存储在数据库中。这样可以从任何数据库客户端或者工具引用和运行他们,比如SQL*PLUS, Pro*C, JDBC。这些命名的PL/SQL块成为存储过程和函数,他们的集合成为程序包。
优点:1.&可重用性:一旦命名并保存在数据库中后,任何应用都可以2.&抽象和数据隐藏3.&安全性
过程存储过程就是命了名的PL/SQL块,可以被赋予参数,存储在数据库中,然后由另一个应用或者PL/SQL例程调用。比如CREATE PROCEDURE my_proc as BEGIN&NULL;END;/
语法:CREATE [OR REPLACE] PROCEDURE procedure_name (参数)IS | AS[PRAGMA AUTONOMOUS_TRANACTION;]& --声明自主事务处理。[本地变量声明]BEGIN&执行语句部分[EXCEPTION]&错误处理部分END[name];/
CREATE OR REPLACE PROCEDURE my_proc as &&-- OR REPLACEBEGIN&Dbms_output.put_line(‘Hello, world’);END;/
执行存储过程set serveroutput onbegin&my_proc/
直接执行:execute my_procexec my_proc
权限:表和视图具有SELECT, INSERT, UPDATE, DELETE 这样的特权,而过程具有EXECUTE特权。只有将EXECUTE 特权赋予用户,用户才可以运行它。而将它赋予PUBLIC用户,则所有用户都可以运行。
[试验]创建3个用户conn donny/donnycreate user chris此时不能连结数据库,不能创建过程
grant connect,create user seagrant connect,create user margrant connect,
使用mark建立一个过程conn mark/mark create procedure marks_proc as begin&/
尝试使用chris用户执行这个过程:conn chris/chrisexec mark.marks.proc
授权:conn mark/mark grant execute on marks_proc to chris
conn chris/chrisexec mark.marks_proc
尝试使用sean用户执行这个过程:conn sean/seanexec mark.marks.proc
将execute 授予public用户,使得所有用户都可以执行这个过程conn mark/markgrant execute on marks_
conn sean/seanexec mark.marks.proc
参数:过程可以进行参数化处理,可以为任何合法的PL/SQL类型,有三种模式:IN, OUT, IN OUT
IN 参数通过调用者传入,只能由过程读取,不能改变。是默认的模式,可以具有默认值。OUT 参数有过程写入。用于过程需要向调用者返回多条信息的时候。不能是具有默认值的变量,也不能是常量,必须向OUT参数传递返回值。IN OUT 具有两者的特性,可以读取和写入。
IN参数:Create table t(n number);
Create or replace procedure insert_into_t (p in number ) isbegin&insert into t values(p);end insert_into_t;/
这个时候并没有执行该过程,尝试执行select *exec insert_into_t (p=> 100);select *
例子2Create table t(n number,p varchar2(20));
Create or replace procedure insert_into_t (p1 in number, p2 in number) isbegin&insert into t values(p1,’p1’);&insert into t values(p2,’p2’);end insert_into_t;/
这个时候并没有执行该过程,尝试执行select *exec insert_into_t (p1=> 100, p2=>200);select *
参数传递方法:1.&使用名称表示exec insert_into_t (p2=> 101, p1=>201);
2.&使用位置表示exec insert_into_t (102, 202);
3.&使用混合表示适用于有默认值的情况,注意:OUT 和 IN OUT 参数不能有默认值CREATE OR REPLACE procedure default_values(&P1 varchar2,&P2 varchar2 default ‘Chris’,&P3 varchar2 default ‘Sean’) asBegin&Dbms_output.put_line(p1);&Dbms_output.put_line(p2);&Dbms_output.put_line(p3);End default_/
只想传入1,3参数:set serveroutput onexec default_values(‘Tom’, p3=>’Joel’);
OUT 参数:从过程向调用者返回值:例子:使用scott.emp表,编写搜索过程,输入empno,返回ename , sal分析:desc scott.emp参数:一个in, 两个out参数类型:in number, out emp.ename%type , out emp.sal%type
con scott/tiger
create or replaceprocedure emp_lookup(&p_empno in number,&o_ename out emp.ename%type , o_sal &out emp.sal%type) asbegin&select ename, sal &&into o_ename, o_sal&from emp&where empno= p_exception&when NO_DATA_FOUND then&&o_ename := ‘null’;&&o_sal := -1;/
执行该过程:1.&使用匿名PL/SQL分析:目的是输出两个out参数的结果,所以匿名块中也要定义2个与out参数相同的局域变量。
set serveroutput on
declare&l_ename emp.ename%&l_sal &emp.sal%begin&emp_lookup(7782, l_ename, l_sal);&dbms_output.put_line(‘Ename = ‘ || l_ename);&dbms_output.put_line(‘Sal = ‘ || l_sal);/
2.&在sql plus 中执行分析:需要使用sql plus 的VARIABLE命令绑定参数值,即为OUT参数提供接受返回值的变量。
Variable name varchar2(10);V
Exec emp_lookup(‘7782’, :name, :sal);PPSelect :name, :
IN OUT 参数:可以用来传入参数,并从存储过程返回值。
例子:输入两个数,交换值思路:通过一个临时变量作为交换过程中的过渡create or replace procedure swap(&p1 in out number,&p2 in out number ) asl_&&--局域变量的声明,相当于匿名块中declare之后的声明;过程:as~beginbegin&&l_temp := p1;&p1 := p2;&p2 := l_/
set serveroutput ondeclare&l1 number:=100;&l2 number:=200;begin&swap(l1,l2);&dbms_output.put_line(‘l1 = ‘|| l1);&dbms_output.put_line(‘l2 = ‘|| l2);/
关于自主事务处理: P197我们曾经讨论过COMMIT 和 ROLLBACK的概念。
建立过程P2:CREATE OR REPLACE PROCEDURE P2 AS &A varchar2(50);Begin&Select venadd1 into a from vendor_master where vencode=’V002’;&Dbms_output.put_line(a);&ROLLBACK;END;/
建立过程P1,调用P2:CREATE OR REPLACE PROCEDURE P1 AS &B varchar2(50);Begin&Update vendor_master set venadd1=’10 Walls Street ‘ where vencode=’V002’;&P2();&Select venadd1 into b from vendor_master where vencode=’V002’;&Dbms_output.put_line(b);&ROLLBACK;END;/
exec p1说明事务处理可以跨越过程继续执行。
为了防止一个过程影响其他过程,可以将其标记为自主的。这样p2中的rollback将不会影响p1
CREATE OR REPLACE PROCEDURE P2 AS &A varchar2(50);PRAGMA AUTONOMOUS_TRANSACTION;Begin&Select venadd1 into a from vendor_master where vencode=’V002’;&Dbms_output.put_line(a);&ROLLBACK;END;/
函数:与过程相似,遵循了相同的规则。参数传递:只能带有in参数,不能使用out, in out 参数函数的主要特性是必须返回一个值。
语法:CREATE [OR REPLACE] FUNCTION function_name (参数) RETURN datatypeIS | AS[PRAGMA AUTONOMOUS_TRANACTION;]& --声明自主事务处理。[本地变量声明]BEGIN&执行语句部分[EXCEPTION]&错误处理部分END[name];/
返回值:定义函数的时候必须使用RETURN datatype 子句,表示函数要返回的数据类型。在函数体中的任何地方,都可以使用 RETURN 返回值,类型要和定义中的相同。
CREATE OR REPLACE FUNCTION my_funcRETURN varchar2As Begin&Return ‘HELLO, WORLD’;END;/
调用函数:用户必须要获取返回值,所以调用时,要声明一个局域变量:set serveroutput ondeclare&l_str varchar2(100) :=begin&l_str := my_&dbms_output.put_line(l_str);/
也可以将函数用作其他过程以及函数的IN参数。Create or replace Procedure show_it(p varchar2) as Begin&Dbms_output.put_line(p);E/
exec show_it(my_func);
练习:编写一个函数ITE,实现:boolean expression ? true_value: false_value输入一个表达式expression, IF正确,THEN输出true_value;ELSE,输出false_value分析:3个in 参数,一个boolean, 2个varchar2
create or replace function ite(&p_expression Boolean,&p_true varchar2,&p_false varchar2)return varchar2 asbegin&if p_expression then&&return p_&&return p_/
exec dbms_output.put_line(ite(1=2, ‘Equal’,’Not equal’));
程序包:是对PL/SQL类型,过程,函数,游标,异常,变量,常量的封装。包括两部分:规范和主体规范:是程序包的公共接口,主体:规范的实现,以及私有例程、数据和变量。
语法:CREATE OR REPLACE PACKAGE package_nameIS | AS&公用类型或变量常量的声明;&公用过程或函数的声明;END package_/
CREATE OR REPLACE PACKAGE BODY package_nameIS | AS&私有类型或变量常量的声明;&公用过程或函数的实现;END package_name
规范:规范是程序包的接口,规范中定义的所有内容都可以由调用者使用(当然需要具有EXECUTE特权),比如规范中定义的过程函数可以被执行,类型可以被访问,变量可以被引用。例子:使用两个过程PRINT_ENAME() 和PRINT_SAL(),定义称为EMPLOYEE_PKG的程序包。
CREATE OR REPLACEPACKAGE employee_pkg as&Procedure print_ename(p_empno number);&Procedure print_sal(p_empno number);E/
并没有为过程提供代码,只是定义了名称和参数。
这个时候如果试图使用这个包,会报错exec employee_pkg.print_ename(1234);
主体:程序包是过程,函数的具体实现部分,实现规范中定义的接口。
CREATE OR REPLACEPACKAGE BODY employee_pkg as
&Procedure print_ename(p_empno number) is&&L_ename emp.ename%&Begin&&Select ename into l_ename from emp where empno=p_&&Dbms_output.put_line(l_ename);&Exception&&When no_data_found then&&&Dbms_output.put_line(‘Invalid employee number’);&End print_
&Procedure print_sal(p_empno number) is&&L_sal emp.sal%&Begin&&Select sal into l_sal from emp where empno=p_&&Dbms_output.put_line(l_sal);&Exception&&When NO_DATA_FOUND then&&&Dbms_output.put_line(‘Invalid employee number’);&End print_End employee_/
执行:set serveroutput onexec employee_pkg.print_ename(1234);exec employee_pkg.print_ename(7782);exec employee_pkg.print_sal(7782);
过程和函数的重载:
在单独的程序包中定义的共享相同名称的两个或者多个过程和函数。单独的过程和函数必须具有唯一的名称,但是程序包中可以有条件的共享相同的名称。条件:参数列表在数量、次序或者参数类型上有所区别,比如procedure foo(p1 varchar2);procedure foo(p1 number);
procedure foo(p1 varchar2, p2 number);procedure foo(p1 varchar2, p2 varchar2);
但是:只在参数名称、输入输出模式、或者返回类型上不同,是不够的。比如procedure foo(p1 varchar2);procedure foo(p2 varchar2);
procedure foo(p1 in varchar2);procedure foo(p1 in out varchar2);
例如desc dbms_output
试验:重载SWAP()之前的例子:create or replace procedure swap(&p1 in out number,&p2 in out number ) as---l_&&begin&&l_temp := p1;&p1 := p2;&p2 := l_/
该例子只能实现交换数值,我们将其包装,并进行重载,使其也可以交换varchar2 和 date
(1)&建立规范create or replace package utilities as&procedure swap(p1 in out number,&p2 in out number);&procedure swap(p1 in out varchar2,p2 in out varchar2);&procedure swap(p1 in out date,p2 in out date);/
(2)&建立主体create or replace package body utilities as
procedure swap(p1 in out number,&p2 in out number ) asl_&&begin&&dbms_output.put_line(‘Swapping number’);&l_temp := p1;&p1 := p2;&p2 := l_&procedure swap(p1 in out varchar2,p2 in out varchar2) asl_temp varchar2(32767);&&begin&&dbms_output.put_line(‘Swapping varchar2’);&l_temp := p1;&p1 := p2;&p2 := l_&procedure swap(p1 in out date,p2 in out date) asl_&&begin&&dbms_output.put_line(‘Swapping date’);&l_temp := p1;&p1 := p2;&p2 := l_&/
(3)&测试结果:set serveroutput ondeclare&l_num1 number :=1;&l_num2 number :=2;&l_date1 date:=&l_date2 date:= sysdate +1;begin&utilities.swap(l_num1,l_num2);&dbms_output.put_line(‘l_num1=’|| l_num1);&dbms_output.put_line(‘l_num2=’|| l_num2);
&utilities.swap(l_date1,l_date2);&dbms_output.put_line(‘l_date1=’|| l_date1);&dbms_output.put_line(‘l_date2=’|| l_date2);/
程序包中的游标:在PL/SQL块中,return 子句是游标的可选部分。在规范中声明游标的时候,必须存在与游标关联的return 子句,表示从游标获取的数据元素类型。并且游标的select 子句只出现在主体中,不出现在规范中。
Create or replace package cur_pack is&Cursor ord_cur return order_master%&Procedure ord_pro (orno varchar2);E/
Create or replace package body cur_pack is&Cursor ord_cur return order_master%rowtype is&&Select * from order_
&Procedure ord_pro (orno varchar2) is&&Or_rec order_master%&Begin&&Open ord_&&Loop&&&Fetch ord_cur into or_&&&Exit when ord_cur%&&&Dbms_output.put_line(‘Return ’|| or_rec.orderno);&&E&End ord_
PRAGMA RESTRICT REFERENCES P206限定函数的纯度级别
P197WNDS:&write no data statusRNDS: &read no data statusWNPS: &write no package statusRNPS: &read no package status
Create or replace package pack_me is&Procedure order_proc(orno varchar2);&Function order_fun (ornos varchar2) return varchar2;&Pragma restrict_references(order_fun, WNDS,RNDS);END;/
数据字典:select object_name, object_type&from user_objects&where object_type in (‘PROCEDURE’,’FUNCTION’,’PACKAGE’,’PACKAGE BODY’);
查看用户代码:desc user_source
select text from user_source where name=’INSERT_INTO_T’
desc employee_pkg
包装工具:将utilities包的主体部分保存在utilities.sql文件中,通过wrap工具加密,只生成oracle认识的格式,保护智力成果
wrap iname=utilities.sql生成utilities.plb
规范部分:create or replace package utilities as&procedure swap(p1 in out number,&p2 in out number);&procedure swap(p1 in out varchar2,p2 in out varchar2);&procedure swap(p1 in out date,p2 in out date);/
select text from user_source where name='UTILITIES';
阅读(2709) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 zune程序包 的文章

 

随机推荐