Oracle概念 过程函数程序包文档格式.docx

上传人:b****5 文档编号:18614044 上传时间:2022-12-29 格式:DOCX 页数:18 大小:20.40KB
下载 相关 举报
Oracle概念 过程函数程序包文档格式.docx_第1页
第1页 / 共18页
Oracle概念 过程函数程序包文档格式.docx_第2页
第2页 / 共18页
Oracle概念 过程函数程序包文档格式.docx_第3页
第3页 / 共18页
Oracle概念 过程函数程序包文档格式.docx_第4页
第4页 / 共18页
Oracle概念 过程函数程序包文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Oracle概念 过程函数程序包文档格式.docx

《Oracle概念 过程函数程序包文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle概念 过程函数程序包文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

Oracle概念 过程函数程序包文档格式.docx

  直接执行:

  executemy_proc

  execmy_proc

  权限:

  表和视图具有SELECT,INSERT,UPDATE,DELETE这样的特权,而过程具有EXECUTE特权。

只有将EXECUTE特权赋予用户,用户才可以运行它。

而将它赋予PUBLIC用户,则所有用户都可以运行。

  [试验]

  创建3个用户

  conndonny/donny

  createuserchrisidentifiedbychris;

  此时不能连结数据库,不能创建过程

  grantconnect,resourcetochris;

  createuserseanidentifiedbysean;

  grantconnect,resourcetosean;

  createusermarkidentifiedbymark;

  grantconnect,resourcetomark;

  使用mark建立一个过程

  connmark/mark

  createproceduremarks_procas

  null;

  尝试使用chris用户执行这个过程:

  connchris/chris

  execmark.marks.proc

  授权:

  grantexecuteonmarks_proctochris

  execmark.marks_proc

  尝试使用sean用户执行这个过程:

  connsean/sean

  将execute授予public用户,使得所有用户都可以执行这个过程

  grantexecuteonmarks_proctopublic;

  参数:

  过程可以进行参数化处理,可以为任何合法的PL/SQL类型,有三种模式:

IN,OUT,INOUT

  IN参数通过调用者传入,只能由过程读取,不能改变。

是默认的模式,可以具有默认值。

  OUT参数有过程写入。

用于过程需要向调用者返回多条信息的时候。

不能是具有默认值的变量,也不能是常量,必须向OUT参数传递返回值。

  INOUT具有两者的特性,可以读取和写入。

  IN参数:

  Createtablet(nnumber);

  Createorreplace

  procedureinsert_into_t(pinnumber)is

  insertintotvalues(p);

  endinsert_into_t;

  这个时候并没有执行该过程,尝试执行

  select*fromt;

  execinsert_into_t(p=>

100);

  例子2

  droptablet;

  Createtablet

  (nnumber,

  pvarchar2(20));

  procedureinsert_into_t(

  p1innumber,

  p2innumber)is

  insertintotvalues(p1,’p1’);

  insertintotvalues(p2,’p2’);

  execinsert_into_t(p1=>

100,p2=>

200);

  参数传递方法:

  1.使用名称表示

  execinsert_into_t(p2=>

101,p1=>

201);

  2.使用位置表示

  execinsert_into_t(102,202);

  3.使用混合表示

  适用于有默认值的情况,注意:

OUT和INOUT参数不能有默认值

  CREATEORREPLACEproceduredefault_values(

  P1varchar2,

  P2varchar2default‘Chris’,

  P3varchar2default‘Sean’)as

  Begin

  Dbms_output.put_line(p1);

  Dbms_output.put_line(p2);

  Dbms_output.put_line(p3);

  Enddefault_values;

  只想传入1,3参数:

  execdefault_values(‘Tom’,p3=>

’Joel’);

  OUT参数:

  从过程向调用者返回值:

  例子:

使用scott.emp表,编写搜索过程,输入empno,返回ename,sal

  分析:

  descscott.emp

一个in,两个out

  参数类型:

