Проблема синонимов Oracle

Мой сценарий:

  • Имя схемы: схема1
  • Имя пакета: pkg_system
  • имя процедуры: proc1

Теперь я пытаюсь создать синонимы для моего proc1, как показано ниже.

CREATE PUBLIC SYNONYM call_proc FOR schema1.pkg_system.proc1;

... но это дало мне синтаксическую ошибку.

ORA-00933: SQL command not properly ended

Я изменил код, как показано ниже:

CREATE PUBLIC SYNONYM call_proc FOR pkg_system.proc1;

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

EXEC call_proc

... получил следующую ошибку:

ORA-06550: line 1, column 7:
PLS-00201: identifier call_proc must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

И я использовал имя схемы для вызова процедуры, например schema1.call_Proc, все равно получил ту же ошибку.

Что я здесь сделал не так?


person niceApp    schedule 28.10.2010    source источник
comment
Разве это не CREATE PUBLIC SYNONYM (единственное число)?   -  person Phil    schedule 28.10.2010
comment
извините неправильно выразился. Измените его на единственное число сейчас.   -  person niceApp    schedule 28.10.2010
comment
Я никогда не пойму, почему люди пишут вопросы о неработающем коде.   -  person Phil    schedule 28.10.2010
comment
Измените вопрос, чтобы показать точную ошибку оракула, которую я получил.   -  person niceApp    schedule 28.10.2010
comment
+1: Спасибо за разъяснение/обновление   -  person OMG Ponies    schedule 28.10.2010


Ответы (2)


Один из способов обойти это ограничение, предполагая, что вам действительно нужно вызвать процедуру с одним именем (по какой-либо причине), вы можете обернуть ее в процедуру уровня схемы:

CREATE PROCEDURE schema1.proc1 IS
BEGIN
   pkg_system.proc1;
END;

CREATE PUBLIC SYNONYM proc1 FOR schema1.proc1;
person Jeffrey Kemp    schedule 28.10.2010

Примечание здесь

Ограничение на предложение FOR Объект схемы не может содержаться в пакете.

Другими словами, вы не можете создать синоним для пакетной процедуры.

Я видел решения, в которых создается процедура-оболочка (неупакованная) и для нее создается общедоступный синоним.

person Phil    schedule 28.10.2010
comment
Если вы сделаете выбор * из dba_synonyms, где synonym_name = 'FRED'; вы увидите, что CREATE PUBLIC SYNONYM call_proc FOR pkg_system.proc1; создает синоним для объекта PROC1 в схеме PKG_SYSTEM (даже если нет пользователя/схемы с таким именем). - person Gary Myers; 28.10.2010
comment
Я до сих пор не понимаю, зачем вам нужен синоним. Почему бы просто не создать процедуру-оболочку, ссылающуюся на правильную схему? - person Adam Hawkes; 28.10.2010