2011-06-19 3 views
1

sysとしてログインしている関数を作成しています。エラーなしのOracle関数のコンパイルエラー

Warning: compiled but with compilation errors 
No errors. 

をしかし、私は定義

CREATE FUNCTION Get_Contact_Code 

でスキーマのコアを省略するときには、コンパイルされます。

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; 

私は、クエリを実行すると、それは言います。

オラクルがこのように動作する理由は何ですか?

+2

なぜsysとしてログインしていますか? – Sathya

+1

私はスクリプトを使ってデータベースを作成していますので、ユーザを作成/変更/削除することができます。これは開発環境です。だから、私はsysとして働いています。 –

+2

ストアドプロシージャの「定義者権限」について聞いたことがありますか? PL/SQLコードをSYSとしてコンパイルすることは悪い考えです。 – Codo

答えて

6

LEFTとRIGHTは何ですか?スクリプトにはこれらの関数のスキーマ名が含まれていないので、COREではなくSYSにのみインストールされます。

+1

jonearlesありがとうございました。私はスキーマを左右に修飾する必要がありますか、スキーマコアにそれらを作成しておく必要があります。了解、ありがとう。 –

+1

@jonearles、なぜデータベースエンジンは、エラーが発生したときにエラーなしとSYS.USER_ERRORSに何も表示されませんでしたか? –

+0

@Nick Binnet:なぜエラーが表示されないのか分かりませんが、その動作を再現することはできません。私が持っている最良の説明は、SYSにオブジェクトを追加すると変なことが起こるということです。 devの権限の問題に対処したくない場合は、SYSを使用するよりも、 'grant dba to [user]'のほうが良いでしょう。 –

関連する問題