2010-10-28 83 views
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这样的过程仍然有同样的错误。

我在这里做错了什么?

+0

是不是它“创建公共同义词”(单数)? – Phil 2010-10-28 00:25:00

+0

抱歉说错了。现在将其更改为单数。 – niceApp 2010-10-28 00:32:54

+0

我永远不会明白为什么人们为非工作代码“输入”代码问题。 – Phil 2010-10-28 00:59:08

回答

4

一种方法来绕过这个限制,假设你真的需要调用具有一个名称的程序(无论何种原因),你可以将它包装在一个架构级的过程:

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

CREATE PUBLIC SYNONYM proc1 FOR schema1.proc1; 
4

here

限制在FOR子句 架构对象不能包含在一个包中。

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

我见过创建包装程序(非包装)并为此创建公共同义词的解决方案。

+2

如果你做了select * from dba_synonyms where synonym_name ='FRED';你会看到CREATE PUBLIC SYNONYM call_proc FOR pkg_system.proc1;在模式PKG_SYSTEM中创建对象“PROC1”的同义词(即使没有该名称的用户/模式)。 – 2010-10-28 01:24:10

+0

我还没有出售,为什么你需要一个同义词。为什么不只有一个引用合适模式的包装程序? – 2010-10-28 02:50:13