2011-10-12 5 views
10

質問は簡単すぎるかもしれませんが、私は助けが必要です。oracleストアドプロシージャと関数を呼び出せません

Oracle 10gではストアドプロシージャを作成していますが、呼び出すことはできません。 SQL Developerを使用してデータベースを管理しています。

CREATE OR REPLACE 
FUNCTION check_login 
    (username IN VARCHAR2, pwd IN VARCHAR2) 
    RETURN VARCHAR2 
IS 
    isUserValid INTEGER; 
BEGIN 
    SELECT Count(*) INTO isUserValid 
    FROM users 
    WHERE Username = username AND PASS_WORD = pwd; 
    return isUserValid; 
END; 

私はこれも試してみました:

CREATE OR REPLACE 
PROCEDURE check_login 
    (username IN VARCHAR2, pwd IN VARCHAR2, RESULT OUT INTEGER) 
IS 
    isUserValid INTEGER; 
BEGIN 
    SELECT Count(*) INTO isUserValid 
    FROM users 
    WHERE Username = username AND PASS_WORD = pwd; 
    RESULT := isUserValid; 
END; 

は、解析の両方のいずれかのエラーメッセージを与えるものではありません。私はこのエラーメッセージ....

PLS-00221を取得し

BEGIN 
    check_login('admin', 'admin'); 
END; 

EXECUTE check_login('admin', 'admin'); 

:私はそれらを呼び出すために、次の構文を使用し 'CHECK_LOGINは' 手続きではありませんかが定義されていません
PL/SQL:ステートメントが無視されました

直接実行すると、両方のSELECT文が正常に動作します。

何か間違っていますか?

答えて

18

関数を実行する場合は、戻り値を変数に収集する必要があります。

だから、変数を定義し、

次のように変数に戻り、スクリプトの実行オプションではありませんRUN文オプションを使用してそれを実行する機能を実行する必要があります。

variable ret varchar2(20); 

execute :ret:=check_login(dd,dd); 

select :ret from dual 

それとも、PLSQL

declare v_ret varchar2(100); 
begin 

    v_ret:=check_login(a,b); 
end; 
+0

ありがとうジョセフ!それは働いた。 ** oci_execute()**を使用してPHPコードから1行で呼び出せるように、3行を1行に縮小します。 –

+2

あなたが言及した2番目のブロックは動作しますが、完了した**匿名ブロック**のみが表示されます。値を返しません。 –

5

からそれを行う場合、私は関数を呼び出すための最も簡単な方法は、ちょうど

select check_login('admin', 'admin') from dual; 

EG-デュアル注エラーメッセージから機能を選択している見つけます"いいえ 手順 ':