Предоставление возможности частной процедуре внутри другой процедуры без предварительного объявления - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть спецификация пакета без_fwd, которая имеет открытую процедуру p1 и p2.

Также у меня есть тело пакета без_fwd, которая имеет три процедуры p1, p2 и p3.Здесь p3 - это закрытая процедура, которая была создана после p1, но использовалась внутри p1.

Однако, чтобы использовать p3 внутри p1, мы можем использовать предварительное объявление для предоставления области действия.

Мне нужно знать, есть ли другой способ предоставить область действия p3, чтобы мы могли вызывать ее внутри p1 без использования предварительного объявления

create or replace package without_fwd is
procedure p1;
procedure p2;
end without_fwd;
/

create or replace package body without_fwd is
procedure p1 is
begin
p3;
end;
procedure p2 is
begin
dbms_output.put_line('Success');
end;
procedure p3 is
begin
dbms_output.put_line('Success 2');
end;
end without_fwd;
/

1 Ответ

1 голос
/ 19 сентября 2019

Для домашнего задания я бы предположил, что профессор просто ищет, чтобы вы сначала определили частный метод (что, кстати, обычно гораздо чаще, чем создание прямой ссылки в реальном мире)

create or replace package body without_fwd 
is
  -- Private methods
  procedure p3 is
  begin
    dbms_output.put_line('Success 2');
  end;

  -- Public methods
  procedure p1 is
  begin
    p3;
  end;

  procedure p2 is
  begin
    dbms_output.put_line('Success');
  end;
end without_fwd;

Если p3 используется только в p1, его можно определить как часть p1, а не как частный метод для пакета.В реальном мире это несколько необычно - я никогда не видел кодовую базу, которая бы регулярно использовала этот подход, хотя я общался с людьми, которые используют этот подход.Иногда я буду использовать его для упрощения специальных анонимных блоков для изменений данных, но это все.

create or replace package body without_fwd 
is
  -- Public methods
  procedure p1 
  is
    procedure p3 is
    begin
      dbms_output.put_line('Success 2');
    end;
  begin
    p3;
  end;

  procedure p2 is
  begin
    dbms_output.put_line('Success');
  end;
end without_fwd;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...