2016-03-31 11 views
0

Oracle Application Expressでクエリを実行していましたが、問題ありませんでした。アプリケーションを実行するまで、エラーが発生します機能オブジェクトが無効です

プラグイン処理中に発生したPLSQLコードのエラー。

ORA-06550:行4、列1:PLS-00905:オブジェクトが PURCHASEORDER.ACLSTUDENT_CUSTOM_AUTHが無効ORA-06550である:線4、 カラム1:PL/SQL:

を無視ステートメントこれは私のSQLです

create or replace FUNCTION aclstudent_custom_auth (
p_username IN VARCHAR2(50), 
p_password IN VARCHAR2(20)) 
RETURN boolean IS 
    valid boolean; 
BEGIN 
    FOR c1 IN (SELECT 1 FROM students 
      WHERE upper(student_userid) = upper(p_username) 
      AND upper(student_last_name) = upper(p_password)) 
    LOOP 
    valid := TRUE; 
    RETURN valid; 
    END LOOP; 
    valid := FALSE; 
    RETURN valid; 
END; 
+0

あなたの機能は**無効**状態になっています。あなたは二度戻っています。エラーを修正し、** compile **を再度実行してください。また、ループの目的は何ですか? –

+0

'PURCHASEORDER.ACLSTUDENT_CUSTOM_AUTH'のコンパイルエラーを表示すると助けになります。 SQLPlusまたはSQL Developerの 'show errors package body PURCHASEORDER.ACLSTUDENT_CUSTOM_AUTH' –

答えて

0

マッシーの言うとおり、引数には長さを指定しないでください。また、Lalitが暗示しているように、戻り変数と2つのRETURN文の使用は余計です。 またはのいずれかで必要なBOOLEAN値を返すか、変数を設定し、関数の最後に1つのRETURNを設定するか、あなたのコードがより簡潔になるので、私は最初のアプローチに行きます。

ちなみに、私はループを使って1つのレコードの存在を確認するのは好きではありませんが、それはbyです。

CREATE OR REPLACE FUNCTION aclstudent_custom_auth(p_username IN VARCHAR2, 
                p_password IN VARCHAR2) 
RETURN BOOLEAN IS 
BEGIN 
    FOR c1 IN (SELECT 1 
       FROM students 
       WHERE upper(student_userid) = upper(p_username) 
       AND upper(student_last_name) = upper(p_password)) LOOP 
     RETURN TRUE; 
    END LOOP; 

    RETURN FALSE; 
END; 

OR

CREATE OR REPLACE FUNCTION aclstudent_custom_auth(p_username IN VARCHAR2, 
                p_password IN VARCHAR2) 


RETURN BOOLEAN IS 
    valid BOOLEAN; 
BEGIN 
    FOR c1 IN (SELECT 1 
       FROM students 
       WHERE upper(student_userid) = upper(p_username) 
       AND upper(student_last_name) = upper(p_password)) LOOP 
     valid := TRUE; 
    END LOOP; 
    valid := FALSE; 

    RETURN valid; 
END; 
+0

で次のコマンドを実行してください。回答ありがとうございます。さて、それは正常に動作します! FUNCTIONは使用できますが、パラメータは使用できないと思いますか?私は戻り値が必要です。 – twindicated70

+0

はい、パラメータを指定しないで関数を使用できます。あなたの関数が常に値を返す限り。 – Drumbeg

1

関数の入力パラメータの宣言は長さがありません。

CREATE OR REPLACE FUNCTION aclstudent_custom_auth (
p_username IN VARCHAR2, 
p_password IN VARCHAR2) 
RETURN boolean IS 
    valid boolean; 
BEGIN 
    FOR c1 IN (SELECT 1 FROM students 
      WHERE upper(student_userid) = upper(p_username) 
      AND upper(student_last_name) = upper(p_password)) 
    LOOP 
    valid := TRUE; 
    RETURN valid; 
    END LOOP; 
    valid := FALSE; 
    RETURN valid; 
END; 

これはうまくいくはずです。

関連する問題