2011-10-12 18 views
10

Puede ser una pregunta demasiado simple, pero necesito ayuda.No se puede llamar al procedimiento almacenado de Oracle y a la función

Estoy creando un procedimiento almacenado en Oracle 10g, pero no puedo llamarlo. Estoy usando SQL Developer para administrar la base de datos.

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; 

He intentado esto también:

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; 

Analizar tanto no da ningún mensaje de error. Usé siguiente sintaxis para llamar a ellos:

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

Y

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

me sale este mensaje de error ....

PLS-00221: 'CHECK_LOGIN' no es un procedimiento o no está definido
PL/SQL: instrucción ignorada

La instrucción SELECT dentro de ambos funciona bien si se ejecuta directamente.

¿Estoy haciendo algo mal?

Respuesta

18

Si desea ejecutar una función, debe recopilar el valor devuelto en una variable.

Así que hay que definir una variable y ejecutar la función para volver a la variable de la siguiente manera

y ejecutarlo mediante el ejecución de secuencias de comandos opción no es la opción Ejecutar Declaración.

variable ret varchar2(20); 

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

select :ret from dual 

O si lo haces desde plsql

declare v_ret varchar2(100); 
begin 

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

Gracias Joseph! Eso funcionó. Ahora, cómo reducir las tres líneas a una sola línea para que se pueda invocar desde el código PHP en una línea usando ** oci_execute() **? –

+2

El segundo bloque que mencionaste, funciona pero solo muestra ** bloque anónimo completado **. No devuelve un valor –

5

puedo encontrar la manera más fácil llamar a una función se acaba de seleccionar la función de doble EG

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

Nota el mensaje de error dijo "No procedimiento ':).

Cuestiones relacionadas