2011-10-12 8 views
10

Może to być zbyt proste pytanie, ale potrzebuję pomocy.Nie można połączyć się z przechowywaną procedurą i funkcją oracle

Tworzę procedurę przechowywaną w Oracle 10g, ale nie mogę jej nazwać. Używam programisty SQL do zarządzania bazą danych.

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; 

Próbowałem to również:

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; 

analizowania zarówno nie daje żadnej komunikat o błędzie. Użyłem następującej składni, aby zadzwonić do nich:

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

I

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

otrzymuję komunikat o błędzie ....

PLS-00221: 'CHECK_LOGIN' nie jest procedura lub jest niezdefiniowany
PL/SQL: Instrukcja ignorowana

Instrukcja SELECT w obu wersjach działa poprawnie, jeśli jest uruchamiana bezpośrednio.

Czy robię coś nie tak?

Odpowiedz

18

Jeśli chcesz uruchomić funkcję, musisz pobrać wartość zwracaną do zmiennej.

Więc trzeba zdefiniować zmienną i funkcję wykonać, aby powrócić do zmiennej jak poniżej

i uruchomić go za pomocą Uruchomienie skryptu opcji nie komunikat opcji Run.

variable ret varchar2(20); 

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

select :ret from dual 

Albo jeśli robisz to z plsql

declare v_ret varchar2(100); 
begin 

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

Dzięki Joseph! To działało. Teraz, jak zmniejszyć trzy linie tylko do jednej linii, aby można było wywołać ją z kodu PHP w jednym wierszu za pomocą ** oci_execute() **? –

+2

Drugi blok, o którym wspomniałeś, działa, ale wyświetla tylko ** zamknięty anonimowy blok **. Nie zwraca wartości. –

5

znaleźć najprostszy sposób do wywołania funkcji jest po prostu wybranie funkcji z podwójnym EG

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

Uwaga Komunikat o błędzie powiedział: "Nie procedura" :).