2011-10-12 15 views
10

Peut-être trop simple question à poser, mais j'ai besoin d'aide.Impossible d'appeler la procédure stockée Oracle et la fonction

Je crée une procédure stockée dans Oracle 10g, mais je ne peux pas l'appeler. J'utilise SQL Developer pour gérer la base de données.

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; 

J'ai essayé aussi:

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; 

analyser à la fois ne donne pas de message d'erreur. J'ai utilisé la syntaxe suivante pour les appeler:

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

ET

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

Je reçois ce message d'erreur ....

PLS-00221: 'check_login' est pas une procédure ou est indéfini
PL/SQL: déclaration ignorée

L'instruction SELECT dans les deux fonctionne correctement si elle est exécutée directement.

Est-ce que je fais quelque chose de mal?

Répondre

18

Si vous voulez exécuter une fonction, vous devez collecter la valeur de retour dans une variable.

Vous devez donc définir une variable et exécuter la fonction de revenir dans la variable comme ci-dessous

et l'exécuter en utilisant l'option d'exécuter le script pas la Run Déclaration d'option.

variable ret varchar2(20); 

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

select :ret from dual 

Ou si vous le faites de plsql

declare v_ret varchar2(100); 
begin 

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

Merci Joseph! Cela a fonctionné. réduire les trois lignes à une seule ligne pour pouvoir l'appeler à partir du code PHP sur une ligne en utilisant ** oci_execute() **? –

+2

Le deuxième bloc que vous avez mentionné, fonctionne mais affiche uniquement ** bloc anonyme terminé **. Ne renvoie pas de valeur. –

5

je trouve la meilleure façon d'appeler une fonction est simplement de sélectionner la fonction de double EG-

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

Notez le message d'erreur dit "No procédure" :)

Questions connexes