2011-06-19 91 views
1

我正在创建一个函数,以sys身份登录。Oracle函数编译错误,无错误

CREATE FUNCTION Core.Get_Contact_Code 
(
     First_Name IN NVARCHAR2, 
     Middle_Name IN NVARCHAR2, 
     Last_Name IN NVARCHAR2 
) 
RETURN NVARCHAR2 
IS 
    Ret_Val NVARCHAR2(10); 
    C_Code NVARCHAR2(10); 

    CURSOR contact_cursor IS 
    SELECT Contact_Code FROM (
     SELECT Contact_Code 
     FROM Core.Contacts 
     WHERE 
     Contact_Code LIKE UPPER(left(First_Name,2) || 
     CASE  
      WHEN Middle_Name IS NULL THEN left(Last_Name,3) 
      ELSE left(Middle_Name,1) || left(Last_Name,2) 
     END || '%') 
     ORDER BY Contact_Code desc) 
    WHERE ROWNUM=1; 
BEGIN 
    open contact_cursor; 
    fetch contact_cursor into C_Code; 
    close contact_cursor; 

    IF C_Code IS NULL THEN 
    Ret_Val := 
    UPPER(left(First_Name,2)|| 
     CASE  
      WHEN Middle_Name IS NULL THEN left(Last_Name,3) 
      ELSE left(Middle_Name,1) || left(Last_Name,2) 
     END 
    ) 
     || '-' || '0001'; 
    ELSE 
     Ret_Val := 
     UPPER(left(First_Name,2)|| 
      CASE  
       WHEN Middle_Name IS NULL THEN left(Last_Name,3) 
       ELSE left(Middle_Name,1) || left(Last_Name,2) 
      END 
     ) 
      || '-' || 
       trim(to_char(CAST(right(C_Code,4) AS integer)+1,'0000')); 
    END IF; 

    RETURN Ret_Val; 
END; 
/

show errors; 

当我执行查询时,它说:

Warning: compiled but with compilation errors 
No errors. 

但是,当我忽略了核心架构的定义

CREATE FUNCTION Get_Contact_Code 

它编译。

Oracle为何如此行事?

+2

你为什么以sys身份登录? – Sathya

+1

我正在通过脚本创建数据库,因此创建/更改/删除用户,因此这是开发环境。所以,我以sys身份工作。 –

+2

有没有听说过存储过程的“定义者权利”?以SYS编译PL/SQL代码是一个坏主意。 – Codo

回答

6

什么是左和右?您的脚本是否不包含这些函数的模式名称,因此它们只能安装在SYS中而不安装在CORE中?

+1

谢谢jonearles,我应该有架构限定左右功能,或者应该在架构核心中创建这些功能。知道了谢谢。 –

+1

@jonearles,为什么数据库引擎显示消息“没有错误,出现错误时”,SYS.USER_ERRORS中什么都没有? –

+0

@Nick Binnet:我不知道为什么错误没有显示出来,我不能重现这种行为。我有最好的解释是,当你添加对象到SYS怪异的事情可能会发生。如果你不想在dev上处理权限问题,那么使用'grant grant dba to [user]'比使用SYS更好。 –