oracle存储过程,函数,包

存储过程 -------------------

create or replace procedure NEW_BOOK(aTitle in varchar2,
aPublisher in varchar2,aCategoryName in varchar2)
as
begin
insert into BOOKSHEFT(Title,Publisher,CategoryName,Rating)
values(aTitle,aPublisher,aCategoryName,Null);
delete from BOOK_ORDER
WHERE Title=aTitle
END;

调用一个存储过程 ,对必须指定值的参数要使用IN 限定符。out限定符表示该过程将通过
此参数把一个值返回给调用者。IN OUT限定符表明参数同时为IN 和OUT 在调用过程时必须给此
参数指定一个值。且此过程将通过该参数把一个值返回给调用之。如果不指定限定符的类型,则
默认值为IN.

函数------------------------

create function 中return 关键字指定函数的返回值的数据类型。它可以是任何有效的pl/sql
数据类型 每个函数必须有一个return子句。因为根据定义。函数必须给调用环境返回一个值。

列子 -->首先,给此函数命名并指定其输入
create or replace function OVERDUE_CHARGES(aName in varchar2)

接下来 定义将要返回的值的特征。对于要返回其值的变量。它的定义包括3个不发 数据类型 变量名 和长度
这个是咧中的数据类型通过return number子句来设置 然后命名此变量为owed_amount 且定义为number(10,2)
这样 变量的三部分 数据类型 变量名 长度都定义好了。
return NUMBER   is   owed_amount NUMBER(10,2);

接着,是pll/sql块。在sql语句中,计算所以滞纳金的和 计算结果放在owed_amount变量中。然后
return(owed_amount)命令将owed_amount变量的值返回给主调函数
begin
 select sum(((ReturnedDate-CheckoutDate)-14)*0.20)
 into  owed_amount from BOOKSHEFT_CHECKOUT
 where Name=aName;
 return(owed_amount);
 end;

可以通过创建一个变量并设置其值等于函数的返回值来检查该函数
 variable owed number;
 execute :owed:=OVERDUE_CHARGES('FRED FULLER');

 调试的时候show errors命令显示所有与最近创建的过程对象有关的错误消息
 该命令检查user_errors数据字典视图找出与最近视图编译的=该对象有关的错误
 show errors显示每个错误的行号和列号 以及错误消息的文本。
 select line,
       position,
    text
    from user_errors where name='OVERDUE_CHARGES'
    and type='Function' order by sequence;
 Type列的有效值为VIEW PROCEDURE PACKAGE FUNCTION PACKAGE BODY.

程序包-------------------------------------

在创建程序包时,程序包说明和程序包体是分别创建的。
 这样需要分别用两个命令:用create package 创建程序包说明
 用create package body创建程序包体。

程序包说明(Package Specification)由函数,过程,变量。常量,游标和异常组长 并且这些组成部分对
 程序包的用户是可用的。 例子:
 create or replace package BOOK_MANAGEMENT
   as
    function OVERDUE_CHARGES(aName in varchar2) return number;
    procedure NEW_BOOK(aTitle in varchar2,aPublisher in varchar2,
    aCategoryName in varchar2);
    end BOOK_MANAGEMENT;

程序包体包括了程序包说明中列出的所有共有对象的代码块和说明。程序包体还可以包括没有在程序包说明中列出
    的对象。这些对象称之为私有对象,对程序包的用户不可用。私有对象只能由同一程序包体中的其他对象调用

   create or replace package body BOOK_MANAGEMENT
    as
    function OVERDUE_CHARGES(aName in varchar2)
    return number
    is owed_amount number(10,2);
    begin
    select sum(((ReturnedDate-CheckoutDate)-14)*0.2) into owed_amount
    from BOOKSHEFT_CHECKOUT where Name=aName and(ReturnedDate-CheckoutDate)>14;
    return(owed_amount);
    exception when NO_DATA_FOUND THEN
    RAISE_APPLICATION_ERROR(-20100,'no BOOKS BORROWED');
    end OVERDUE_CHARGES;
    procedure NEW_BOOK(aTitle in varchar2,aPublisher in varchar2,aCategoryName in varchar2)
    is
    begin
    insert into BOOKSHELF(Title,Publisher,CategoryName,Rating) values
    (aTitle,aPublisher,aCategoryName,null);
    delete from BOOK_ORDER where Title=aTitle;
    end NEW_BOOK;
    end BOOK_MANAGEMENT;

重新编译------------------------------------

oracle在创建过程对象时对他们进行编译。但是 如果对象引用的数据库对象发生变化 则这些过程对象可能会失效
    下一次执行这些过程对象时,数据库将对他们进行重新编译
    可以显式的重新编译过程 函数和程序包 以避免这种运行时编译- 同时避免其导致的性能下降。
    为了重新编译一个过程,可以使用alter procedure命令。
    如
    alter procedure NEW_BOOK compile;
    alter function OVERDUE_CHARGES compile;

在重新编译程序包时,要么重新编译程序包说明和程序包体,要么重新编译程序包体。在
    默认情况下。程序包说明和程序包体都要重新编译。不能使用alter function 或alter procedure
    命令来重新编译存储在程序包内的函数或过程。
    如果程序包体过程或函数的源代码已经改变。但是程序包说明没改变 那么只需要编译程序包体即可。
    大多数情况下 最好是将程序包说明和程序包体都重新编译
    alter package [user.] package_name
    alter package BOOK_MANAGEMENT compile;

删除过程,函数,包-----------------

    删除过程 drop procedure NEW_BOOK;
    删除函数 drop function OVERDUE_CHARGES;
    删除程序包体 drop package body BOOK_MANAGEMENT;
    删除程序包 drop package BOOK_MANAGEMENT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值