Вызывающая процедура или функция в пакете

#oracle #plsql #oracle11g #oracle-sqldeveloper #plsqldeveloper

Вопрос:

Я создал пакет, процедуру и функции внутри. У меня есть небольшое сомнение. Если я создал имя процедуры employee_dtls в пакете и в то же время процедуру employee_dtls в качестве независимого объекта в схеме.

Но я хочу вызвать независимую процедуру employee_dtls внутри моего пакета, но когда я пытаюсь вызвать процедуру внутри пакета, выполняется независимая процедура, которая не вызывается.

Я предполагаю, что, поскольку имена обеих процедур одинаковы, он вызывает процедуру внутри пакета.

Пожалуйста, помогите, что я могу сделать в этом случае?

Комментарии:

1. Это домашнее задание или реальная система? Мне очень трудно представить ситуацию в реальной системе, когда вам действительно нужна отдельная процедура с тем же именем, что и процедура в пакете. Если это домашнее задание, просто используйте полное имя объекта. Если это реальная система, сделайте шаг назад и пересмотрите свои стандарты именования.

2. @JustinCave Спасибо вам за ваш ответ. Это было просто для проверки, как мы можем этого достичь.

Ответ №1:

Что ты можешь сделать? Квалифицируйте название процедуры (как прокомментировал Джастин). Вот как (читайте комментарии в коде):

Автономная процедура:

 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>