2012-04-04 14 views
2

Oracleの実行中に問題が発生しました。私はテーブルloginfo(username,password,type)をしたと私はこのような関数ました:OCI_NO_DATA oci8 oracleエラー

CREATE OR REPLACE FUNCTION login(name in varchar2,pass in varchar2) 
    RETURN integer 
    IS 
    v_type integer; 
    BEGIN 
    Select loginfo.type 
    INTO v_type from loginfo 
    where loginfo.username=name 
    and loginfo.password=pass; 
    RETURN (v_type); 
    END; 

を私はLOGINFOの2種類をしました。型1と2を入力します。私がphpからこの関数を呼び出すと、型1を返すべきであるパラメータを返します。この関数をタイプ2を返すパラメータで呼び出すと、PHPページにエラーOCI_NO_DATAが返されます。私は、Oracleから関数を呼び出すときしかし、それは私のパラメータがusername = '8801716560946'password = '123456'あるときには、2型を返す必要があります。2.

を返します。

答えて

2

OCI_NO_DATAは、テーブルで渡されたパラメータと一致する行がないことを示します。私はあなたがPHPから関数を呼び出すときに異なるパラメータを渡していることを賭けるでしょう。おそらく、あなたは文字列をいくつかのスペースを追加して渡しています。

+0

@AwladLiton - しかし、あなたは 'username'と' password'バインド変数にどのような価値を与えていますか?このエラーは、PHPを使用しているときにバインド変数の値が異なっていることを強く暗示しています(または、関数を実行しているコミットしていない同じOracleセッションで見つかるはずの行を挿入した) –

+0

おかげで洞窟。私は、それは私のパラメータがnumbers.thatのような場合は、username = '123456789'とパスワード= '123'それは何も値を返していないことを意味する場合は動作しないことがわかります。もし私がusername = 'awlad'やパスワード= 'awlad'itのようなパラメータを与えたら...私は驚いています! –

+0

@AwladLiton - データベース列が両方とも 'VARCHAR2'として定義され、両方のデータセットがテーブルに存在し、余分なスペースがなく、数字に先行ゼロがないとすれば、あなたはPHPでデータをバインドするときに間違ったデータ型を指定する。 –

0

コードに例外ハンドラを追加する必要があります。

CREATE OR REPLACE FUNCTION login(name in varchar2,pass in varchar2) RETURN integer IS 
    v_type integer; 
BEGIN  
Select loginfo.type 
INTO v_type from loginfo 
where loginfo.username=name 
and loginfo.password=pass; 
RETURN (v_type); 
exception when no_data_found then 
    return null; 
END; 

このようにして、関数によって返された値を保証することができます。 実稼働環境では、多くの利点としてパッケージを使用したいと考えています。

関連する問題