Почему не удается выполнить SCHEMA_NAME.PACKAGE_NAME.PROCEDURE, Oracle

У меня есть схема A, пакет B и процедура C. B находится в схеме A, а C — в теле пакета B.

Он отлично работает, когда я говорю:

Begin 
Exec B.C;
END;

Но он выдает ошибку, когда я говорю:

Begin
Exec A.B.C;
END;

Error report:
ORA-06550: line 2, column 12:
PLS-00302: component 'B' must be declared
ORA-06550: line 2, column 4:
PL/SQL: Statement ignored

Я вхожу в систему как A, поэтому он находится в схеме A. и SELECT * FROM user_OBJECTS WHERE OBJECT_NAME = 'B'; показывает, что пакет и тело пакета действительны.


person user1617237    schedule 27.08.2012    source источник
comment
Что ж, ответ на этот вопрос: никогда не называйте свою синонимию именем SCHEMA. В этом случае есть одна частная синонимия и одна общедоступная синонимия, вызывающая проблему.   -  person user1617237    schedule 27.08.2012
comment
Вы должны представить это в форме ответа.   -  person DCookie    schedule 27.08.2012
comment
Что такое Exec?   -  person William Robertson    schedule 12.02.2018


Ответы (2)


У меня была такая же проблема, и я нашел проблему. Я напишу здесь ответ, чтобы закрыть эту проблему и помочь другим людям.

В моем случае у моего пользователя A есть права на выполнение процедуры B (просто процедура, а не пакет, но это то же самое). Когда пользователь пытается запустить:

Begin 
Exec A.B;
END;

Получите ошибку:

ERROR at line 2:
ORA-06550: line 2, column 7:
PLS-00302: component 'B' must be declared
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored

Проблема. Причина в том, что в базе данных был создан общедоступный синоним имени А. Это старая база данных, и я всего лишь администратор базы данных, а не разработчик, но в данном случае разработчик был скучным разработчиком. Он использовал 4 типа объектов с одинаковым именем: пользователь, таблица, табличное пространство и публичный синоним. Общедоступный синоним с именем A перед таблицей с именем A.

Решение. Поскольку вы точно не знаете, кто использует этот общедоступный синоним, мне пришлось искать другое решение вместо удаления общедоступного синонима. Я создал частный синоним для этой процедуры. Теперь пользователь может пропустить владельца процедуры в коде выполнения и игнорировать публичный синоним. Эта проблема возникает в базе данных Oracle 10.2.0.4.

Begin 
Exec B;
END;
PL/SQL procedure successfully completed.

Вывод. Никогда не используйте общедоступный/частный синоним с именем схемы.

Надеюсь помочь кому-нибудь. Если я не ясно выразился, пожалуйста, оставьте комментарий.

person adimoise91    schedule 12.02.2018

Исправьте синтаксическую ошибку в пакете, это стандартное сообщение об ошибке компиляции PL/SQL.

Проверьте точки ошибок (line 2, column 12) в PL/SQL, где произошла синтаксическая ошибка, исправьте ее, а затем попробуйте перекомпилировать свой код.

Component 'B' must be declared.

После этого предоставьте EXECUTE_CATALOG_ROLE, чтобы позволить пользователю «А» выполнять привилегии для пакетов и процедур в словаре данных.

grant EXECUTE_CATALOG_ROLE to A;
person stefannebesnak    schedule 10.11.2012
comment
Зачем вам предоставлять EXECUTE_CATALOG_ROLE? - person Jon Heller; 11.11.2012