Определение процедуры в спецификации пакета (PLS-00302 component must be declared)

Есть процедура, которая определенна только в теле пакета. Её надо будет запустить по графику в JOB.

Необходимо ли определять эту процедуру в спецификации пакета или для запуска с помощью JOB в этом нет необходимости?

JOB и пакет будут определены в одной и той же схеме.


Ответы (1 шт):

Автор решения: 0xdb

Обратится вне пакета к идентификатору, стоящему после имени пакета и точки <пакет>., будь то переменная, константа, процедура и тд, можно только, если этот идентификатор объявлен в спецификации пакета, исключений нет.

create or replace package pack as
end;
/
create or replace package body pack as
    procedure proc (par1 int) is
    begin 
        dbms_output.put_line ('procedure proc('||par1||') executed'); 
    end;
end;
/
exec pack.proc

PLS-00302: component 'PROC' must be declared

Если появляется задача запустить уже сушествующую внутреннею функцию или процедуру извне, их декларацию надо поместить в специфиацию. Обычно, чтобы подогнать под контекст вызова для них пишется новая публичная "обёртка":

create or replace package pack as
    procedure procWrapper;
end;
/
create or replace package body pack as
    var1 int := 99;
    procedure proc (par1 int);
    procedure procWrapper is 
    begin
        proc (var1); 
    end;
    procedure proc (par1 int) is
    begin 
        dbms_output.put_line ('procedure proc('||par1||') executed'); 
    end;
end;
/
exec pack.procWrapper

procedure proc(99) executed

→ Ссылка