Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

saber si el registro existe

Estas en el tema de saber si el registro existe en el foro de Oracle en Foros del Web. Caballeros, buenas tardes, estoy tratando de validar si un usuario existe en la base antes de insertarlo. Pero no eh dado con el codigo correcto. ...
  #1 (permalink)  
Antiguo 27/09/2012, 12:29
 
Fecha de Ingreso: abril-2012
Mensajes: 65
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta saber si el registro existe

Caballeros, buenas tardes, estoy tratando de validar si un usuario existe en la base antes de insertarlo.

Pero no eh dado con el codigo correcto.

Código SQL:
Ver original
  1. PROCEDURE P_VALIDAUSER       (  PO_EXISTE           OUT NUMBER,
  2.                                 PI_USRSYS_ALIAS     IN VARCHAR2,
  3.                                
  4.                                 PO_SW               OUT NUMBER,
  5.                                 PO_TEXTERR          OUT VARCHAR2)IS
  6.  vl_valor NUMBER;
  7. BEGIN
  8.  
  9.      BEGIN
  10.                                 --OPEN PO_VALIDAUSER FOR
  11.                                     --  VALIDA ID Usuarios del sistema
  12.                                  
  13.                                   SELECT COUNT(*)
  14.                                   INTO vl_valor
  15.                                   FROM TCARVIG_USRSYS
  16.                                   WHERE USRSYS_ID = "PI_USRSYS_ALIAS";
  17.  
  18.                                   IF vl_valor > 0 THEN --el registro existe
  19.                                     PO_EXISTE:= 1;
  20.                                   END IF;
  21.                                  
  22.                                
  23.      END;
  24.  END;

Código PHP:
$sql="BEGIN pk_carvig_user.p_validauser('".$idf_usuario."'"
                                                     
.",:po_existe); END;";
                            
$stmt OCIParse($conexion->conecta,$sql);
                            
OCIBindByName($stmt,":po_existe",$po_existe,256);
ociexecute($stmt);
ociexecute($po_existe);

