我读过一些 PL SQL 编程书籍,它们建议我将过程、函数、游标等组合在一个包中。包提供模块化和信息隐藏,这是面向对象的设计。但是,我只熟悉独立程序。有人愿意提供一些代码示例以及如何从客户端调用包吗?我目前正在使用 ODP.NET 作为客户端应用程序中的数据访问。谢谢你。
4 回答
如果您熟悉调用独立过程,那么在包中调用过程并没有太大区别。只需在程序名称前加上包名称,如下所示:package_name.procedure_name。
您将程序、函数等的代码与私有变量的声明一起放在包体中。您将这些过程和函数的声明以及公共变量放在包中。只有后者可以从包外部访问,为此您需要在它们的名称前面加上包名称和一个点。
您也可以为这个包定义数据结构类型:如果公共程序将它们用作输入或输出,那么它们必须公开;如果没有,那么您可以自由选择。
示例代码,来自内存且未经测试,因此其中可能存在错误:
create or replace package foo as
a number;
function test1(s1 in varchar2) return varchar2;
procedure test2(i1 in integer);
end;
/
create or replace package body foo as
b number; -- internal only
function internalfunc(s in varchar2) return varchar2;
function test1(s1 in varchar2) return varchar2 is
s varchar2(32000);
-- variables ...
begin
-- code ...
return internalfunc(s);
end;
procedure test2(i1 in integer) is
-- variables ...
begin
-- code ...
end;
function internalfunc(s in varchar2) return varchar2 is
begin
return INITCAP(LOWER(s));
end;
end;
/
使用foo.a
等foo.test1
来使用这些函数和变量。您不能从包外部访问内部函数。如果它们被调用到比它们的实现更高的位置,它们只需要在包体的早期声明。
包与普通函数和过程相比有一个额外的优势:您可以重载它们的名称,在同一个包中拥有多个具有相同名称但具有不同参数类型的不同过程,并且将根据您使用的参数类型调用正确的函数。相比之下,独立函数或过程的名称必须是唯一的。
HTH。
要跟进,你可能有一个独立的喜欢
create or replace procedure foo (i_something in varchar2) as
begin
-- do some stuff;
end foo;
你用“foo('bar');”调用它
那将成为一个包和一个包体
create or replace package my_package as
procedure foo (i_something in varchar2);
end;
create or replace package body my_package as
procedure foo (i_something in varchar2);
begin
-- do some stuff;
end foo;
end my_package;
你用“my_package.foo('bar');”调用它
对于单个过程,使用包可能不会增加太多清晰度。但是,如果您要处理很多函数和过程,它会更干净。
使用包而不是仅仅声明具有全局范围的函数仍然是一种很好的做法。
如果你有包,它可以提供可扩展性,如果你碰巧想稍后添加具有相同上下文的函数,它可以使你的过程更清晰,因为它说明了从哪个库(包)调用的函数。