2012-04-04 387 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的;類型1和2.如果我用一個參數返回類型1的參數來調用這個函數。當我用一個應該返回類型2的參數調用該函數時,它會在PHP頁面中返回錯誤OCI_NO_DATA。但是,當我從Oracle調用函數時,返回2.

當我的參數是username = '8801716560946'password = '123456'時,它應返回類型2。

回答

2

OCI_NO_DATA意味着沒有與您在表格中傳入的參數相匹配的行。當你從PHP調用函數時,我會保證你傳遞了不同的參數。例如,也許你在一種情況下傳遞了一些字符串,而另一些則沒有。

+0

@AwladLiton - 但是你提供的'username'和'password'綁定變量的值是什麼?這個錯誤強烈地暗示了當你使用'PHP'時綁定變量值是不同的(或者你插入了它應該在你正在運行該函數並且沒有提交的同一個Oracle會話中找到的行) – 2012-04-04 21:17:57

+0

感謝洞穴。我發現它的工作原理如果我的參數像數字那樣工作,這意味着如果username ='123456789'和password ='123',它不會返回任何值。如果我給參數像用戶名='awlad'和密碼='awlad'it工作...我很驚訝! – 2012-04-04 21:31:44

+0

@AwladLiton - 假設數據庫列都被定義爲'VARCHAR2',並且表中存在兩組數據,並且沒有多餘的空格,並且數字中沒有前導零,我猜你是在PHP中綁定數據時指定錯誤的數據類型。 – 2012-04-04 21:38:03

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; 

這樣,你是保證有該函數的返回值。 在生產環境中,您也希望使用軟件包,因爲它們有很多優點。