在Oracle包中使用同义词

时间:2017-05-16 16:49:38

标签: oracle package synonym

我创建了一个包的同义词,但是我无法用它做任何事情,包括一个简单的desc命令。查看代码:

创建包sql(在所有者用户上执行)

create or replace PACKAGE pkg_elmah$log_error
IS
    PROCEDURE LogError
    (
        v_ErrorId IN elmah$error.errorid%TYPE,
        v_Application IN elmah$error.application%TYPE,
        v_Host IN elmah$error.host%TYPE,
        v_Type IN elmah$error.type%TYPE,
        v_Source IN elmah$error.source%TYPE,
        v_Message IN elmah$error.message%TYPE,
        v_User IN elmah$error.username%TYPE,
        v_AllXml IN elmah$error.allxml%TYPE,
        v_StatusCode IN elmah$error.statuscode%TYPE,
        v_TimeUtc IN elmah$error.timeutc%TYPE
    );

END pkg_elmah$log_error;

创建同义词和测试sql(在非所有者用户上执行)

CREATE SYNONYM pkg_elmah$log_error FOR DRSP.pkg_elmah$log_error; 
desc pkg_elmah$log_error; 
---------RESULT: object does not exist
execute pkg_elmah$log_error.logerror;
---------RESULT: identifier pkg_elmah$log_error must be declared

当我与这些对象的所有者登录时,这些代码运行正常。

Grant给出如下​​(我似乎无法仅给出程序,因为它给出了ORA-04042,所以我把它交给了包裹):

grant execute on PKG_ELMAH$LOG_ERROR to not_owner

环境:WINDOWS 7 64位; SQL DEVELOPER 4.0.3.16; ORACLE CLIENT 11.2

同义词的详细信息:
Details of the synonym.

套餐详情:
  package details

1 个答案:

答案 0 :(得分:2)

您正在以错误的顺序做某事或以其他方式省略告诉我们的事情。因为以正确顺序执行的指令按预期工作:

SQL> conn a/a
Connected.
USER is "A"
SQL> create or replace PACKAGE pkg_elmah$log_error
  2  IS
  3    PROCEDURE LogError
  4      (
  5        v_ErrorId IN number,
  6        v_Application IN varchar2,
  7        v_Host IN varchar2,
  8        v_Type IN varchar2,
  9        v_Source IN varchar2,
 10        v_Message IN varchar2,
 11        v_User IN varchar2,
 12        v_AllXml IN varchar2,
 13        v_StatusCode IN varchar2,
 14        v_TimeUtc IN date
 15      );
 16
 17  END pkg_elmah$log_error;  
 18  /

Package created.

SQL> grant execute on PKG_ELMAH$LOG_ERROR to b
  2  /

Grant succeeded.

SQL> conn b/b
Connected.
USER is "B"
SQL> CREATE SYNONYM pkg_elmah$log_error FOR A.pkg_elmah$log_error;

Synonym created.

SQL> desc pkg_elmah$log_error 
PROCEDURE LOGERROR
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 V_ERRORID                      NUMBER                  IN
 V_APPLICATION                  VARCHAR2                IN
 V_HOST                         VARCHAR2                IN
 V_TYPE                         VARCHAR2                IN
 V_SOURCE                       VARCHAR2                IN
 V_MESSAGE                      VARCHAR2                IN
 V_USER                         VARCHAR2                IN
 V_ALLXML                       VARCHAR2                IN
 V_STATUSCODE                   VARCHAR2                IN
 V_TIMEUTC                      DATE                    IN

SQL> exec pkg_elmah$log_error.logerror
BEGIN pkg_elmah$log_error.logerror; END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'LOGERROR'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL>