2011-10-12 26 views
10

Potrebbe essere una domanda troppo semplice da chiedere, ma ho bisogno di aiuto.Impossibile chiamare la stored procedure di Oracle e la funzione

Sto creando una procedura memorizzata in Oracle 10g, ma non posso chiamarla. Sto usando SQL Developer per gestire il database.

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; 

ho provato anche questo:

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; 

Analisi sia non dare alcun messaggio di errore. Ho usato seguente sintassi per chiamarli:

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

E

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

ricevo questo messaggio di errore ....

PLS-00221: 'CHECK_LOGIN' non è una procedura o non è definito
PL/SQL: Dichiarazione ignorata

L'istruzione SELECT all'interno di entrambi funziona bene se eseguita direttamente.

Sto facendo qualcosa di sbagliato?

risposta

18

Se si desidera eseguire una funzione, è necessario raccogliere il valore restituito in una variabile.

Quindi è necessario definire una variabile e la funzione di eseguire per tornare nella variabile, come di seguito

ed eseguirlo con il corsa Script opzione non la dichiarazione opzione Esegui.

variable ret varchar2(20); 

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

select :ret from dual 

O se lo si fa da plsql

declare v_ret varchar2(100); 
begin 

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

Grazie Giuseppe! Ha funzionato. Ora, come rimpicciolire le tre linee su una sola linea in modo che possa essere chiamata dal codice PHP in una riga usando ** oci_execute() **? –

+2

Il secondo blocco che hai menzionato, funziona ma visualizza solo ** blocco anonimo completato **. Non restituisce un valore. –

5

Trovo il modo più semplice per chiamare una funzione è solo la selezione della funzione di doppio EG

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

nota il messaggio di errore ha detto "No procedura" :).

Problemi correlati