Soy nuevo en pl/sql y tengo una tarea problema que tengo totalmente atascado en.

Tengo una tabla llamada BANKCUSTOMER con las siguientes columnas:

 USERNAME                                  NOT NULL VARCHAR2(11)
 FAMILY_NAME                               NOT NULL VARCHAR2(25)
 NAME                                      NOT NULL VARCHAR2(25)
 PASSWD                                    NOT NULL VARCHAR2(6)

Quiero hacer una función que comprueba en la base de datos si el usuario nombre de USUARIO y la CONTRASEÑA coinciden con los datos en la base de datos. Si el inicio de sesión se realiza correctamente, a continuación, se deberá imprimir el «inicio de Sesión con éxito!» de otra manera «usuario o contraseña Incorrecta!»

Visité un pl/sql tutorial de sitio y se acercó el siguiente código que he modificado un poco para que pueda trabajar con mi base de datos, pero hay algo que no entiendo y que es lo que z number ¿ y qué begin select 1 into z hace. Podría alguien por favor explicar que para mí.

create or replace function log_in(x in varchar2, y in varchar2)   
return varchar2  
as  
  z number;  
begin  
  select 1  
    into z   
    from bankcustomer   
    where username=x   
    and passwd=y;  
  dbms_output.put_line('Login successful!');  
exception  
when no_data_found then  
  dbms_output.put_line('Wrong username or password!'); 
end; 

Me gustaría probar la función de la escritura SELECT log_in() FROM dual; a ver si funciona. Cuando escribo SELECT log_in() FROM dual; me sale un mensaje de error diciendo:

Error de partida en la línea 1 en orden:
SELECCIONE log_in() FROM dual
Error en la Línea de Comandos:Columna 1:7
Informe de errores:
SQL Error: ORA-06553: PLS-306: número equivocado o tipos de argumentos en la llamada a ‘LOG_IN’
06553. 00000 – «PLS-%s: %s»
*Causa:

*Acción:

¿Cómo puedo resolver esta tarea problema?

Lo siento por mis preguntas de novato (esperanza de que puedo aprender para que yo pueda ayudar a otros en el futuro).
Gracias de antemano!

InformationsquelleAutor Posidon | 2012-02-18

3 Comentarios

  1. 2

    Se ha definido una función, pero no devuelven un valor. Dado el hecho de que «seleccionar» la función no es necesario el uso de dbms_output:

    create or replace function log_in(x in varchar2, y in varchar2)
    return varchar2
    as
      match_count number;
    begin
      select count(*)
        into match_count
        from bankcustomer
        where username=x
        and passwd=y;
      if match_count = 0 then
        return 'Wrong username or password!';
      elsif match_count = 1 then
        return 'Login successful!';
      else
        return 'Too many matches, this should never happen!';
      end if;
    end;
    /

    Además de su llamada a la función no proporcionar el nombre de usuario y la contraseña de parámetros, es por eso que usted obtiene un mensaje de error. Suponiendo que usted ha cambiado la función a la realidad devolver algo, usted necesita usar

    SELECT log_in('username', 'secretpassword') FROM dual;
    • Muchas gracias por su ayuda! Realmente me ayudó a comprender la totalidad de la cosa (un plus para la explicación sobre el por qué no es necesario el uso de dbms_output).
  2. 0

    Ha hecho pasar argumentos a la log_in función? Y lo que es logga_in()? Es el último de un error tipográfico de su lado?

    De todos modos, el select 1 into z sólo de las fuerzas de una excepción en el caso de que no se encuentra ninguna coincidencia. Nada más.

    En otras palabras, puede escribir el código de sin, por ejemplo, con select count(*) into authenticated ... y, a continuación, se puede comprobar if authenticated != 0 y hacer la acción apropiada. No tengo una instancia de Oracle de forma que este código está escrito a ciegas, tendrás que probar:

    create or replace function log_in(x in varchar2, y in varchar2)
    return varchar2
    as
      match_count number;
    begin
      select count(*)
        into match_count
        from bankcustomer
        where username=x
        and passwd=y;
      if match_count = 0 then
        dbms_output.put_line('Wrong username or password!');
      elsif match_count = 1 then
        dbms_output.put_line('Login successful!');
      else
        dbms_output.put_line('Too many matches, this should never happen!');
    end;
    • Usted ned para pasar un nombre de usuario y una contraseña para la función. Como SELECT log_in('Posidon', 'FooBarPassword') from dual.
    • Borrado mi respuesta por error.. Ok, ahora entiendo lo que quieres decir. Voy a intentarlo mañana 🙂 yo estaría muy agradecido si usted podría enseñarme la solución con el ejemplo y con la select count(*) into authenticated y la verificación if authenticated !=0. ¿Qué debo retuercen en lugar de as z number muchas Gracias por su ayuda!
    • Hay que ir…
  3. 0

    Sólo para añadir más información a lo que ya se ha proporcionado, el BEGIN palabra clave indica el comienzo de la ejecución del bloque; lo de arriba que es el encabezado de la función y cualquier declaración de declaraciones.

    La declaración z número; es una declaración de variables declaración de la declaración de una variable que se denomina z y es el tipo de datos número. El SELECT 1 INTO z WHERE... declaración es la comprobación de la BANKCUSTOMER tabla de una fila donde el nombre de usuario coincide con lo que se pasa a la función en el primer parámetro, y una contraseña que coincida con lo que se pasa a la función en el segundo parámetro.

    Si hay una fila donde el nombre de usuario y la contraseña coinciden con lo que se pasa a la función, entonces la variable z contendrá el número 1. Si no la hay, el Oracle NO_ROWS_FOUND exception se han planteado, porque SELECT...INTO declaraciones siempre debe seleccionar una y sólo una fila, o de lo contrario se producirá una excepción (la NO_ROWS_FOUND exception sin filas, y la TOO_MANY_ROWS exception para más de una fila).

    Espero que útil! No dude en preguntar si tiene más preguntas.

Dejar respuesta

Please enter your comment!
Please enter your name here