如何使用PL/SQL(Oracle 10g)从另一个PL/SQL文件的包函数中的PL/SQL文档调用函数



我有两个sql文件。其中一个是"函数.sql">,另一个是"strong>";施主.sql">";施主.sql">有一个包";AddDonor">";add_ donor">函数。这是代码:

create or replace package AddDonor as 
function add_donor(id in Donation.id%TYPE,d_id in Donor.d_id%TYPE,p_id in Participant.p_id%TYPE,name in Donor.name%TYPE,age in Donor.age%TYPE,gender in Donor.gender%TYPE,bg in Donor.bg%TYPE,branch in Donor.branch%TYPE,contactno in Donor.contactno%TYPE,status in Donation.status%TYPE,c_id in Campaign.c_id%TYPE)
return number;
end AddDonor;
/
create or replace package body AddDonor as 
function add_donor(id in Donation.id%TYPE,d_id in Donor.d_id%TYPE,p_id in Participant.p_id%TYPE,name in Donor.name%TYPE,age in Donor.age%TYPE,gender in Donor.gender%TYPE,bg in Donor.bg%TYPE,branch in Donor.branch%TYPE,contactno in Donor.contactno%TYPE,status in Donation.status%TYPE,c_id in Campaign.c_id%TYPE)
return number
is
flag number:=0;
BEGIN

flag := add_donor1(d_id, name, age,gender,bg,branch,contactno);
return flag;
END add_donor;

End AddDonor;
/

";函数.sql">具有"strong>";adddonor1"函数。此函数不是任何程序包的一部分";adddonor1">是来自"strong>"的独立函数;函数.sql"文件。这是代码:

create or replace function add_donor1(id in Donation.id%TYPE,d_id in Donor.d_id%TYPE,p_id in Participant.p_id%TYPE,name in Donor.name%TYPE,age in Donor.age%TYPE,gender in Donor.gender%TYPE,bg in Donor.bg%TYPE,branch in Donor.branch%TYPE,contactno in Donor.contactno%TYPE,status in Donation.status%TYPE,c_id in Campaign.c_id%TYPE)
return number
is

BEGIN
insert into Donor values(d_id, name, age,gender,bg,branch,contactno);
insert into Donation values(id,d_id,status);
insert into Participant values(p_id,c_id, d_id,name,bg);
insert into Donor@server_link values(d_id, name, age,gender,bg,branch,contactno);
insert into Donation@server_link values(id,d_id,status);
insert into Participant@server_link values(p_id,c_id, d_id,name,bg);
return 1;
END add_donor1;
/
commit;

我想呼叫<strong";add_donor1">来自"strong>";函数.sql"在包内";AddDonor";以及封装功能";add_ donor">来自"strong>";施主.sql"文件

我试过这个:

flag:=add_donor1(d_id,姓名,年龄,性别,bg,分支,联系人号(;

但它显示:

8/3 PL/SQL:SQL语句被忽略
8/10 PL/SQL:ORA-00904:"功能"ADD_DONOR1":标识符无效

如何使用pl/sql(Oracle 10g(从另一个pl/sql文件的包函数内的pl/sql中调用函数如何解决这个问题?

我已经尝试过了。它不起作用。请检查我的代码。我所说的.sql文件是指我已经在.sql文件中编写了代码。然后我使用命令行来执行这些文件。

您需要按照依赖关系的顺序运行这两个脚本。不依赖于其他任何东西的程序必须首先运行。您有一个依赖于独立函数的包,因此需要首先运行函数脚本。

  1. @function.sql
  2. @donor.sql

您的程序包有问题:对add_donor1()的调用包含错误数量的参数。您需要传递签名中声明的所有参数。一旦修复,您的代码将编译并运行。

以下是db<gt;小提琴


顺便说一句,通过发布DML来使用函数更改数据库状态被广泛认为是一种糟糕的做法。它应该是一个过程(一个不返回任何内容的程序单元(。函数返回的是一个伪值,而不是任何有意义的值

你说过一些"奇怪的";事情。文件(.sql(让我很困惑。这是一个Oracle数据库,你不会从存储在磁盘上的文件中操作它的对象,而是从数据库本身中操作。

因此:连接到数据库(使用您使用的任何工具;是SQL*Plus、SQLDeveloper、TOAD吗?…-无关紧要(

  • 首先通过运行create function语句创建一个函数(add_donor1(
  • 然后通过运行create packagecreate package body来创建包
    • 包的函数add_donor调用独立函数add_donor1;由于它已经存在,包应该编译

由于我没有你的表(也不想键入那么多(,我评论了多余的代码,只是为了向你表明,如果操作得当,可以工作

函数.sql

create or replace function add_donor1
/*
(id in Donation.id%TYPE,
d_id in Donor.d_id%TYPE,
p_id in Participant.p_id%TYPE,
name in Donor.name%TYPE,
age in Donor.age%TYPE,
gender in Donor.gender%TYPE,
bg in Donor.bg%TYPE,
branch in Donor.branch%TYPE,
contactno in Donor.contactno%TYPE,
status in Donation.status%TYPE,
c_id in Campaign.c_id%TYPE)
*/  
return number
is
BEGIN
/*
insert into Donor values(d_id, name, age,gender,bg,branch,contactno);
insert into Donation values(id,d_id,status);
insert into Participant values(p_id,c_id, d_id,name,bg);
insert into Donor@server_link values(d_id, name, age,gender,bg,branch,contactno);
insert into Donation@server_link values(id,d_id,status);
insert into Participant@server_link values(p_id,c_id, d_id,name,bg);
*/   
return 1;
END add_donor1;
/

捐助者.sql

create or replace package AddDonor as 
function add_donor
--(id in Donation.id%TYPE,d_id in Donor.d_id%TYPE,p_id in Participant.p_id%TYPE,name in Donor.name%TYPE,age in Donor.age%TYPE,gender in Donor.gender%TYPE,bg in Donor.bg%TYPE,branch in Donor.branch%TYPE,contactno in Donor.contactno%TYPE,status in Donation.status%TYPE,c_id in Campaign.c_id%TYPE)
return number;
end AddDonor;
/
create or replace package body AddDonor as 
function add_donor
--(id in Donation.id%TYPE,d_id in Donor.d_id%TYPE,p_id in Participant.p_id%TYPE,name in Donor.name%TYPE,age in Donor.age%TYPE,gender in Donor.gender%TYPE,bg in Donor.bg%TYPE,branch in Donor.branch%TYPE,contactno in Donor.contactno%TYPE,status in Donation.status%TYPE,c_id in Campaign.c_id%TYPE)
return number
is
flag number:=0;
BEGIN

flag := add_donor1; --(d_id, name, age,gender,bg,branch,contactno);
return flag;
END add_donor;

End AddDonor;
/

执行:

SQL> @function
Function created.
SQL> @donor
Package created.

Package body created.
SQL>

看到了吗?没有错误。

最新更新