Oracle 同义词问题

3

我的场景:

  • 架构名称:schema1
  • 包名称: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,仍然出现相同的错误。我在这里做错了什么?

不是应该是 CREATE PUBLIC SYNONYM(单数形式)吗? - Phil
抱歉,我弄错了。现在改成单数形式。 - niceApp
我永远不会理解为什么人们会在非工作代码上“打字”编程问题。 - Phil
将问题更改为显示我收到的确切Oracle错误。 - niceApp
2个回答

4

如果你真的需要使用单一名称调用该过程,有一种方法可以绕过此限制,那就是将其包装在模式级别的过程中:

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

CREATE PUBLIC SYNONYM proc1 FOR schema1.proc1;

4

注意这里

FOR子句的限制 模式对象不能包含在包中。

换句话说,您不能为包过程创建同义词。

我见过一些解决方案,其中创建了一个包装程序(非打包),并为其创建了一个公共同义词。


2
如果您执行 select * from dba_synonyms where synonym_name = 'FRED';,您会发现 CREATE PUBLIC SYNONYM call_proc FOR pkg_system.proc1; 会在模式 PKG_SYSTEM 中为对象 "PROC1" 创建一个同义词(即使没有该名称的用户/模式)。 - Gary Myers
我仍然不确定为什么需要同义词。为什么不只是有一个引用适当模式的包装程序呢? - Adam Hawkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接