2011-10-12 53 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; 

解析都沒有給出任何錯誤消息。我用下面的語法來調用它們:

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

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

我收到此錯誤信息....

PLS-00221: 'CHECK_LOGIN' 不是一個過程或未定義
PL/SQL:被忽略的語句

如果直接運行,則兩者中的SELECT語句都可以正常工作。

我做錯了什麼?

回答

18

如果你想執行一個函數,你必須將返回值收集到一個變量中。

所以,你需要定義一個變量和執行函數,返回到變量如下

,並使用運行腳本選項不是運行語句選項來運行它。

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代碼調用它。 –

+2

你提到的第二塊,但只顯示**匿名塊完成**。不返回一個值。 –

5

做到這一點,我覺得調用函數只是從雙EG-

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

注意錯誤消息選擇功能最簡單的方法說:「沒有程序':)。