存储过程 -------------------
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