innumber,outemp.ename%type,outemp.sal%type

  conscott/tiger

  createorreplace

  procedureemp_lookup(

  p_empnoinnumber,

  o_enameoutemp.ename%type,

  o_saloutemp.sal%type)as

  selectename,sal

  intoo_ename,o_sal

  fromemp

  whereempno=p_empno;

  exception

  whenNO_DATA_FOUNDthen

  o_ename:

=‘null’;

  o_sal:

=-1;

  执行该过程:

  1.使用匿名PL/SQL

目的是输出两个out参数的结果,所以匿名块中也要定义2个与out参数相同的局域变量。

  declare

  l_enameemp.ename%type;

  l_salemp.sal%type;

  emp_lookup(7782,l_ename,l_sal);

  dbms_output.put_line(‘Ename=‘||l_ename);

  dbms_output.put_line(‘Sal=‘||l_sal);

  2.在sqlplus中执行

需要使用sqlplus的VARIABLE命令绑定参数值,即为OUT参数提供接受返回值的变量。

  Variablenamevarchar2(10);

  Variablesalnumber;

  Execemp_lookup(‘7782’,:

name,:

sal);

  Printname;

  Printsal;

  Select:

salfromdual;

  INOUT参数:

  可以用来传入参数,并从存储过程返回值。

输入两个数,交换值

  思路:

通过一个临时变量作为交换过程中的过渡

  procedureswap(

  p1inoutnumber,

  p2inoutnumber)as

  l_tempnumber;

--局域变量的声明,相当于匿名块中declare之后的声明;

过程:

as~begin

  l_temp:

=p1;

  p1:

=p2;

  p2:

=l_temp;

  endswap;

  l1number:

=100;

  l2number:

=200;

  swap(l1,l2);

  dbms_output.put_line(‘l1=‘||l1);

  dbms_output.put_line(‘l2=‘||l2);

  关于自主事务处理:

P197

  我们曾经讨论过COMMIT和ROLLBACK的概念。

  建立过程P2:

  CREATEORREPLACEPROCEDUREP2AS

  Avarchar2(50);

  Selectvenadd1intoafromvendor_masterwherevencode=’V002’;

  Dbms_output.put_line(a);

  ROLLBACK;

  建立过程P1,调用P2:

  CREATEORREPLACEPROCEDUREP1AS

  Bvarchar2(50);

  Updatevendor_mastersetvenadd1=’10WallsStreet‘wherevencode=’V002’;

  P2();

  Selectvenadd1intobfromvendor_masterwherevencode=’V002’;

  Dbms_output.put_line(b);

  execp1

  说明事务处理可以跨越过程继续执行。

  为了防止一个过程影响其他过程,可以将其标记为自主的。

这样p2中的rollback将不会影响p1

  PRAGMAAUTONOMOUS_TRANSACTION;

  EXECP1;

函数:

  与过程相似,遵循了相同的规则。

  参数传递:

只能带有in参数,不能使用out,inout参数

  函数的主要特性是必须返回一个值。

  CREATE[ORREPLACE]FUNCTIONfunction_name(参数)

  RETURNdatatype

  返回值:

  定义函数的时候必须使用RETURNdatatype子句,表示函数要返回的数据类型。

  在函数体中的任何地方,都可以使用RETURN<

表达式>

返回值,类型要和定义中的相同。

  CREATEORREPLACE

  FUNCTIONmy_func

  RETURNvarchar2

  As

  Return‘HELLO,WORLD’;

  调用函数:

  用户必须要获取返回值,所以调用时,要声明一个局域变量:

  l_strvarchar2(100):

=null;

  l_str:

=my_func;

  dbms_output.put_line(l_str);

  也可以将函数用作其他过程以及函数的IN参数。

  Procedureshow_it(pvarchar2)as

  Dbms_output.put_line(p);

  End;

  execshow_it(my_func);

  练习:

  编写一个函数ITE,实现:

booleanexpression?

true_value:

false_value

  输入一个表达式expression,IF正确,THEN输出true_value;

ELSE,输出false_value

3个in参数,一个boolean,2个varchar2

  functionite(

  p_expressionBoolean,

  p_truevarchar2,

  p_falsevarchar2)

  returnvarchar2

  as

  ifp_expressionthen

  returnp_true;

  endif;

  returnp_false;

  execdbms_output.put_line(ite(1=2,‘Equal’,’Notequal’));

