Oracle 同义词问题

Posted

技术标签:

【中文标题】Oracle 同义词问题【英文标题】:Oracle Synonyms issue 【发布时间】:2011-05-01 15:00:33 【问题描述】:

我的场景:

架构名称:架构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 这样的过程仍然得到同样的错误。

我在这里做错了什么?

【问题讨论】:

不是CREATE PUBLIC SYNONYM(单数)吗? 抱歉弄错了。现在把它改成单数。 我永远无法理解为什么人们会为非工作代码“键入”代码问题。 更改问题以显示我得到的确切 oracle 错误。 +1:谢谢澄清/更新 【参考方案1】:

解决此限制的一种方法是,假设您确实需要使用单个名称调用过程(无论出于何种原因),您可以将其包装在模式级过程中:

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

CREATE PUBLIC SYNONYM proc1 FOR schema1.proc1;

【讨论】:

【参考方案2】:

注意here

FOR 条款的限制 架构对象不能包含在包中。

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

我已经看到了创建包装程序(未打包)并为此创建公共同义词的解决方案。

【讨论】:

如果你选择 * from dba_synonyms where synonym_name = 'FRED';你会看到 CREATE PUBLIC SYNONYM call_proc FOR pkg_system.proc1;在模式 PKG_SYSTEM 中为对象“PROC1”创建同义词(即使没有该名称的用户/模式)。 我仍然不明白为什么需要同义词。为什么不只是有一个引用正确模式的包装程序?

以上是关于Oracle 同义词问题的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中键入同义词

oracle 同义词

jOOQ 可以为 Oracle 同义词生成代码吗?

Oracle怎样创建同义词

oracle 查看同义词

oracle 中怎么创建同义词?