调用包中的过程或函数

Posted

技术标签:

【中文标题】调用包中的过程或函数【英文标题】:Calling Procedure or function in the package 【发布时间】:2021-08-07 07:19:51 【问题描述】:

我已经在其中创建了一个包和过程和函数。 我有一个小小的疑问。 如果我在包中同时创建了过程名称employee_dtls employee_dtls 过程作为架构中的独立对象。

但我想在我的包中调用独立过程employee_dtls,但是当我试图调用时 包中的过程正在执行,但没有调用独立的过程。

我假设由于两个过程的名称相同,所以它在包内调用过程。

请帮助我在这种情况下该怎么办?

【问题讨论】:

这是家庭作业还是真实系统?我很难想象在真实系统中的情况,您真的想要一个与包中的过程同名的独立过程。如果是家庭作业,只需使用完全限定的对象名称。如果它是一个真实的系统,请退后一步,重新评估您的命名标准。 @JustinCave 谢谢你的回复。这只是为了检查,我们如何才能做到这一点。 【参考方案1】:

你能做什么?限定程序名称(正如贾斯汀评论的那样)。方法如下(在代码中读取 cmets):

独立程序:

SQL> create or replace procedure p_test is
  2  begin
  3    dbms_output.put_line('...standalone P_TEST procedure');
  4  end;
  5  /

Procedure created.

打包程序:

SQL> create or replace package pkg_test is
  2    procedure p_test;
  3    procedure p_run;
  4  end;
  5  /

Package created.

SQL> create or replace package body pkg_test is
  2    procedure p_test is
  3    begin
  4      dbms_output.put_line('...packaged P_TEST procedure');
  5    end;
  6
  7
  8    procedure p_run is
  9    begin
 10      dbms_output.put_line('calling P_TEST');
 11      p_test;           -- no qualifier - runs the packaged procedure (that's what you have now)
 12
 13      dbms_output.put_line('calling SCOTT.P_TEST');
 14      scott.p_test;     -- procedure name preceded by owner name - runs the standalone procedure
 15
 16      dbms_output.put_line('calling PKG_TEST.P_TEST');
 17      pkg_test.p_test;  -- procedur ename preceded by package name - runs the packaged procedure
 18    end;
 19  end;
 20  /

Package body created.

测试:

SQL> set serveroutput on;
SQL> exec pkg_test.p_run;
calling P_TEST
...packaged P_TEST procedure
calling SCOTT.P_TEST
...standalone P_TEST procedure
calling PKG_TEST.P_TEST
...packaged P_TEST procedure

PL/SQL procedure successfully completed.

SQL>

【讨论】:

以上是关于调用包中的过程或函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从包中删除过程或函数

从 PHP 调用 Oracle 包中存在的函数/过程

如何在flutter中将另一个包中的类或函数调用到另一个包?

Oracle包及包的调用

如何调用ORACLE程序包中的存储过程

使用输入参数从包中调用所需的过程