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 同义词问题的主要内容,如果未能解决你的问题,请参考以下文章