if(
$po_existe == '1'){

echo 
"esta duplicado"
Me arroja este errror

Cita:
Warning: ociexecute() [function.ociexecute]: ORA-06550: línea 1, columna 7: PLS-00306: número o tipos de argumentos erróneos al llamar a 'P_VALIDAUSER' ORA-06550: línea 1, columna 7: PL/SQL: Statement ignored in C:\AppServ\www\registro\registro.php on line 237

Warning: ociexecute() expects parameter 1 to be resource, null given in C:\AppServ\www\registro\registro.php on line 238
Alguien?
  #2 (permalink)  
Antiguo 27/09/2012, 13:03
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: saber si el registro existe

número o tipos de argumentos erróneos al llamar a 'P_VALIDAUSER'
El error es claro. El procedimiento tiene 1 variable de entrada y 3 de salida.
Desde php solo envias 2.

Por otro lado, en el procedimiento no debes poner entre comillas el parámetro de entrada.
Debe ser así:
Código SQL:
Ver original
  1. SELECT COUNT(1)
  2. INTO vl_valor
  3. FROM TCARVIG_USRSYS
  4. WHERE USRSYS_ID = PI_USRSYS_ALIAS;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 27/09/2012, 13:27
 
Fecha de Ingreso: abril-2012
Mensajes: 65
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: saber si el registro existe

Arregle lo que decias:

Código PHP:
$sql="BEGIN pk_carvig_user.p_validauser('".$idf_usuario."'"
                                                     
.",:po_sw, :po_texterr, :po_existe); END;";
                            
                            
$stmt OCIParse($conexion->conecta,$sql);
                            
OCIBindByName($stmt,":po_texterr",&$po_texterr,256);
                            
OCIBindByName($stmt,":po_sw",&$po_sw,256);
                            
OCIBindByName($stmt,":po_existe",$po_existe,256);
                            
ociexecute($stmt);
                            
ociexecute($po_existe);

if(
$po_existe == '1'){

echo 
"esta duplicado";



Código SQL:
Ver original
  1. PROCEDURE P_VALIDAUSER       (  PO_EXISTE           OUT NUMBER,
  2.                                 PI_USRSYS_ALIAS     IN VARCHAR2,
  3.                                
  4.                                 PO_SW               OUT NUMBER,
  5.                                 PO_TEXTERR          OUT VARCHAR2)IS
  6.  vl_valor NUMBER;
  7. BEGIN
  8.  
  9.      BEGIN
  10.                                 --OPEN PO_VALIDAUSER FOR
  11.                                     --  VALIDA ID Usuarios del sistema
  12.                                  
  13.                                     SELECT COUNT(1)
  14.                                     INTO vl_valor
  15.                                     FROM TCARVIG_USRSYS
  16.                                     WHERE USRSYS_ID = PI_USRSYS_ALIAS;
  17.  
  18.                                   IF vl_valor > 0 THEN --el registro existe
  19.                                     PO_EXISTE:= 1;
  20.                                   END IF;
  21.                                  
  22.                                
  23.      END;
  24.  END;

Ahora me da el siguiente error

Cita:
Warning: ociexecute() [function.ociexecute]: ORA-06550: línea 1, columna 22: PLS-00302: el componente 'P_VALIDAUSER' se debe declarar ORA-06550: línea 1, columna 7: PL/SQL: Statement ignored in C:\AppServ\www\registro\registro.php on line 226

Warning: ociexecute() expects parameter 1 to be resource, null given in C:\AppServ\www\registro\registro.php on line 227
  #4 (permalink)  
Antiguo 27/09/2012, 13:38
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: saber si el registro existe

El error indica que el procedimiento no está declarado o posiblemnete te falte algún permiso.

Sin emabargo, la forma como lo llamas está en desorden. Envias el usuario en el primer parametro y en el procedimiento está en el segundo. para que el orden no afecte debes referenciar los campos de entrada, de lo contrario debes ingresar en el orden indicado los campos al procedimiento.

Revisalo, pruebalo y si después de un rato sigue sin funcionarte nos cuentas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 27/09/2012, 13:47
 
Fecha de Ingreso: abril-2012
Mensajes: 65
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: saber si el registro existe

Cita:
Iniciado por huesos52 Ver Mensaje
El error indica que el procedimiento no está declarado o posiblemnete te falte algún permiso.

Sin emabargo, la forma como lo llamas está en desorden. Envias el usuario en el primer parametro y en el procedimiento está en el segundo. para que el orden no afecte debes referenciar los campos de entrada, de lo contrario debes ingresar en el orden indicado los campos al procedimiento.

Revisalo, pruebalo y si después de un rato sigue sin funcionarte nos cuentas.

saludos
Ordenado, mismo error lamentablemente:

Código MySQL:
Ver original
  1. PROCEDURE P_VALIDAUSER       (  
  2. PI_USRSYS_ALIAS     IN VARCHAR2,                                
  3.                                 PO_SW               OUT NUMBER,
  4.                                 PO_TEXTERR          OUT VARCHAR2,
  5.                                 PO_EXISTE           OUT NUMBER)IS
  6.  vl_valor number;
  7.  
  8.      BEGIN
  9.                                 --OPEN PO_VALIDAUSER FOR
  10.                                 --VALIDA ID Usuarios del sistema
  11.                                  
  12.                                     SELECT count(1)
  13.                                     INTO vl_valor
  14.                                     FROM TCARVIG_USRSYS
  15.                                     WHERE USRSYS_ID = PI_USRSYS_ALIAS;
  16.  
  17.                                   If vl_valor > 0 then --el registro existe
  18.                                     PO_EXISTE:= 1;
  19.                                   end if;
  20.                                  
  21.                                
  22.      END;
  23.  END;

Código PHP:
$sql="BEGIN pk_carvig_user.p_validauser(
'"
.$idf_usuario."'".",
:po_sw, 
:po_texterr, 
:po_existe); END;"
;
                            
                            
$stmt OCIParse($conexion->conecta,$sql);
                            
OCIBindByName($stmt,":po_sw",&$po_sw,256);
                            
OCIBindByName($stmt,":po_texterr",&$po_texterr,256);                            
                            
OCIBindByName($stmt,":po_existe",$po_existe,256);
                            
                            
ociexecute($stmt);
                            
ociexecute($po_existe); 
Cita:
Warning: ociexecute() [function.ociexecute]: ORA-01722: número no válido ORA-06512: en "USR_GESTION_FIS.PK_CARVIG_USER", línea 62 ORA-06512: en línea 1 in C:\AppServ\www\registro\registro.php on line 226

Warning: ociexecute() expects parameter 1 to be resource, null given in C:\AppServ\www\registro\registro.php on line 227
  #6 (permalink)  
Antiguo 27/09/2012, 13:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: saber si el registro existe

Ese no es el mismo error.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 02/10/2012, 01:00
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: saber si el registro existe

Revisa esto.

WHERE USRSYS_ID = PI_USRSYS_ALIAS

por el nombre me dá que USRSYS_ID es un number y PI_USRSYS_ALIAS es un char
  #8 (permalink)  
Antiguo 02/10/2012, 05:39
 
Fecha de Ingreso: abril-2012
Mensajes: 65
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: saber si el registro existe

Gracias!, ya lo habia arreglado y tengo funcionando hace dias.

Saludos.
  #9 (permalink)  
Antiguo 02/10/2012, 06:39
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: saber si el registro existe

Ah, pues enhorabuena, ¿ cual era el problema ?

Por cierto, si al arreglarlo lo hubieras puesto, pues no habría estado devanandome la sesera para intentar echarte una mano.
  #10 (permalink)  
Antiguo 07/10/2012, 21:33
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: saber si el registro existe

Cita:
Caballeros, buenas tardes, estoy tratando de validar si un usuario existe en la base antes de insertarlo.
No se recomienda hacer un SELECT para validar si existe el usuario, ya que es una operación innecesaria y además puede dar falsos negativos en casos de transacciones simultaneas, es decir, si una transacción inserta el usuario y otra transacción hace el SELECT antes del commit de la primera.

Utilizando un índice unique y las excepciones de PL/SQL puedes optimizar el tiempo y simplificar el código del proceso, por ejemplo:

Código SQL:
Ver original
  1. CREATE TABLE usuarios (user_id varchar2, password varchar2)
  2. /
  3. CREATE UNIQUE INDEX idx_usuarios ON usuarios(user_id)
  4. /
  5. CREATE OR REPLACE PROCEDURE insertar_usuario
  6. ( user_id varchar2,
  7.   password varchar2,
  8.   existe OUT NUMBER
  9. ) IS
  10. BEGIN
  11.  existe := 0;
  12.  INSERT INTO usuarios (user_id, password);
  13.  exception
  14.       WHEN others THEN
  15.          IF sqlcode = 'ORA-00001' THEN --código ORA por valor duplicado
  16.           existe := 1;
  17.          END IF;
  18. END;
  19. /
De esta manera, con una única operación INSERT puedes validar e insertar el usuario.

Saludos

Última edición por gnzsoloyo; 08/10/2012 a las 20:34

Etiquetas: registro, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:46.