程序包:

  是对PL/SQL类型,过程,函数,游标,异常,变量,常量的封装。

  包括两部分:

规范和主体

  规范:

是程序包的公共接口,

  主体:

规范的实现,以及私有例程、数据和变量。

  CREATEORREPLACEPACKAGEpackage_name

  公用类型或变量常量的声明;

  公用过程或函数的声明;

  ENDpackage_name;

  CREATEORREPLACEPACKAGEBODYpackage_name

  私有类型或变量常量的声明;

  公用过程或函数的实现;

  ENDpackage_name

  规范是程序包的接口,规范中定义的所有内容都可以由调用者使用(当然需要具有EXECUTE特权),比如规范中定义的过程函数可以被执行,类型可以被访问,变量可以被引用。

使用两个过程PRINT_ENAME()和PRINT_SAL(),定义称为EMPLOYEE_PKG的程序包。

  PACKAGEemployee_pkgas

  Procedureprint_ename(p_empnonumber);

  Procedureprint_sal(p_empnonumber);

  并没有为过程提供代码,只是定义了名称和参数。

  这个时候如果试图使用这个包,会报错

  execemployee_pkg.print_ename(1234);

  程序包是过程,函数的具体实现部分,实现规范中定义的接口。

  PACKAGEBODYemployee_pkgas

  Procedureprint_ename(p_empnonumber)is

  L_enameemp.ename%type;

  Selectenameintol_enamefromempwhereempno=p_empno;

  Dbms_output.put_line(l_ename);

  Exception

  Whenno_data_foundthen

  Dbms_output.put_line(‘Invalidemployeenumber’);

  Endprint_ename;

  Procedureprint_sal(p_empnonumber)is

  L_salemp.sal%type;

  Selectsalintol_salfromempwhereempno=p_empno;

  Dbms_output.put_line(l_sal);

  WhenNO_DATA_FOUNDthen

  Endprint_sal;

  Endemployee_pkg;

  执行:

  execemployee_pkg.print_ename(7782);

  execemployee_pkg.print_sal(7782);

  过程和函数的重载:

  在单独的程序包中定义的共享相同名称的两个或者多个过程和函数。

单独的过程和函数必须具有唯一的名称,但是程序包中可以有条件的共享相同的名称。

  条件:

参数列表在数量、次序或者参数类型上有所区别,比如

  procedurefoo(p1varchar2);

  procedurefoo(p1number);

  procedurefoo(p1varchar2,p2number);

  procedurefoo(p1varchar2,p2varchar2);

  但是:

只在参数名称、输入输出模式、或者返回类型上不同,是不够的。

  procedurefoo(p2varchar2);

  procedurefoo(p1invarchar2);

  procedurefoo(p1inoutvarchar2);

  例如

  descdbms_output

  试验:

重载SWAP()

  之前的例子:

  ---

  该例子只能实现交换数值,我们将其包装,并进行重载,使其也可以交换varchar2和date

  

(1)建立规范

  createorreplacepackageutilitiesas

  procedureswap(p1inoutnumber,p2inoutnumber);

  procedureswap(p1inoutvarchar2,p2inoutvarchar2);

  procedureswap(p1inoutdate,p2inoutdate);

  endutilities;

  

(2)建立主体

  createorreplacepackagebodyutilitiesas

  procedureswap(p1inoutnumber,p2inoutnumber)as

  dbms_output.put_line(‘Swappingnumber’);

  procedureswap(p1inoutvarchar2,p2inoutvarchar2)as

  l_tempvarchar2(32767);

  dbms_output.put_line(‘Swappingvarchar2’);

  procedureswap(p1inoutdate,p2inoutdate)as

  l_tempdate;

  dbms_output.put_line(‘Swappingdate’);

  (3)测试结果:

  l_num1number:

=1;

  l_num2number:

=2;

  l_date1date:

=sysdate;

  l_date2date:

=sysdate+1;

  utilities.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1